3

这是我当前的数据库类:

class Database {

    private $db;

    function Connect() {
        $db_host = "localhost";
        $db_name = "database1";
        $db_user = "root";
        $db_pass = "root";
        try {
            $this->db = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user, $db_pass);
        } catch(PDOException $e) {
            die($e);
        }
    }

    public function getColumn($tableName, $unknownColumnName, $columnOneName, $columnOneValue, $columnTwoName = "1", $columnTwoValue = "1") {
        $stmt = $this->db->query("SELECT $tableName FROM $unknownColumnName WHERE $columnOneName='$columnOneValue' AND $columnTwoName='$columnTwoValue'");
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $results[0][$unknownColumnName];
    }
}

我正在尝试使用以下代码运行它:

$db = new Database();
$db->Connect();
echo $db->getColumn("Sessions", "token", "uid", 1);

我收到以下错误:

PHP 致命错误:在第 19 行的 /Users/RETRACTED/RETRACTED/root/includes/Database.php 中的非对象上调用成员函数 fetchAll()

知道怎么了?谢谢

4

3 回答 3

5
  1. 这个函数很容易被SQL注入
  2. 此功能不会让您使用最简单的 OR 条件来获取列
  3. 此功能使 SQL 语言几乎自然的英语变得难以阅读

看,你甚至宠坏了自己写这个函数。你认为它如何用于日常编码?事实上,与原始 PDO 相比,此功能使您的体验更加困难- 您必须学习所有新语法、大量异常和最后一分钟的更正。

请转回原始 PDO!

让我告诉你正确的方法

public function getColumn($sql, $params)
{
    $stmt = $this->db->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetchColumn();
}

像这样使用

echo $db->getColumn("SELECT token FROM Sessions WHERE uid = ?", array(1));

这样,您将能够使用SQL 的全部功能,而不仅限于愚蠢的子集,以及准备好的语句的安全性,同时保持您的代码易于理解。
虽然仍然在一行中调用它- 这是您最初(并且非常正确!)的意图。

于 2013-08-20T05:33:40.003 回答
1

这意味着您的 $stmt 变量没有返回 PDOStatement 对象。您的查询失败,因为 PDO::query 错误时返回 PDOStatement 或 False。

于 2013-08-20T03:33:12.213 回答
0

在你的情况下使用fetch而不是fetchAll..that 会很容易

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $results[0][$unknownColumnName];

这将是

$results = $stmt->fetch(PDO::FETCH_ASSOC);
return $results[$unknownColumnName];
于 2015-05-12T09:53:12.927 回答