我可以改进我的PDO方法(刚开始)

时间:2014-07-10 06:56:38

标签: php pdo mysqli prepared-statement

我刚刚从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)){}一个正确的解决方案来检查是否有包含内容的结果行?无法在准备好的缩小选择

上找到其他正确的方法来检查数量

1 个答案:

答案 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 . . .
}

无需测试它是否为空,因为如果它是,则循环将退出。