我要做的是将一系列内容标记传递到我的postgresql数据库查询中。
我有这个功能:
public static function arrayToPdo($array, $pdocon)
{
foreach($array as &$val)
{
$val = $pdocon->quote($val);
}
return implode(",", $array);
}
这样就可以将数组转换为引用值的字符串。
我已经回应了它,我得到'回家','测试'这是我期望的标签。
那么我想在我的PDO中绑定该函数的返回值。这是查询的where部分。
where @> array[:tags]
现在我已经用值'home'和'test'替换了占位符,它的工作原理就是我认为绑定是如何工作的。
当我执行以下操作时,它可以正常工作:
"where @> array[" . arrayToPdo($array, $conn) . "]"
所以这是我绑定值的代码:
$st->bindvalue(":tags", arrayToPdo($array, $conn), PDO::PARAM_STR);
我之前正确地绑定了另一个值,所以我觉得它应该可以正常工作。
我一直在搞乱它一天半,我无法弄明白。
基本上,当我在查询字符串中输入引用值时,它可以工作;当我将函数连接到查询字符串时,它工作;但是当我绑定它时它不会。
没有错误,我只知道它不起作用,因为查询不返回任何记录。我没有找到一种方法来查看在执行时查询字符串中插入的内容,因此我不确定问题是什么。
非常感谢任何帮助。
答案 0 :(得分:0)
在array[:tags]
中,:tags
是一组值,而不是单个值。只能绑定单个值。
这里你可能想要的是使用一个数组的语法,将其表示为单个值。
此处:PHP array to postgres array 你会找到一个将PHP数组转换成这种语法的函数。
然后查询中的子句应如下所示:
"... where @> cast(:myarray as text[])"
请注意,没有数组构造函数,它是一个强制转换。
将其绑定为
$st->bindvalue(":tags", to_pg_array($array), PDO::PARAM_STR);
确保PDO配置为使用真实预处理语句:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
(否则我怀疑PDO在重新引用参数时可能会搞乱。使用真实的预处理语句,参数将由查询外部的驱动程序传递而不会被引用。)