我刚刚从mySQLi(来自mySQL)切换到PDO,到目前为止它很好,很容易,特别是关于预备语句
这是我对准备好的陈述
的选择主DB文件(包含在所有页面中):
class DBi {
public static $conn;
// this I need to make the connection "global"
}
try {
DBi::$conn = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8", $dbuname, $dbpass);
DBi::$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
DBi::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo '<p class="error">Database error!</p>';
}
在我的页面中:
try {
$sql = 'SELECT pagetitle, pagecontent FROM mypages WHERE pageid = ? LIMIT 1';
$STH = DBi::$conn->prepare($sql);
$STH->execute(array($thispageid)); // $thispageid is from a GET var
}
catch(PDOException $e) {
echo '<p class="error">Database query error!</p>';
}
if ($STH) { // does this really need an if clause for it self?
$row = $STH->fetch();
if (!empty($row)) { // was there found a row with content?
echo '<h1>'.$row['pagetitle'].'</h1>
<p>'.$row['pagecontent'].'</p>';
}
}
一切正常。但我做得对吗?或者我可以在某些地方让它更简单吗?
使用if(!empty($ row)){}一个正确的解决方案来检查是否有包含内容的结果行?无法在准备好的缩小选择
上找到其他正确的方法来检查数量答案 0 :(得分:1)
catch(PDOException $e) {
echo '<p class="error">Database query error!</p>';
}
我会利用这个机会记录发生了数据库查询错误。
请参阅此处的示例:http://php.net/manual/en/pdostatement.errorinfo.php
此外,如果您发现错误,您可能应该从函数或脚本中return
。
if ($STH) { // does this really need an if clause for it self?
如果$STH
无效,那么它应该已经生成了异常并且之前已被捕获。如果你从catch块中的函数返回,那么你就不会在代码中达到这一点,因此不需要再次测试$STH
非null。刚开始从中获取。
$row = $STH->fetch();
if (!empty($row)) { // was there found a row with content?
我会这样写:
$found_one = false;
while ($row = $STH->fetch()) {
$found_one = true;
. . . do other stuff with data . . .
}
if (!$found_one) {
echo "Sorry! Nothing found. Here's some default info:";
. . . output default info here . . .
}
无需测试它是否为空,因为如果它是,则循环将退出。