我见过很多人得到了错误SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
,但据我所知,没有任何问题对我有帮助或应用。我相信这是我的东西真的很愚蠢......“绑定变量的数量与令牌的数量不匹配” - 但它的确如此
当我呼应$ps
和$ps_val
(在我的db类和页面上),它们具有相同数量的值。我甚至可以回显SQL并计算占位符的拼写,并重复它们的拼写。我甚至进入phpMyAdmin,复制粘贴我的SQL,并复制粘贴所有占位符的值,并且工作,所以我知道它不是SQL语法。
$ps[] = ":category";
$ps_val[] = $_GET['cat'];
if (isset($_GET['color'])){
// resort_color converts hex color into comma delimited text colors
// e.g. resort_color("#000000") returns "black, black with white trim, etc."
$colors = resort_color($_GET['color']);
if (strpos($colors, ",") >= 0){
$colors = explode(",", $colors);
$i = 0;
foreach ($colors as $color){
$color = trim($color);
if ($i == 0){
$sql_color = " AND `Color` LIKE \"%:color{$i}%\"";
$ps[] = ":color{$i}";
$ps_val[] = $color;
} else {
$sql_color = $sql_color . " OR `Color` LIKE \"%:color{$i}%\"";
$ps[] = ":color{$i}";
$ps_val[] = $color;
}
$i++;
}
} else {
$sql_color = 'AND `Color` LIKE \"%:color%\"';
$ps[] = ":color";
$ps_val[] = $colors;
}
} else {
$sql_color = "";
}
$sql[] = 'SELECT * FROM `bullet_catalog` WHERE `Category` = :category ' . $sql_color;
$sql[] = 'SELECT * FROM `leeds_catalog` WHERE `Category` = :category ' . $sql_color;
$sql[] = 'SELECT * FROM `trimark_catalog` WHERE `Category` = :category ' . $sql_color;
if ($db->query_all($sql, $ps, $ps_val)){
$products = $db->query_all($sql, $ps, $ps_val);
} else {
$products = "";
}
而且我query_all
功能:
public function query_all($sql, $ps="", $ps_val=""){
if (!$sql){
return false;
} else {
foreach ($sql as $ind_sql){
$query = $this->pdo->prepare($ind_sql);
if ($ps){
if (is_array($ps)){
$i = 0;
foreach ($ps as $pss){
$query->bindValue($pss, $ps_val[$i]);
$i++;
}
} else {
$query->bindValue($ps, $ps_val);
}
}
try {
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $res){
$results[] = $res;
}
} catch (PDOException $error){
echo "<div><pre>" . print_r($error->getMessage(), true) . "</pre></div>";
}
}
if (isset($results)){
return $results;
} else {
return false;
}
}
}
PDOStatement对象:: debugDumpParams如果使用PDO
bindValue做搜索和LIKE条件你不能把百分比返回
SQL: [295] SELECT *
FROM `table`
WHERE `Category` = ":category"
AND `Color` LIKE "%:color0%"
OR `Color` LIKE "%:color1%"
OR `Color` LIKE "%:color2%"
OR `Color` LIKE "%:color3%"
OR `Color` LIKE "%:color4%"
OR `Color` LIKE "%:color5%"
OR `Color` LIKE "%:color6%"
Params: 8
Key: Name: [9] :category
paramno=-1
name=[9] ":category"
is_param=1 param_type=2
Key: Name: [7] :color0
paramno=-1
name=[7] ":color0"
is_param=1 param_type=2
Key: Name: [7] :color1
paramno=-1
name=[7] ":color1"
is_param=1 param_type=2
Key: Name: [7] :color2
paramno=-1
name=[7] ":color2"
is_param=1 param_type=2
Key: Name: [7] :color3
paramno=-1
name=[7] ":color3"
is_param=1 param_type=2
Key: Name: [7] :color4
paramno=-1
name=[7] ":color4"
is_param=1 param_type=2
Key: Name: [7] :color5
paramno=-1
name=[7] ":color5"
is_param=1 param_type=2
Key: Name: [7] :color6
paramno=-1
name=[7] ":color6"
is_param=1 param_type=2
你需要倾倒了PS,ps_val *和* $ ind_sql –
我已经,没有提到它。 – ffgpga08
在尝试执行之前,您是否尝试过'PDOStatement :: debugDumpParams' [php网站](http://us2.php.net/manual/en/pdostatement.debugdumpparams.php)? –