的sprintf()对战的mysql_query()
-
26-09-2019 - |
题
格式时遇到问题我的代码使用的sprintf()当我运行代码,我得到这个错误没有错误执行:解析错误:语法错误,意想不到的T_VARIABLE在/上线16的位置
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = '$q'', $tablename);
以上是在我的代码线16。我假设它是语法相关。
我现在接收以下错误:
致命错误:未捕获的异常“PDOException”与消息“SQLSTATE [42000]:语法错误或访问冲突:1065查询是空”在/home/content/63/6563663/html/inventory/pg.php:19堆栈迹:#0 /home/content/63/6563663/html/inventory/pg.php(19):PDOStatement->执行()#1 {主}抛出在/ home /内容/6563663分之63/ HTML /库存/第19行pg.php
这是我的整个代码块:
<?php
$u=$_GET["u"];
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form2")) {
$amount = isset($_POST['amount']) ? $_POST['amount'] : null;
if (null != $amount) {
$user = 'username';
$pass = 'password';
$pdo = new PDO('mysql:localhost', $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
session_start();
$tablename = $_SESSION['MM_Username'];
$query = sprintf('UPDATE %s SET stock= :amount WHERE itemname= '.$u, $tablename);
$stmt = $pdo->prepare($UpdateQuery);
$stmt->bindParam('amount', $amount);
$stmt->execute();
}
}
?>
感谢您,似乎我的错误是处理PDO的执行,而不是查询本身。如果任何人有任何的想法将是巨大的。艾伦,我用你的报价方法,并通过我运行mysql_real_escape_string查询()。
没有正确的解决方案
其他提示
请不要建立SQL查询的变量了。使用绑定变量。
尝试这种情况:
$query = sprintf('UPDATE
%sSET
stock= :amount WHERE
itemname= '.$q, $tablename);
您需要把字符串和变量之间的连接运算符将它们组合在一起。您也可以''
后摆脱$q
的,因为它完全不改变的字符串。
编辑:
我相信我误解你正在尝试做的。尝试这个代替:
$query = sprintf("UPDATE
%sSET
stock= :amount WHERE
itemname= '$q'", $tablename);
通过改变你的PHP字符串是双引号内,你不需要逃避你的单引号和$ Q将扩大到它的价值。
此外,还要确保在运行$ q和通过mysql_real_escape_string()
$表名,以防止SQL注入。
像这样:
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);
或
$query = sprintf("UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'", $tablename);
您不能在由'
分隔字符串转义'
s。无论在字符串转义"
s分隔的"
。为了逃避字符串分隔符,你需要预先设置一个\
字符。