我想从旧的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 ...”行都是未注释的。
欢呼声
答案 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 );