Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无效参数编号:绑定变量的数量与使用pdo的令牌数量不匹配_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 无效参数编号:绑定变量的数量与使用pdo的令牌数量不匹配

Php 无效参数编号:绑定变量的数量与使用pdo的令牌数量不匹配,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,这个问题把我彻底难住了,我已经查看了关于堆栈溢出的其他回答问题,但没有一个回答我的问题 ** 代码: ** 在我的sql查询中。我这样做的原因是因为目前我只需要sql表中的一行 感谢您的帮助:)。另外,不管是谁投票否决了我,都不应该有特权投票否决任何人。我很清楚地提出了我的问题。我的php代码有点粗略,但是如果你因为这个原因投票否决我,这会适得其反,并且可能会阻止新用户在这个网站上发布问题。如果新用户不来,那么你将输给其他竞争对手。感谢所有提供帮助的人。占位符只能在查询中表示值。永远不要使用字

这个问题把我彻底难住了,我已经查看了关于堆栈溢出的其他回答问题,但没有一个回答我的问题

**

代码: **

在我的sql查询中。我这样做的原因是因为目前我只需要sql表中的一行



感谢您的帮助:)。另外,不管是谁投票否决了我,都不应该有特权投票否决任何人。我很清楚地提出了我的问题。我的php代码有点粗略,但是如果你因为这个原因投票否决我,这会适得其反,并且可能会阻止新用户在这个网站上发布问题。如果新用户不来,那么你将输给其他竞争对手。感谢所有提供帮助的人。

占位符只能在查询中表示值。永远不要使用字段/表名或其他SQL关键字

UPDATE :pcid SET :count = ':token' WHERE ID='1'
       ^^^^^--field         ^^^^^^--value
                  ^^^^^--field
如果要动态插入表/字段名,则必须使用良好的旧sql注入技术,如

$table = $source_of_pcid
$field = $source_of_count
$sql = "UPDATE $table SET $field = :token";

首先,PDO和mysql并不混合在一起

删除mysql\u real\u escape\u字符串

删除此
$count=':token'
周围的引号,将其理解为
$count=:token
(占位符周围不能有引号)

在更新中,您必须在您的
$pcid
周围加上回勾,并结合我在评论和回答中的其他建议

$pcid = $_POST['ID'];
...
$stmt = $dbh->prepare("UPDATE `$pcid` SET `$countNew` = :token WHERE ID='1'");
...

根据您的一条评论,这是一条错误消息:

MySQL服务器版本,以便在“888 SET 00:00=”:token“WHERE ID='1''第1行”附近使用正确的语法

看看错误告诉你的是什么,
靠近888
,这些错误不会就此停止

表名不能以数字开头或包含数字

根据文件:

标识符可以以数字开头,但除非引用,否则不能仅由数字组成


经验法则:如果将占位符替换为文字字符串
'hello'
或数字
42
,此查询是否有效?如果没有,则不能在此处使用占位符。(请记住,字符串
'hello'
与标识符(表名、列名、索引名等)完全不同。)。您不能为表名(
:pcid
)/列名(
:count
)使用占位符,也不需要在
:token
周围加上明确的引号(根据您的编辑):首先,您混合了两种类型的API,PDO和
mysql\uuu
,就像在
mysql\u real\u escape\u string
中一样-您不能混合这两种类型。添加
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)打开连接后立即将错误报告添加到文件顶部。打开连接后立即将错误报告添加到文件顶部
谢谢,我的sql语法中的问题很明显:不客气。更改
$pcid=mysql\u real\u escape\u字符串($\u POST['ID'])
只需
$pcid=$\u POST['ID']countDataToHour()
的函数,我们不知道它的作用。我建议您在PHP.net上浏览一下,然后开始一步一步地构建代码。确保您的数据库连接也是PDO,而不是mysql。编写代码时,错误报告是一个很有价值的工具。我将重新打开你的问题,但如果它因为其他原因关闭,它将超出我的控制。由于某些原因,我上次编辑只保存了一半。问题是我没有将$count转换为sql表中定义的值(这是我忘记添加的countDataToHour()位)。我已将代码编辑为新格式。但是仍然有一个错误:MySQL服务器版本的正确语法使用接近“888 SET 00:00=”:token“WHERE ID='1''在第1行”谢谢,我将使用您的技术恢复到使用反sql注入技术,并返回给您结果。但是,我将要吃晚饭,所以可能需要一段时间。好的,我已经更新了代码,我的浏览器在那里不再定义错误,但它仍然无法执行查询。如何失败?您收到“执行查询失败”消息了吗?检查
$dbh->errorInfo()
以查看实际有用的消息。
$table = $source_of_pcid
$field = $source_of_count
$sql = "UPDATE $table SET $field = :token";
$pcid = $_POST['ID'];
...
$stmt = $dbh->prepare("UPDATE `$pcid` SET `$countNew` = :token WHERE ID='1'");
...