MySQL/PHP UPDATE 查询不起作用

Posted

技术标签:

【中文标题】MySQL/PHP UPDATE 查询不起作用【英文标题】:MySQL/PHP UPDATE query not working 【发布时间】:2017-08-10 10:13:52 【问题描述】:

在问这个问题之前,我在很多地方(包括这里)寻找答案,但我拼命问。

我有以下几点:

edit.php

<?php
    if($_SERVER['REQUEST_METHOD'] == "POST")
    
        include("lib/functions.php");
        mysql_connect("localhost","root","") or die(mysql_error()); //Connect to server
        mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //Connect to database
        $nombreCalle = mysql_escape_string($_POST["nombreCalle"]);
        $numeroCasa = mysql_escape_string($_POST["numeroCasa"]);
        $precio = mysql_escape_string($_POST["precio"]);

        $sql = "UPDATE propiedades SET nombreCalle='$nombreCalle', numeroCasa='$numeroCasa', precio='$precio' WHERE id='$id'";
        executesql($sql);
        header("location: index.php");
    
?>
<html>
    <head>
        <title>Proyecto Inmobiliaria - Editar</title>
    </head>
    <body>
    <h2>Editar Propiedad</h2>
    <?php
    if(!empty($_GET["id"]))
      
        $id = $_GET["id"];
        $_SESSION["id"] = $id;
                include("lib/functions.php");
        mysql_connect("localhost","root","") or die(mysql_error()); //Connect to server
        mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //connect to database
                $sql = "SELECT * FROM propiedades WHERE id='$id'";
                $output = executesql($sql);
        $row = mysql_fetch_array($output);
        Print "<form class='' action='' method='POST'>";
          Print "<div class=''>";
            Print "<label>Nombre Calle</label>";
            Print "<input type='text' name='nombreCalle' value='".$row["nombreCalle"]."' placeholder='ej: Antonio del Viso'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Número de Casa</label>";
            Print "<input type='text' name='numeroCasa' value='".$row["numeroCasa"]."' placeholder='ej: 440'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Precio</label>";
            Print "<input type='text' name='precio' value='".$row["precio"]."' placeholder='ej: 150000'>";
          Print "</div>";
          Print "<button type='submit' name='add'>Guardar</button>";
          Print "<a href='index.php' style='display:inline-block;border:2px solid #000;border-radius:25%;padding:10px;margin:10px;'>Regresar</a>";
        Print "</form>";
      
    ?>
        <br/>
    </body>
</html>

lib/functions.php

<?php
  function executesql($sql) 
    $test = substr($sql,0,6);
    if($test == "INSERT" || $test == "insert" || $test == "Insert") 
      return mysql_query($sql);
     elseif ($test == "UPDATE" || $test == "update" || $test == "Update") 
      return mysql_query($sql);
     elseif ($test == "SELECT" || $test == "select" || $test == "Select") 
      return mysql_query($sql);
     elseif ($test == "DELETE" || $test == "delete" || $test == "Delete") 
      return mysql_query($sql);
     else 
      $var = "echo '<script>alert('This is not a valid query')</script>'";
    
    return $var;
  
?>

这个东西(连同其他用于添加、删除和插入数据的文件)在这个配置下工作得很好:

Apache Web 服务器版本 2.2.4 PHP 脚本语言版本 5.2.3 MySQL 数据库版本 5.0.45 phpMyAdmin 数据库管理器版本 2.10.2

现在,我无缘无故地决定升级到以下版本:

Apache Web 服务器版本 2.4.25 PHP 脚本语言版本 5.6.30 和 7.1.1 MySQL 数据库版本 5.7.17 phpMyAdmin 数据库管理器版本 4.6.6

而且 BOOM!,只有 UPDATE 查询根本不工作(其他脚本/查询工作正常)。

我尝试查看任何错误或警告,但它只是命中了标头语句并重定向到 index.php,但没有执行 UPDATE 查询。

我查看从 5.2.3 到 5.3.10 的 PHP 版本日志更改,以防万一有什么问题,但没有运气。

然后我尝试以下配置,结果与上面相同:

Apache Web 服务器版本 2.2.22 PHP 脚本语言版本 5.3.10 MySQL 数据库版本 5.5.54 phpMyAdmin 数据库管理器版本 3.4.10

还有这个:

Apache Web 服务器版本 2.4.25 PHP 脚本语言版本 5.6.30 MariaDB 10.1.21 phpMyAdmin 数据库管理器版本 4.6.5.2

从所有这些来看,我认为 Apache、PMA 和 PHP 与我遇到的这个问题无关,所以到目前为止我的赢家是 MySQL。但是……

这里真正的问题应该是什么? 我是否在查询中遗漏了什么? 我可以在我的代码中尝试不同的东西吗? 真的是 MySQL 中的某些东西不喜欢我的查询语法吗?

任何帮助,光,向导,视线,任何对这里有帮助的东西。

一如既往的感谢!

【问题讨论】:

你为什么还要拥有executesql() 函数呢?它添加了一个实际上不做任何事情的抽象层。只需执行 SQL 命令,并使用单一一致的 MySQL API 执行此操作。 @David 为什么你标记为重复?。即使我按原样执行查询,它也不起作用。 “使用单一一致的 MySQL API”是什么意思?我可能会澄清这是一个旧项目,并且以我升级设置的方式,我发现这是我关心的问题:“为什么更改 MySQL 版本(我认为)会破坏一些东西”。 因为它是重复的,并且因为您正在混合 MySQL API。 INSERTSELECTDELETE 查询之所以有效,是因为它们使用 mysql_query()UPDATE 查询不起作用,因为它使用了mysqli_query()(并且使用不正确,因为它需要两个参数)。代码中很可能还有其他问题,但这似乎是UPDATE 查询“不起作用”的主要原因。您在安装不同版本的依赖项方面所做的所有工作都是错位的努力,MySQL API 的混合不适用于任何版本。 现在我明白你为什么说“它是重复的”了。我要编辑它,因为你让我在那里。更改设置时,所有语句都使用mysql_query(),这是我正在测试迁移到mysqli_query()的一些旧代码。 此时,您是否真的确定您显示的代码是说明问题的代码?它混淆的事实似乎表明您很可能忽略了某些东西。除了对不同版本的事物进行测试之外,您还可以针对该问题提供什么样的调试?您似乎从未检查过mysql_error()。正在执行的查询是什么?它是如何失败的? 【参考方案1】:

解决此问题的第一步是将您发送到 mysql 对象的确切 UPDATE 查询输出。

我还建议从 PHP MySQL 切换到 PHP MySQLi(更新):http://php.net/manual/en/book.mysqli.php

解决这个问题的方法是回显“query: $query”,然后将确切的查询粘贴到 MySQL 数据库资源管理器(MySQL Workbench、Navicat、DataGrip 等)中。

Database Explorer 的 Query Execution 选项卡会告诉您查询的错误是什么(是语法、不推荐使用的东西等)

希望这会有所帮助。

【讨论】:

我会试试这个。老实说,这并没有出现在我的脑海中,因为我对这些东西还很陌生。非常感谢,我会给你回复结果:)【参考方案2】:

在尝试了mysql_error() 和其他东西之后,我设法让它工作(在某种程度上)。

对于 PHP >= 5.3(基于我测试的所有设置)我只是更改了代码的顺序,瞧,它就像一个魅力。

这是 edit.php 更改之前(不适用于 PHP >= 5.3):

<?php
    if($_SERVER['REQUEST_METHOD'] == "POST")
    
        include("lib/functions.php");
        mysql_connect("localhost","root","") or die(mysql_error()); //Connect to server
        mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //Connect to database
        $nombreCalle = mysql_escape_string($_POST["nombreCalle"]);
        $numeroCasa = mysql_escape_string($_POST["numeroCasa"]);
        $precio = mysql_escape_string($_POST["precio"]);

        $sql = "UPDATE propiedades SET nombreCalle='$nombreCalle', numeroCasa='$numeroCasa', precio='$precio' WHERE id='$id'";
        executesql($sql);
        header("location: index.php");
    
?>
<html>
    <head>
        <title>Proyecto Inmobiliaria - Editar</title>
    </head>
    <body>
    <h2>Editar Propiedad</h2>
    <?php
    if(!empty($_GET["id"]))
      
        $id = $_GET["id"];
        $_SESSION["id"] = $id;
                include("lib/functions.php");
        mysql_connect("localhost","root","") or die(mysql_error()); //Connect to server
        mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //connect to database
                $sql = "SELECT * FROM propiedades WHERE id='$id'";
                $output = executesql($sql);
        $row = mysql_fetch_array($output);
        Print "<form class='' action='' method='POST'>";
          Print "<div class=''>";
            Print "<label>Nombre Calle</label>";
            Print "<input type='text' name='nombreCalle' value='".$row["nombreCalle"]."' placeholder='ej: Antonio del Viso'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Número de Casa</label>";
            Print "<input type='text' name='numeroCasa' value='".$row["numeroCasa"]."' placeholder='ej: 440'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Precio</label>";
            Print "<input type='text' name='precio' value='".$row["precio"]."' placeholder='ej: 150000'>";
          Print "</div>";
          Print "<button type='submit' name='add'>Guardar</button>";
          Print "<a href='index.php' style='display:inline-block;border:2px solid #000;border-radius:25%;padding:10px;margin:10px;'>Regresar</a>";
        Print "</form>";
      
    ?>
        <br/>
    </body>
</html>

这是 edit.php 修改后的:

<html>
    <head>
        <title>Proyecto Inmobiliaria - Editar</title>
    </head>
    <body>
    <h2>Editar Propiedad</h2>
    <?php
    if(!empty($_GET["id"]))
      
        $id = $_GET["id"];
        $_SESSION["id"] = $id;
                include("lib/functions.php");
        mysql_connect("localhost","root","root") or die(mysql_error()); //Connect to server
        mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //connect to database
                $sql = "SELECT * FROM propiedades WHERE id='$id'";
                $output = executesql($sql);
        $row = mysql_fetch_array($output);
        Print "<form class='' action='' method='POST'>";
          Print "<div class=''>";
            Print "<label>Nombre Calle</label>";
            Print "<input type='text' name='nombreCalle' value='".$row["nombreCalle"]."' placeholder='ej: Antonio del Viso'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Número de Casa</label>";
            Print "<input type='text' name='numeroCasa' value='".$row["numeroCasa"]."' placeholder='ej: 440'>";
          Print "</div>";
          Print "<div class=''>";
            Print "<label for=''>Precio</label>";
            Print "<input type='text' name='precio' value='".$row["precio"]."' placeholder='ej: 150000'>";
          Print "</div>";
          Print "<button type='SUBMIT' name='add'>Guardar</button>";
          Print "<a href='index.php' style='display:inline-block;border:2px solid #000;border-radius:25%;padding:10px;margin:10px;'>Regresar</a>";
        Print "</form>";
      

        if($_SERVER['REQUEST_METHOD'] == 'POST')
            
                mysql_connect("localhost","root","root") or die(mysql_error()); //Connect to server
                mysql_select_db("proyectoinmob") or die("Cannot connect to the selected database"); //Connect to database
                $nombreCalle = mysql_escape_string($_POST["nombreCalle"]);
                $numeroCasa = mysql_escape_string($_POST["numeroCasa"]);
                $precio = mysql_escape_string($_POST["precio"]);
                $sql = "UPDATE propiedades SET nombreCalle='$nombreCalle', numeroCasa='$numeroCasa', precio='$precio' WHERE id='$id'";
                executesql($sql);
                header("location: index.php");
            
    ?>
        <br/>
    </body>
</html>

但后来我回到 PHP header() 函数而坏了。我使用原始文件修复了它(快速修复)。

我知道我可以修改脚本,这样我就可以摆脱header() 的问题,但这是另一回事了。

我根本不认为这是一个“解决方案”,但它很好用于此目的。

别担心,对于更严肃的事情,我会至少改用 mysqli API 或 PDO

感谢大家的旅程!

【讨论】:

以上是关于MySQL/PHP UPDATE 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UPDATE sql 查询不起作用?不会更新表

SQL Update语句不起作用 - SQL Server

更新查询更新不起作用

查询计算有多少用户在线不起作用

在Phonegap项目中结合Ajax、Jquery、mysql、php不起作用

Oracle SQL - 多级相关子查询不起作用