尝试将变量传递给函数并在PDO select语句中使用它

时间:2014-04-09 05:54:58

标签: php mysql pdo

我目前正在尝试使用PDO SELECT语句来处理通过其所包含的函数的参数传入的变量。我正在使用此函数将值返回给类构造函数。

这是我遇到“致命错误:在非对象上调用成员函数prepare()”的函数“

    public function select($field) {
    global $pdo;

    $query = $pdo->prepare("SELECT `".$field."` FROM `iwp_incident` WHERE `incident_id=`". $this->oid ."`");
    $query->execute();

    $result = $query->fetch();

    return $result[0];

2 个答案:

答案 0 :(得分:0)

您的主要问题是假定的PDO实例不是您认为的那样(我猜是null)。

要缓解此问题,您应该删除对全局的依赖,而是使用依赖注入。例如

namespace Some\Namespace;

use \PDO;

class YourClass {
    /**
     * @var PDO
     */
    private $pdo;

    private $oid;

    public function __construct(PDO $pdo, $oid) {
        $this->pdo = $pdo;
        $this->oid = $oid;

        $someField = $this->select('some_field');
    }

    public function select($field) {
        $stmt = $this->pdo->prepare(sprintf(
            'SELECT `%s` FROM `iwp_incident` WHERE `incident_id = ? LIMIT 1',
            $field));
        $stmt->bindParam(1, $this->oid);
        $stmt->execute();
        return $stmt->fetchColumn();
    }
}

要使用此功能,您只需在创建类时传入PDO实例,例如

$pdo = new PDO('mysql:...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

$obj = new \Some\Namespace\YourClass($pdo, 123);

答案 1 :(得分:-1)

错误消息非常有用。如上所述,$ pdo是非对象。大概是你的初始连接失败了。检查$ pdo是否有效可能是一种好习惯,但初始连接(代码中的任何位置)应该在连接失败时抛出异常。 (你是否抓住了那个例外并吞下它而没有报告任何内容......?)

顺便说一下,我可以建议你做一些像这样的事情而不是字符串连接来处理引用和转义,以帮助防止允许注入攻击的错误:

$query = $pdo->prepare("SELECT `".$field."` FROM `iwp_incident` WHERE `incident_id`= :oid");
$params = array(":oid"=>$this->oid); 
$success = $query->execute($params);
if($success) {
    $results = $query->fetchAll(PDO::FETCH_ASSOC);
    // process results
}