字符串和PDO

时间:2015-09-16 13:05:00

标签: php string postgresql pdo

我要做的是将一系列内容标记传递到我的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);

我之前正确地绑定了另一个值,所以我觉得它应该可以正常工作。

我一直在搞乱它一天半,我无法弄明白。

基本上,当我在查询字符串中输入引用值时,它可以工作;当我将函数连接到查询字符串时,它工作;但是当我绑定它时它不会。

没有错误,我只知道它不起作用,因为查询不返回任何记录。我没有找到一种方法来查看在执行时查询字符串中插入的内容,因此我不确定问题是什么。

非常感谢任何帮助。

1 个答案:

答案 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在重新引用参数时可能会搞乱。使用真实的预处理语句,参数将由查询外部的驱动程序传递而不会被引用。)