直到最近我还没有使用这种预处理语句的方法,我遇到了问题。我在这里读了一些关于stackoverflow的类似问题,但它们似乎指的是不同的东西,比如重复的标记(我正在使用?不:名称,所以我认为不适用)我已经在php风暴中使用xdebug来调试什么正在通过。
该查询是我在我的脚本中使用的过滤器的一部分。
调试器中的查询字符串显示:
SELECT * FROM data_table WHERE (hud_game_type = ? OR hud_game_type = ? OR hud_game_type = ?) AND (hud_table_type = ? OR hud_table_type = ? OR hud_table_type = ?) AND (hud_table_size = ? OR hud_table_size = ? OR hud_table_size = ? OR hud_table_size = ?) AND approve = ? ORDER BY hud_downloads DESC
所以显然有11 x?
调试器中的 $search_values
显示:
0 = "Omaha"
1 = "Holdem"
2 = "All"
3 = "Cash"
4 = "Tourney"
5 = "All"
6 = "6max"
7 = "FR"
8 = "HU"
9 = "All"
10 = "1"
再次明确数组中的11个值,这里是代码的最后一部分:
这是代码,但如上所述,构建的字符串在上面,它似乎是合法的,因为这段代码依赖于在其另一个函数内置的表单中传递的值,我可以添加,如果相关但我不会'我想是的,因为我显示上面输出的查询
$result = $database->resultset("
SELECT * FROM $data_table WHERE $search_game_type AND $search_table_type AND $search_table_size AND approve = ? $search_sort_by",(array($search_values)));
// returns an array of the results, first we execute and then fetch the results
public function resultset($query,$values){
$this->stmt = $this->dbh->prepare($query);
try{
// this handles situation where no params need to be escaped.
if($values == ""){
$this->stmt->execute();
} else{
$this->stmt->execute($values);
}
} catch (PDOException $e){
$this->error_db_query_failed(true,$values,$e->getMessage(),"Error #12");
}
现在PDO返回的错误是:
SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配
这个相同的结果集函数似乎在代码的其他部分工作正常,但我只传递了一个或两个参数。
即使有人可以指出我正确的方向或建议错误可能是什么我很乐意进一步搜索,但很多其他错误引用:名称类型绑定所以过程是不同的。
答案 0 :(得分:2)
由于$search_values
已经是一个数组,您应该直接将其传递给该函数,不要使用array($search_values)
。