【问题标题】:String of strings and PDO字符串和 PDO
【发布时间】:2015-09-16 22:14:57
【问题描述】:

我要做的是将一组内容标签传递到我的 postgresql 数据库查询中。

我有这个功能:

public static function arrayToPdo($array, $pdocon)
{
foreach($array as &$val)
{
$val = $pdocon->quote($val);
}

return implode(",", $array);
}

这样就可以将数组转换为带引号的字符串。

我已经回应了它,我得到了 'home'、'test' 这是我所期望的标签。

那么我想在我的 PDO 中绑定该函数的返回值。这是查询的 where 部分。

where @> array[:tags]

现在我用值“home”和“test”替换了占位符,它可以工作,所以问题在于我认为绑定的工作方式。

当我执行以下操作时,它工作正常:

"where @> array[" . arrayToPdo($array, $conn) . "]"

所以这是我绑定值的代码:

$st->bindvalue(":tags", arrayToPdo($array, $conn), PDO::PARAM_STR);

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

我已经搞砸了一天半,我想不通。

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

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

我们将不胜感激。

【问题讨论】:

    标签: php string postgresql pdo


    【解决方案1】:

    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 在重新引用参数时可能会出现问题。使用真正的准备好的语句,参数由驱动程序在查询之外传递并且不被引用)。

    【讨论】:

    • 谢谢。那让我发疯了。我才真正开始涉足网络开发,所以我还有很多东西要学。
    猜你喜欢
    • 2011-04-12
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多