2

信息

我开始注意到我编码习惯的一种趋势,我想知道是否有更好的方法来做到这一点。

问题

举个例子,假设我有一个可能包含数据的表,理想情况下,如果有数据,我想循环遍历数据,如果没有则显示错误消息。

当前解决方案

function countResults($type){

    $STH = $this->database->prepare('SELECT COUNT(*) FROM table WHERE type = :type');
    $STH->execute(array(':type' => $type));
    return $STH->fetchColumn();

}

if($class->countResults("1") != 0){

    $STH = $this->database->prepare('SELECT * FROM table WHERE type = :type ');
    $STH->execute(array(':type' => $type));

    while($row = $STH->fetch(PDO::FETCH_ASSOC)){

        echo "Row Name:".$row['name']."<br />";

    }

}    else    {

     echo "None found";

}

尝试过

我尝试了一种解决方案,通过将其存储$STH->fetch(PDO::FETCH_ASSOC)到变量中然后使用来减少if(!empty($var)){// loop code};它,但它不允许我正确循环出数据。

结论

我知道这不是一个我正在努力紧急修复的突破性错误,但我觉得这似乎正在成为一个坏习惯,并且我的脑海中有一点唠叨,我很想有一个更聪明的解决方案在它变成习惯之前学习!

有需要的欢迎提问,谢谢。

4

3 回答 3

1

你的方法是不合逻辑的,而不是错误的。你需要的只是常识。
想象一下,您要购买六件装。你是通过两个动作还是一个动作从口袋里拿到现金?你真的是这样吗:

  1. 把手伸进口袋,只摸到钱。有一些。好的。
  2. 把手收回,然后再次伸手——这次是为了钱。

为什么不只到达一次,如果够了就买啤酒,如果没有,就说对不起?

$STH = $this->database->prepare('SELECT * FROM table WHERE type = :type ');
$STH->execute(array(':type' => $type));
$data = $STH->fetchAll();

if ($data)
{
    foreach($data as $row)
    {
        echo "Row Name:".$row['name']."<br />";
    }

} else {

     echo "None found";
}
于 2013-10-21T13:26:06.123 回答
0

我会这样做,如果有人看到任何错误,请指出:

  • 我更喜欢 foreach 因为我可以访问字段名称
  • 我喜欢习惯使用 count() 而不是 rowCount() 因为 rowCount() 可以为更新的行返回 2,即使这个查询是一个选择,我觉得我可以习惯它并且有错误。
  • 我喜欢检查它是否返回 false 进行调试。通常我会为此做一个单行,所以我可以在生产中将其注释掉或轻松删除

function myQuery(){
    $STH = $this->database->prepare('SELECT * FROM table WHERE type = :type ');
    $STH->execute(array(':type' => $type));
    $data = $STH->fetchAll(PDO::FETCH_ASSOC);

    if($data === false) return "SQL query Error"; // or a method/function that returns the actual error code/message";
    if($data){
        foreach($data as $k => $v) echo "$k: $v<br>"; // I actually prefer to return the array $data and handle the info elsewhere
    } else {
        "None Found";
    }
}
于 2013-10-21T13:49:37.593 回答
0

我会使用两个选项。选项一,类似于您正在执行的操作:

$STH = $this->database->prepare('SELECT * FROM table WHERE type = :type ');
$STH->execute(array(':type' => $type));
if ($STH->rowCount() > 0)  
  while($row = $STH->fetch(PDO::FETCH_ASSOC)){
    echo "Row Name:".$row['name']."<br />";
  }
}    else    {
  echo "None found";
}

请注意,PDOStatement::rowCount()的 PHP 手册警告说,这可能不会从所有数据库类型的 SELECT 查询中返回行数。

我实际上所做的是将 SQL 逻辑与显示分开,通常使用模板引擎Smarty。在这种情况下,您有两个单独的文件:

PHP:

$STH = $this->database->prepare('SELECT * FROM table WHERE type = :type ');
$STH->execute(array(':type' => $type));
$objects = $STH->fetchAll();
$template->assign("objects", $objects); // this assigns the array with all returned rows to the template.

智能模板:

{foreach from=$objects item=object}
Row Name: {$object.name}<br />
{foreachelse}
None found
{/foreach}

这将基本上输出相同的,具有分离的逻辑。

这两种方法都将防止执行不必要的查询或两次执行相同的查询。

于 2013-10-21T13:36:26.077 回答