PDO:参数号无效:绑定变量数与令牌数不匹配

时间:2014-05-13 17:23:06

标签: pdo token

我对以下内容感到不满。

您可以在下面看到的是动态构建INSERT及其BINDS的结果。列名称和标记正从表中提取。我事先不知道。所以我使用内置函数来了解它们是什么。价值通过表格发布给我。我使用关联数组将两者放在一起,我用它来构建INSERT命令。

数组如下所示:

Array
(
    [id] => 0
    [datum] => 1968-05-13 16:58:02
    [titel] => test 369
    [categorie] => catEGORIE
    [tekst] => tekst
    [zichtbaar_bijlage] => 1
    [zichtbaar_foto_1] => 1
    [zichtbaar_foto_2] => 1
    [zichtbaar_foto_3] => 1
    [zichtbaar_foto_4] => 1
    [zichtbaar_foto_5] => 1
    [zichtbaar_foto_6] => 1
    [zichtbaar_foto_7] => 1
    [zichtbaar_foto_8] => 1
    [zichtbaar_foto_9] => 1
    [zichtbaar_foto_10] => 1
    [bijlage] => verkeersbord.jpg
    [foto_1] => hummel.jpg
    [foto_2] => reinoutgerolf.jpg
    [foto_3] => hummel.jpg
    [foto_4] => verkeersbord.jpg
    [foto_5] => verkeersbord.jpg
    [foto_6] => 20140511vlaggen.jpg
    [foto_7] => verkeersbord.jpg
    [foto_8] => 20140511vlaggen.jpg
    [foto_9] => verkeersbord.jpg
    [foto_10] => 50-euro-1024x545.jpg
)

INSERT命令和BINDS的转储如下所示:

INSERT INTO some_DB.some_table (NIE_id, NIE_datum, NIE_titel, NIE_categorie, NIE_tekst, NIE_zichtbaar_bijlage, NIE_zichtbaar_foto_1, NIE_zichtbaar_foto_2, NIE_zichtbaar_foto_3, NIE_zichtbaar_foto_4, NIE_zichtbaar_foto_5, NIE_zichtbaar_foto_6, NIE_zichtbaar_foto_7, NIE_zichtbaar_foto_8, NIE_zichtbaar_foto_9, NIE_zichtbaar_foto_10, NIE_bijlage, NIE_foto_1, NIE_foto_2, NIE_foto_3, NIE_foto_4, NIE_foto_5, NIE_foto_6, NIE_foto_7, NIE_foto_8, NIE_foto_9, NIE_foto_10) VALUES (:id, :datum, :titel, :categorie, :tekst, :zichtbaar_bijlage, :zichtbaar_foto_1, :zichtbaar_foto_2, :zichtbaar_foto_3, :zichtbaar_foto_4, :zichtbaar_foto_5, :zichtbaar_foto_6, :zichtbaar_foto_7, :zichtbaar_foto_8, :zichtbaar_foto_9, :zichtbaar_foto_10, :bijlage, :foto_1, :foto_2, :foto_3, :foto_4, :foto_5, :foto_6, :foto_7, :foto_8, :foto_9, :foto_10)
$STH3->bindValue(':id', 0);
$STH3->bindValue(':datum', 1968-05-13 16:58:02);
$STH3->bindParam(':titel', test 369, PDO::PARAM_STR);
$STH3->bindParam(':categorie', catEGORIE, PDO::PARAM_STR);
$STH3->bindParam(':tekst', tekst, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_bijlage', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_1', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_2', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_3', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_4', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_5', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_6', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_7', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_8', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_9', 1, PDO::PARAM_STR);
$STH3->bindParam(':zichtbaar_foto_10', 1, PDO::PARAM_STR);
$STH3->bindParam(':bijlage', verkeersbord.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_1', hummel.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_2', reinoutgerolf.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_3', hummel.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_4', verkeersbord.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_5', verkeersbord.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_6', 20140511vlaggen.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_7', verkeersbord.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_8', 20140511vlaggen.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_9', verkeersbord.jpg, PDO::PARAM_STR);
$STH3->bindParam(':foto_10', 50-euro-1024x545.jpg, PDO::PARAM_STR);

INSERT命令由以下内容生成:

$command = "INSERT INTO $_SESSION[database].$table ($fields) VALUES ($arguments)";
            echo $command;
            $STH3 = $DBH->prepare($command);


            foreach($binds_array as $key => $value)
                {
                    if ($key == "id")
                        {
                            $STH3->bindValue(':id', 0);
                            echo "<br>--- STH3->bindValue(':id', 0);<br>";
                        }
                        elseif ($key == "datum")
                        {
                            $STH3->bindValue(':$key', $value);
                            echo "--- STH3->bindValue(':$key', $value);<br>";
                        }
                        else
                        {
                            $STH3->bindParam(':$key', $value, PDO::PARAM_STR);
                            echo "--- STH3->bindParam(':$key', $value, PDO::PARAM_STR);<br>";
                        };
                };

由于某种原因,这会导致错误:

  

警告:PDOStatement :: execute():SQLSTATE [HY093]:参数无效   number:绑定变量的数量与令牌的数量不匹配

我一直在阅读有关此问题的任何内容,但我无法查明问题。据我所见(但我可能是盲人),令牌的数量和变量的数量是相同的。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

鉴于我理解正确,代码的逻辑似乎很好。但是,您的代码中存在一个小问题,即bindValue s。

$STH3->bindValue(':$key', $value);$STH3->bindParam(':$key', $value, PDO::PARAM_STR);都遇到同样的问题:$key用单引号括起来,导致变量不被评估,但被解释为(作为字符串)。

对于要在PHP中计算的字符串中的变量,它们需要使用双引号,因此上面的两行代码必须变为$STH3->bindValue(":$key", $value);$STH3->bindParam(":$key", $value, PDO::PARAM_STR);

答案 1 :(得分:0)

@PLPeeters:你解决了部分问题。非常感谢!正如我在你的回答评论中所提到的,我更加缩短了代码以获得更大的灵活性。

foreach($binds_array as $key => $value)
    {
    $arguments[] .= ":$key";
    };
$arguments = implode(',',$arguments);

我删除了部分代码,这是默认代码以获取列并将它们放在$ fields中。

$command_add = "INSERT INTO some_database.some_table ($fields) VALUES ($arguments)";
$STH3 = $DBH->prepare($command_add);
$STH3->execute($binds_array)