【问题标题】:Basic SQL Update statement not working in PHP基本 SQL 更新语句在 PHP 中不起作用
【发布时间】:2015-11-26 03:41:25
【问题描述】:

我正在为一个类开发一个简单的小型项目 - 一个模拟数据库(使用 phpMyAdmin 构建),附带一个用于用户输入的 Web 应用程序,以允许搜索/附加/更新所述数据库。搜索和追加工作完美,但更新让我很伤心。

我设置了要显示的错误消息以帮助调试过程,尽管它们已针对此项目中的先前问题弹出,但并未针对此特定问题显示。

我的代码如下所示:

$sth = "UPDATE adjunct_number
        SET FIRSTNAME = '.$updateInformation.'
        WHERE 700NUMBER = '.$updateCriteria.';";

(I tried echoing $sth right here, nothing displayed!)

$sth = $db->prepare($sth);
$sth->execute();

$updateInformation 和 $updateCriteria 都成功地从 HTML 表单的文本框中拉出。 (我将在表单中输入 Drew 和 700123456 作为测试数据。)我测试了 $updateInformation 和 $updateCriteria 实际上是使用以下语句成功捕获的:

echo $updateInformation . ", " . $updateCriteria

产生以下输出:

Drew, 700123456

我先在phpMyAdmin中输入下面的查询来测试一下。

UPDATE adjunct_number
SET FIRSTNAME = 'DREW'
WHERE 700NUMBER = 700482306

它总是在 phpMyAdmin 中工作,正如预期的那样,100% 的时间......但是,当我通过 PHP 发送完全相同的更新命令时,它永远不会工作,这让我非常困惑。我唯一能想到的是我的 SQl 语句中被忽略的 PHP 拼写错误,但此时我已经盯着它看了很长时间,以至于我可以用一双新的眼睛!为什么我尝试 echo $sth 时没有显示 sql 语句?非常感谢这个精彩社区的任何见解。

【问题讨论】:

    标签: php sql pdo


    【解决方案1】:

    你需要学习基本的 PHP 字符串:

    $sth = "UPDATE adjunct_number
           ^---start of PHP string
            SET FIRSTNAME = '.$updateInformation.'
            WHERE 700NUMBER = '.$updateCriteria.';";
                                                  ^---end of PHP string
    

    这意味着您的查询正在执行... SET FIRSTNAME = '.foo.' ...,而. 字面上嵌入在查询中。这意味着您的 where 子句永远不会匹配任何记录。

    由于您使用" 作为引号,因此您根本不需要使用.

    $sth = "UPDATE adjunct_number
            SET FIRSTNAME = '$updateInformation'
            WHERE 700NUMBER = '$updateCriteria';";
    

    或者你应该先正确退出字符串:

    $sth = "UPDATE adjunct_number
            SET FIRSTNAME = '" . $updateInformation . "'
            WHERE 700NUMBER = '" . $updateCriteria . "';";
    

    【讨论】:

      【解决方案2】:
      • 您的查询中不需要;。您不在互动会话中
      • 您受到 SQL 注入的影响。
      • 参数化查询不需要引号。

      这里有一个建议,你可以怎么做。

      $query = "UPDATE adjunct_number SET FIRSTNAME = ? WHERE 700NUMBER = ?";
      $sth = $db->prepare($query);
      $sth->execute( array( $updateInformation, $updateCriteria ) );
      

      【讨论】:

      • 虽然您的回答很好,并且确实为他提供了一种正确格式化查询的方法,但它实际上并没有指出他最初这样做的方式存在问题,@marc-b 确实很好地描述了哪里出了问题,虽然有点令人困惑,但基本思想是,他实际上并没有离开原始字符串,所以他使用文字值“.$updateInformation”进行查询。和“.$updateCriteria。”
      【解决方案3】:

      您混合使用了单引号和双引号。将其更新为以下内容:

      $sth = "UPDATE adjunct_number
          SET FIRSTNAME = ".$updateInformation."
          WHERE 700NUMBER = ".$updateCriteria.";
      

      【讨论】:

        【解决方案4】:

        也许您可以尝试在列名和表格中使用符号 (" ` ") 反引号

        UPDATE `adjunct_number`
        SET `FIRSTNAME` = 'DREW'
        WHERE `700NUMBER` = 700482306
        

        【讨论】:

        • 为什么?反引号仅用于转义保留字。没有一个字段/表名是保留字,所以这基本上是没有意义的。
        • 不,我用 PHP 完成了一个项目,我必须使用反引号编写列名和表,否则它无法识别它们
        猜你喜欢
        • 1970-01-01
        • 2015-07-16
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多