PHP PDO - 可以连接但查询不起作用

时间:2011-12-03 04:43:03

标签: php pdo

我想从旧的mysql扩展程序中解脱出来,我只是在数据库中的表上进行测试PDO连接和简单查询。我似乎能够连接,('连接成功'回声),但那是好时光结束的地方。我现在花了太多时间试图开始使用PDO。

<?php
$host = 'localhost';
$port = '3306'; 
$username = 'user';
$password = 'blabla';
$database = 'workslist';

try {
    $db = new PDO("mysql:host=$host; port = $port; dbname = $database", $username, $password);
    echo 'connection successful<br />';

    $query = 'SELECT * FROM main';
    $statement = $db->prepare($query);
    $statement->execute();
    $results = $statement->fetchAll();
    $statement->closeCursor();      

    foreach($results as $r){
            echo $r['work'] . '<br />';
    }

} catch (PDOException $e) {
    echo 'Error!: ' . $e->getMessage() . '<br />';
    die();
} 
?>

以上是否有任何问题?

数据库名称为“workslist”,表名为“main”,“work”是该表中的列之一。我正在使用的PHP版本是5.3.4,并且在win7上使用wamp。我运行phpinfo()并在PDO标题下启用了PDO驱动程序mysql,sqlite。为了确保数据库和表实际存在,我已经尝试使用MySQL,并且可以使用旧的mysql_fetch_array()方法返回行。我检查了php.ini文件以确保“extension = php_pdo ...”行都是未注释的。

欢呼声

3 个答案:

答案 0 :(得分:4)

这应该有用。

请仔细检查您确实在该数据库中有一个名为“main”的表。

请注意,在您execute()查询之前,PDO不会发现此错误,如果查询出现问题,则默认行为是返回空结果,抛出异常。

要使PDO更嘈杂,请在构建PDO时添加PDO::ERRMODE_EXCEPTION选项:

$db = new PDO("mysql:host=$host;port=$port;dbname=$database", $username, $password, 
              array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)
);

现在检查您是否看到以下内容:

Error!: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'workslist.main' doesn't exist

答案 1 :(得分:2)

特别的问题是DSN字符串中不允许使用空格。使用空格,不处理“dbname”指令,因此没有默认数据库。除了删除空格之外,在语句中显式指定数据库可以帮助防止出现这种问题:

SELECT `work` FROM `workslist`.`main`

这样,如果由于某种原因没有默认数据库,查询仍然会成功。

答案 2 :(得分:1)

PDO不会抛出错误,除非您将其配置为:

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );