Php sprintf()与mysql_query()的比较
当我运行代码时,使用sprintf()格式化代码以无误执行时遇到问题,我得到以下错误:Parse error:syntax error,第16行的/location中出现意外的T_变量Php sprintf()与mysql_query()的比较,php,sql,mysql,printf,mysql-error-1065,Php,Sql,Mysql,Printf,Mysql Error 1065,当我运行代码时,使用sprintf()格式化代码以无误执行时遇到问题,我得到以下错误:Parse error:syntax error,第16行的/location中出现意外的T_变量 $query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = '$q'', $tablename); 上面是我代码中的第16行。我假设它与语法有关 我现在收到以下错误: 致命错误:未捕获异常“PDOException”,消息为“S
$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->execute()#1{main}在第19行输入/home/content/63/6563663/html/inventory/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\u real\u escape\u string()运行查询 试试这个:
$query=sprintf('UPDATE
%sSET
stock=:amount WHERE
itemname='。$q,$tablename)代码>
您需要在字符串和变量之间放置一个串联运算符,以便将它们组合在一起。您还可以在$q
之后去掉'
,因为它根本不会更改字符串
编辑:
我相信我误解了你的意图。请尝试以下方法:
$query=sprintf(“更新
%sSET
stock=:金额,其中
itemname=”$q',$tablename)代码>
通过将PHP字符串更改为双引号内,您不需要转义单引号,$q将扩展为其值
另外,请确保通过mysql\u real\u escape\u string()
运行$q和$tablename以防止SQL注入。尝试以下操作:
$query=sprintf('UPDATE
%sSET
stock=:amount WHERE
itemname='。$q,$tablename)代码>
您需要在字符串和变量之间放置一个串联运算符,以便将它们组合在一起。您还可以在$q
之后去掉'
,因为它根本不会更改字符串
编辑:
我相信我误解了你的意图。请尝试以下方法:
$query=sprintf(“更新
%sSET
stock=:金额,其中
itemname=”$q',$tablename)代码>
通过将PHP字符串更改为双引号内,您不需要转义单引号,$q将扩展为其值
另外,请确保通过mysql\u real\u escape\u string()
运行$q和$tablename,以防止SQL注入。类似于:
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);
或
您不能在由“
分隔的字符串中包含未转义的”
。未scaped的“
在字符串中,由”
分隔。要转义字符串分隔符,需要在前面加上一个\
字符。如下所示:
$query = sprintf('UPDATE `%s` SET `stock` = :amount WHERE `itemname` = \'$q\'', $tablename);
或
您不能在由“
分隔的字符串中包含未转义的”
。未scaped的“
在字符串中,由”
分隔。要转义字符串分隔符,需要在前面加上一个\
字符。请不要用变量生成SQL查询。使用绑定变量
请参见请不要用变量构建SQL查询。使用绑定变量
请参见您有一个语法错误:您需要转义单引号\'
$q
来自哪里?它是正确的mysql\u real\u escape\u string()
ed?$q只是我前面代码块中定义的一个简单字符串。我很想知道表名是否被反勾中的单引号括起来。您能否在执行之前更新问题以包含查询打印输出?叹气,$query!==$UpdateQuery
,在开发时启用通知以捕获那些讨厌的不存在的变量。您有一个语法错误:您需要转义单引号\'
$q
来自哪里?它是正确的mysql\u real\u escape\u string()
ed?$q只是我前面代码块中定义的一个简单字符串。我很想知道表名是否被反勾中的单引号括起来。您能否在执行之前更新问题以包含查询打印输出?叹气,$query!==$UpdateQuery
,在开发时启用通知以捕获那些讨厌的不存在的变量。