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

时间:2014-09-15 19:02:55

标签: php mysql sql pdo

这个问题让我感到非常难过,我已经查看了有关堆栈溢出的其他已回答的问题,但没有人回答我的问题。

**

代码:

**

    function inputVCA(){
    global $dbh;
    $count = 0;
    if(isset($_POST['vca'])){
        $pcid = mysql_real_escape_string($_POST['ID']);
        $vca = $_POST['vca'];
        $tok = strtok($vca, ";");
        while($tok !== false){      
            $countNew = countDataToHour($count);
            $stmt = $dbh->prepare("UPDATE $pcid SET $countNew = :token WHERE ID='1'");
            $stmt -> bindParam(':token', $tok);
            echo "<br>".$pcid."<br>";
            echo countDataToHour($count)."<br>";
            echo $tok."<br>";
            if($stmt->execute()){
                // do nothing
            }else{
                die("failed to execute query");
            }
            $count++;
            $tok = strtok(";");
        }
    }
 }

**

输出(包括错误消息):

**

888 00:00 40

警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数与第170行中C:\ xampp \ htdocs \ practice \ src \ dataChecker.php中的标记数不匹配 无法执行查询

**

我对此问题了解多少?

**

这个问题让我如此困难的原因是因为当我测试变量等时,一切似乎都正确输出。无论如何:

  • 我在没有:变量的情况下测试了sql查询。这是有效的
  • 输出的变量是我在表格中输入的变量,所以我认为它不是问题

**

额外信息

**

我不确定的程序中的一点是:

WHERE ID='1'

在我的SQL查询中。我这样做的原因是因为我现在只需要在sql表中使用一行。


任何帮助表示赞赏,谢谢:)。同样作为旁注,任何投票给我的人都不应该有权投票给任何人。我非常清楚地表达了我的问题。我的PHP代码有点粗略,但如果你因为这个原因投票给我,这会产生反作用,可能会阻止新用户在这个网站上发布问题。如果新用户不来,那么输给其他竞争对手。感谢所有提供有益贡献的人。

2 个答案:

答案 0 :(得分:1)

首先,PDO和mysql_,这两个API不会混合在一起。

删除mysql_real_escape_string

删除此$count = ':token'周围的引号,读为$count = :token(占位符不能包含引号)。

你必须在更新中围绕$pcid添加反引号,并在我的评论和答案中结合我的其他建议。

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

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

  

MySQL服务器版本,在'888 SET 00:00 ='附近使用正确的语法:'第1行'''''''''''''''''

看看错误告诉你的是什么,near '888并且那些错误不会就此止步。

表名不能以数字开头或由数字组成。

根据文件:

  

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

答案 1 :(得分:0)

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

UPDATE :pcid SET :count = ':token' WHERE ID='1'
       ^^^^^--field         ^^^^^^--value
                  ^^^^^--field

如果要动态插入表/字段名称,则必须使用旧的sql-injection易受攻击的技术,如

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