PHP PDO:我的PHP可以更清洁/更高效吗?

时间:2012-02-22 04:52:19

标签: php mysql pdo prepared-statement

所以我终于决定通过学习使用PHP的PDO来更新2012年的PHP。到目前为止,一切都很顺利,但我不知道我的方式是否真的是最好的方式。

在这个例子中,我查询我的数据库以显示用户发布的帖子,然后为每个帖子显示2条评论。所以基本上我正在做的是抓住我的帖子,将其循环出来,然后在该循​​环中我查询数据库以查找每个帖子的前两个评论。然而,在我四处奔波并开始全年使用之前,我想我是否有更清洁的方法来做这件事。

因此,如果有人可以花些时间来查看这一小块代码,并告诉我是否有更清洁,也许更有效的方法,我真的很感激。随意挑剔!

<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//Get Posts
    $stmt = $dbh->prepare("SELECT * FROM posts");
    $stmt->execute();
    $result = $stmt->fetchAll();
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }

//Loop through each post
foreach($result as $row) {

echo $row['post'];

//Get comments for this post
    $pid = $row['id'];
    $stmt = $dbh->prepare("SELECT * FROM comments WHERE pid = :pid LIMIT 2");
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
    $stmt->execute();
    $c_result = $stmt->fetchAll();

//Loop through comments
foreach($c_result as $com) {

echo $com['comment'];

    }
}
//Close connection
$dbh = null;
?>

1 个答案:

答案 0 :(得分:3)

嗯,实际上是2个问题。

0.1。对于您正在使用的代码,它非常难看。使用原始API函数总是会使代码变得丑陋,乏味和重复。只运行一个查询,你就获得了五行! 难道你不认为只有一条线会更好吗?线只包含有意义的运算符?

$comments = $db->getAll("SELECT * FROM comments WHERE pid = :pid LIMIT 2",$row['id']);

0.2。对于算法 - 这是很好的。
假设您要遍历所有数据库,但每页仅请求10-20个帖子,则额外的10-20个主键查找不会减慢你的申请。

0.3。奖金跟踪。
你真正想要考虑的是“业务逻辑/表示逻辑分离”。为什么不首先获取所有数据而不是开始输出?它会让你的代码更加干净。