2013-02-18 92 views
2

关于为什么以下内容会抛出参数错误的任何想法。我已经看过所有其他答案,但我正在以与解决方案相同的方式处理这个问题,但这似乎仍然不起作用。将应用程序从adodb切换到pdo。MySql find_in_set()与PHP PDO不搭配很好

$possible_keys = implode(",", $possible_keys_array); 

SQL片断

WHERE 
FIND_IN_SET(table.key,:possible_keys) 

$STH = $DBH->prepare($sql); 

$STH->execute(array($possible_keys)); 

$STH->setFetchMode(PDO::FETCH_ASSOC); 

我只把代码的快照。但是,如果使用possible_keys变量的实际文本替换:possible_keys占位符,它一切正常。我在挠挠我的脑袋,为什么这不起作用,因为无论如何变量只是一个字符串。它一直抛出以下错误:

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined 

p.s.我只包含了被证明是问题的子句,而不是整个查询。我知道其余的都很好。

回答

1

您正在使用一个命名参数,但没有像这样绑定它。您需要指定名称:

$STH->execute(array(':possible_keys' => $possible_keys)); 
+0

伟大的我现在会尝试一下现在这一分钟。我错过了那一个。然而,它是如何为所有其他查询工作的。我在整个过程中都使用了指定的占位符,但是使用了具有相同顺序值的普通数组来将数据传递给stmt。它似乎在所有其他查询中工作正常,为什么会这样?我很感谢这些信息。 – jiraiya 2013-02-18 15:14:12

+0

它确实已经修复它,谢谢100万。有趣的是,正如我上面所说,它适用于其余部分,但不适用于find_in_set(),我只能假设它在所有情况下都不能安全使用非关联数组,因此我将使它们全部关联。再次感谢。 – jiraiya 2013-02-18 15:16:35

1

1)您正在使用指定的占位符,但您传递的是非关联数组。

如果您使用问号占位符,传递一个数组,像这样:

$STH->execute(array("a", "b", "c")) 

如果您使用指定的占位符,传递一个数组,像这样:

$STH->execute(array("name" => "a", "name2" => "b", "name3" => "c")) 

编辑:在我的回答中,我首先声明你不能在现在有一个参数的地方放置一个参数(在IN()语句中)。显然,那应该工作。

+0

感谢您的帮助也是一个很好的答案。 – jiraiya 2013-02-18 15:16:55