创建一个PHP PDO数据库类,麻烦的是OOP

时间:2013-08-20 03:26:02

标签: php oop pdo

这是我目前的数据库类:

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()

知道怎么了?感谢

3 个答案:

答案 0 :(得分:5)

  1. 此功能易于SQL注入
  2. 此功能不允许您使用最简单的OR条件来获取列。
  3. 此函数使用几乎自然的SQL语言进行难以理解的乱码。
  4. 看,你甚至宠坏了自己写这个功能。您如何将其用于日常编码?事实上,与使用原始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的全部功能,不仅限于愚蠢的子集,还有准备好的语句的安全性,同时保留您的代码可以理解的。
    虽然称它仍然在一行 - 这是你最初的(也是非常合适的!)意图。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用fetch代替fetchAll ..这在您的情况下很容易

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

将是

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