【问题标题】:PDO Object empty [closed]PDO 对象为空 [关闭]
【发布时间】:2012-12-03 11:17:17
【问题描述】:

这是我的代码:

class DB {
static $instance;

function get() {
    if (self::$instance === null) {
        self::$instance = new PDO('mysql:host=localhost;dbname=forum', 'root', 'root');
    }
    return self::$instance;
}

function getAllUsers() {
    $users = array();
    $sql = "SELECT * FROM users";
    foreach (self::get()->query($sql) as $row) {
        $users[] = new User($row);
    }
    return $users;    
}
}

现在我在这里调用 getAllUsers 函数:

class App {
function showUsers() {
    $users = DB::getAllUsers();
}

除了它给我一个错误:

警告:为 foreach() 提供的参数无效

当我在self::get 上做var_dump 时,我得到一个bool(false)

谁能告诉我我做错了什么?

【问题讨论】:

  • 我想指出 var_dump(self::get()) 显示 object(PDO)#2 (0) { }
  • 你为什么不是try/catching and raising exceptions?你没有给你的班级任何优雅地失败的路线。
  • 如果你使用self::get()调用你的类实例,那么get()应该被声明为static
  • 我最初的想法是错误被隐藏了,因为我还没有创建数据库。但是我已经用 try/catch 包围了它,但它仍然没有给我 PDOException
  • 该类应该是静态的,我很清楚这一点。但是由于某种原因,它仍然可以在没有 static 关键字的情况下工作。我正在取回一个 pdo 对象

标签: php pdo


【解决方案1】:

PDO::query 返回一个PDOStatement 对象如果它成功地将查询发送到数据库并返回一个有效的响应(即驱动程序没有返回 SQL 错误)。但是,如果失败,它将返回false。所以你必须检查这个以处理错误。此外,您可以选择输入PDO into Exception Mode,让它在遇到错误时抛出异常。这样,您可以在调用 PDO 对象时使用 try/catch 来处理错误。请参阅下面的示例...

使用 PDO 的默认错误模式(静默):

if ($result = self::get()->query($sql)) {
    /* Iterate here */
    foreach ($result as $row) {
        /* Do whatever you want with $row */
    }
} else {
    /* Handle errors here */
    echo "There was an error with the query!";
    var_dump(self::get()->errorInfo());
}

PDO 处于异常模式:

/* Put PDO Into Exception Mode */
self::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    foreach (self::get()->query($sql) as $row) {
        /* Do whatever you want with $row */
    }
} catch(PDOException $e) {
    /* If PDO fails we handle it here */
    echo "Your query failed: " . $e->getMessage();
}

【讨论】:

  • +1 用于前三个语句。正是我的想法。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多