我正在为一个类做一个简单的小项目——一个模拟数据库(使用phpMyAdmin构建),附带一个用于用户输入的web应用程序,以允许搜索/附加/更新所述数据库。搜索和Appending运行得很好,但更新让我很难过。
我设置了错误消息来显示,以帮助调试过程,尽管它们已针对该项目中以前的问题弹出,但尚未针对该特定问题显示。
我的代码如下:
$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拼写错误,但此时此刻,我已经盯着它看了很长时间,我可以用一双全新的眼睛了!为什么当我尝试回显$sth时,没有显示sql语句?如果能从这个优秀的社区获得任何见解,我们将不胜感激。
您需要学习基本的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 . "';";
- 您的查询中不需要
;
。您不在交互式会话中 - 您要接受SQL注入
- 不需要参数化查询的报价
这里有一个建议你可以怎么做。
$query = "UPDATE adjunct_number SET FIRSTNAME = ? WHERE 700NUMBER = ?";
$sth = $db->prepare($query);
$sth->execute( array( $updateInformation, $updateCriteria ) );
您有混合的单引号和双引号。将其更新为以下内容:
$sth = "UPDATE adjunct_number
SET FIRSTNAME = ".$updateInformation."
WHERE 700NUMBER = ".$updateCriteria.";
您可以尝试使用符号("`")来表示列名和表
UPDATE `adjunct_number`
SET `FIRSTNAME` = 'DREW'
WHERE `700NUMBER` = 700482306