来自函数返回数组的 PHP PDO 参数

Posted

技术标签:

【中文标题】来自函数返回数组的 PHP PDO 参数【英文标题】:PHP PDO Parameters from a function returned array 【发布时间】:2012-04-07 17:31:29 【问题描述】:

我编写了一个函数,它根据传递给函数的参数运行查询。

我似乎无法弄清楚为什么执行以下操作会返回结果:

function test($function_returned_array)

    $variable = 'Hello World';
    $sql = 'SELECT `name`, `pid`
            FROM `products`
            WHERE `name` IN (?)';
    $found = $this->db->get_array($sql, $variable);

虽然这不会返回任何结果:

function test2($function_returned_array)

    $sql = 'SELECT `name`, `pid`
            FROM `products`
            WHERE `name` IN (?)';
    $found = $this->db->get_array($sql, $function_returned_array[0]);

$function_returned_array[0] 也等于“Hello World”。他们不应该返回相同的结果吗?

当我回显 $variable 和 $function_returned_array[0] 的值时,它们都是“Hello World”

这是我的 PDO 包装器的相关部分:

public function query(&$query, $params)

    $sth = $this->_db->prepare($query);

    if(is_null($params))
    
        $sth->execute();
    
    else if(is_array($params))
    
        $sth->execute($params);
    
    else
    
        $sth->execute(array($params));
    

    $this->_rows = $sth->rowCount();
    $this->_counter++;
    return $sth;


public function get_array(&$query, $params, $style = PDO::FETCH_ASSOC)

    $q = $this->query($query, $params);
    return $q->fetchAll($style);

我使用的是 php 5.3.5。

任何帮助将不胜感激。

【问题讨论】:

这段代码缺少调试。并要求陌生人在心理上对其进行调试。我会 -1 但不要这样做只是为了拥有一个 PDO 包装器 - 在这个“***程序员”网站上几乎从未见过这种东西 对不起,我认为它已经足够清楚了:(我会再编辑一下。 为什么要传递查询字符串作为参考? 为什么会有这么复杂的代码?为什么要使用函数?为什么通过数组成员传递标量变量的这种复杂方式?为什么你不能将你的 hello world 作为标量传递? @YourCommonSense,以上是代码的精简版。查询更像是 WHERE name IN (?, ?, ?)'。传递给 query() 的参数是整个数组。 【参考方案1】:

我在 PDO 中目睹了同样的问题。 PDO 只接受参数化查询的局部变量,而不是通过引用或参数不知道为什么。

解决办法可以。

function test2($function_returned_array)

    $variable = $function_returned_array[0];
    $sql = 'SELECT `name`, `pid`
            FROM `products`
            WHERE `name` IN (?)';
    $found = $this->db->get_array($sql, $variable);

更新:

你做错了。您必须使用 PDO prepare() 语句进行参数化查询,而我看到您将 PDO query() 直接用于 get_query() 方法。

仅当您不想将任何参数传递给查询时才应使用query() 方法。根据 php 文档,这里是语法

PDOStatement PDO::query ( string $statement )

您尝试传递的第二个参数是错误的。

所以改用prepare() 方法,这里是链接。

http://in.php.net/manual/en/pdo.prepare.php

【讨论】:

感谢您的回复,我也试过了,它仍然返回与 test() 不同的结果。虽然,当我在 test2() 中手动设置 $function_returned_array[1] 的值时,它起作用了。还有什么想法吗? 等等,我想我遇到了你的问题,你做错了。我会用解释更新我的帖子。 感谢您的回复,我正在使用$sth = $this->_db->prepare($query)中的prepare()方法。不过,我会再次查看所有内容。我的代码肯定有其他问题!【参考方案2】:

请注意,问题在于 $function_returned_array[0] 和 $variable 并不真正等同于同一事物。 $function_returned_array[0] 需要通过 html_entity_decode() 传递。

【讨论】:

以上是关于来自函数返回数组的 PHP PDO 参数的主要内容,如果未能解决你的问题,请参考以下文章

PDO 返回空数组作为结果

PDO->fetchAll() 在远程服务器上返回空数组

php返回数组中指定的一列方法是啥?

PHP中list()和each()函数的结合使用

laravel 5.5 数据返回数组

PHP数组函数