【发布时间】:2012-01-12 00:41:26
【问题描述】:
我想摆脱旧 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..." 行都未注释。
干杯
【问题讨论】:
-
谢谢 outis - 我只在他的问题中使用了
SELECT *以使查询尽可能简单。 -
<br/>不是semantic。对于生产代码,请确保使用更合适的内容,例如段落或 list 元素。输出 HTML 时不要使用or die。您将获得无效的 HTML。 -
确保在生产代码中不向非管理员用户输出数据库错误消息;这样做discloses too much information。
PDOStatement::fetchAll是资源密集型的;相反,使用foreach循环遍历实现Traversable的PDOStatement 对象。 “语句”更好地描述了SQL“语句”; “查询”更好地描述了您为获得结果而执行的操作。