2012-10-25 80 views
2

我试图学习和使用PHP中的PDO。我在query()方法中遇到过一个问题。PDO :: Query()返回false

我试图用$sth = $db->query("SELECT * FROM titles ORDER BY RAND() LIMIT 1");为网站随机选择一个标题,但由于某种原因,$sth始终是错误的。它适用于我使用prepare()和​​,但我试图找到query()中有什么问题。

这里是我所调用的全功能:

function getTitle($db) 
    { 
    if($db) 
     { 
      $db->exec("USE " . $dbsite); 
      $sth = $db->query("SELECT * FROM titles ORDER BY RAND() LIMIT 1"); 
      $title = $sth->fetch(PDO::FETCH_ASSOC); 

      $db->exec("UPDATE titles SET count = count + 1 WHERE id = " . $title['id']); 

      return $title['title']; 
     } 
    else 
      return 'Home - Database Offline'; 

} 
+0

尝试读取错误消息。 ''db-> getLastError()'的一些东西' –

+1

http://php.net/manual/en/pdo.errorinfo.php –

+0

找到它了。我在配置文件中定义了'$ dbsite',但我没有将它设置为全局函数....我的问题是变量范围。 –

回答

17

使用PDO的errorinfo() function找出原因。

if(! $sth = $db->query("SELECT * FROM titles ORDER BY RAND() LIMIT 1")) { 
    die(var_export($db->errorinfo(), TRUE)); 
} 

晚更新

在做我的旧的答案更好的利益,设置PDO扔在错误异常比检查每个函数的返回远远更易于管理。

$dbh = new PDO($connstr, $user, $pwd); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

或者,更简洁:

$dbh = new PDO($connstr, $user, $pwd, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); 
+0

这个终于保存​​了几个小时后我的屁股想知道为什么我没有得到一个PDO异常,但同时使用直接查询和准备语句时有一个虚假变量。愿上帝保佑你,@Sammitch。 – armadadrive