sprintf()与mysql_query()

时间:2010-10-26 19:13:23

标签: php sql mysql printf mysql-error-1065

无法使用sprintf()格式化我的代码以便无错误地执行当我运行代码时出现此错误:解析错误:语法错误,第16行/位置的意外T_VARIABLE

 $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 {main}抛出/ home / content / 63/6563663 / html / inventory第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执行,而不是查询本身。如果有人有任何想法,那将是伟大的。 Alan,我使用你的方法作为引号,也通过mysql_real_escape_string()运行查询。

3 个答案:

答案 0 :(得分:3)

请不要使用变量构建SQL查询。使用绑定变量。

请参阅http://bobby-tables.com/php.html

答案 1 :(得分:0)

试试这个:

$query = sprintf('UPDATE%S SET {股票{1}} {ITEMNAME {1}}

您需要在字符串和变量之间放置一个连接运算符以将它们组合在一起。您也可以在= :amount WHERE之后删除= '.$q, $tablename);,因为它根本不会更改字符串。

编辑:

我相信我误解了你想要做的事情。试试这个:

''%S $q {股票{1}} {ITEMNAME {1}}

通过将PHP字符串更改为双引号,您无需转义单引号,$ q将扩展为其值。

另外,请确保通过$query = sprintf("UPDATE运行$ q和$ tablename以防止SQL注入。

答案 2 :(得分:0)

像这样:

$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);

$query = sprintf("UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'", $tablename);

您不能在'分隔的字符串中使用未转义的'。在由"分隔的字符串中未转义"个。要转义字符串分隔符,您需要添加\字符。