我想要一些关于构造一些(基本的)PHP代码的建议。
我需要在不同的地方显示表格中的数据。需要在每个部分中显示的行可以通过标志来标识。
我不确定这样做的最佳方法是进入数据库一次并将数据分成2个变量,因为我循环访问它或者我应该去数据库两次,使用sql只调用我每次都需要的数据。
对于那些想要在代码中看到它的人:
方法A:
// Create and execute a MySQL query
function tasks_not_done(){
// Open a PDO dtabase connection
$link = new PDO(DB_INFO, DB_USER, DB_PASS);
$sql = " SELECT title, created_date
FROM todos
WHERE list_id = ? AND checked = '0'
ORDER BY created_date DESC";
$stmt = $link->prepare($sql);
$stmt->execute(array($_REQUEST['list_id']));
// loop throught all the rows
while($row = $stmt->fetch()) {
$date = strtotime($row['created_date']);
$date = date('d/m/y' , $date);
echo '<div class="task">' . "\n";
echo '<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
echo '</div>';
}
$stmt->closeCursor();
}
方法B
function tasks_all(){
// Open a PDO dtabase connection
$link = new PDO(DB_INFO, DB_USER, DB_PASS);
$sql = " SELECT title, created_date, checked
FROM todos
WHERE list_id = ?
ORDER BY created_date DESC";
$stmt = $link->prepare($sql);
$stmt->execute(array($_REQUEST['list_id']));
// loop throught all the rows
$tasks['not_done'] = "";
$tasks['done'] = "";
while($row = $stmt->fetch("FETCH_ASSOC")) {
$date = strtotime($row['created_date']);
$date = date('d/m/y' , $date);
if($row['checked'] =='0'){
$tasks['not_done'] .= '<div class="task">' . "\n";
$tasks['not_done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
$tasks['not_done'] .='</div>';
} elseif ($row['checked'] =='1') {
$tasks['done'] .= '<div class="task">' . "\n" .
$tasks['done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
$tasks['done'] .='</div>';
}
}
$stmt->closeCursor();
return $tasks;
}
感谢
答案 0 :(得分:4)
这类问题没有正确的答案,但我可以给你一些指示。
我的一般规则是:在您需要时获取所需的数据。但是有很多事情可能会影响到这一点。
答案 1 :(得分:1)
方法A是我的选择。
我认为Furnes到目前为止有一些最好的答案,但这里有一些其他的事情需要考虑......
从我所知道的......你的代码首先并不复杂 - 如果你真的担心这段代码的性能?
从长远来看,利用他人的代码通常会带来更好的性能,灵活性和可扩展性。减少自己的代码是件好事。如果您选择将工作委托给数据库,那么您可以在其中进行大量优化,这与您依赖自己的代码不同。例如,向您查询的表添加索引可能比选择要采用的编程路径更有意义。
如果你仍然想知道绝对最有效的方式......为什么不时间/配置代码?使用您自己的数据集,而不是玩理论游戏,查看使用具体指标更快的方法。
答案 2 :(得分:0)
我在这里看不到第二个查询,但您可能会使用JOIN来引入其他数据。
例如,如果我有一张客户表和一张会员卡表,但并非所有客户都有会员卡,我可以这样做:
SELECT c.CustomerID, c.CustomerName, l.LoyaltyCardType, l.LoyaltyCardBalance
FROM Customers c
LEFT JOIN LoyaltyCardInformation l
ON c.CustomerID = l.CustomerID
对于MySQL,连接语法在这里:http://dev.mysql.com/doc/refman/5.0/en/join.html
答案 3 :(得分:0)
为什么不更优雅地做到:
$sql = " SELECT title, created_date
FROM todos
WHERE list_id = ? AND checked = ?
ORDER BY created_date DESC";
$stmt = $link->prepare($sql);
$stmt->execute(array($_REQUEST['list_id'], '0'));
# do stuff
# and later...
$stmt->execute(array($_REQUEST['list_id'], '1'));
这可以避免代码重复,并且(取决于数据库后端)也应该更快。
答案 4 :(得分:-1)
为什么不这样做?
$sql = " SELECT title, created_date
FROM todos
WHERE list_id = ? AND checked = '$filterValue'
ORDER BY created_date DESC";