我对以下内容感到不满。
您可以在下面看到的是动态构建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:绑定变量的数量与令牌的数量不匹配
我一直在阅读有关此问题的任何内容,但我无法查明问题。据我所见(但我可能是盲人),令牌的数量和变量的数量是相同的。
有什么想法吗?
答案 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)