2014-02-07 46 views
1

我见过很多人得到了错误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如果使用PDObindValue做搜索和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 
+0

你需要倾倒了PS,ps_val *和* $ ind_sql –

+0

我已经,没有提到它。 – ffgpga08

+0

在尝试执行之前,您是否尝试过'PDOStatement :: debugDumpParams' [php网站](http://us2.php.net/manual/en/pdostatement.debugdumpparams.php)? –

回答

1

和引号至参数占位符'%:color0%'

这是错误的:

SELECT * FROM `bullet_catalog` WHERE `color` LIKE '%:color0%' 

正确的解决方案是使用就像这样的占位符:

SELECT * FROM `bullet_catalog` WHERE `color` LIKE :color0 

然后百分比添加到PHP变量您存储关键字:

$query->bindValue(':color0', "%" . $color0 . "%"); 

也作为%_不在012中逃脱,所以你应该自己逃脱。

还解释

+0

就是这样。非常感谢。 – ffgpga08

相关问题