准备好的语句在while循环中由预准备语句生成

时间:2014-09-01 08:06:36

标签: php mysql prepared-statement

所以我只是想知道这是否是一个好的做法,或者出于某种原因这种类型的代码是否会影响系统的速度和功能?

$foo = "bar";
$stmt = $db->prepare('SELECT * FROM table WHERE bar=?');
$stmt->bind_param('s',$foo);
$stmt->execute();
$result = $stmt->get_result();
   while($row = $result->fetch_assoc()){
       $val1 = $row['val1'];
       $val2 = $row['val2'];
       echo "<section>";
          $stmt2 = $db->prepare('SELECT * FROM table2 WHERE bar=?');
          $stmt2->bind_param('s',$foo);
          $stmt2->execute();
          $result2 = $stmt2->get_result();
             while($row = $result2->fetch_assoc()){
                 $val1 = $row['val1'];
                 $val2 = $row['val2'];
             }
          $stmt->close();
      echo "</section>";
    }
$stmt->close();

第一个语句可以生成50个或更多数据,这意味着将生成另外50个或更多stmt,这是不是很糟糕?谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

每次准备语句时,都需要调用MySQL,这很昂贵。如果它是相同的陈述,这是不必要的,浪费时间。

你也只需要绑定params一次。 bind_param将参数与对变量的引用相关联。因此循环只需要更新变量的值并调用execute

在你的代码中,似乎每次循环都不需要重复内部查询。它不依赖于从外部查询中检索到的任何内容,因此每次都会返回相同的结果集。你应该这样做一次,将结果保存在一个数组中,然后每次循环遍历数组,以避免不必要地访问数据库。

如果这只是一个人为的例子,并且你确实在从外部查询返回的数据和内部查询的参数之间存在依赖关系,那么你可能应该将它们作为包含JOIN的单个查询来实现。在两张桌子之间。

答案 1 :(得分:1)

这被普遍认为是不好的做法。

您正在使代码更难阅读并且比以前更复杂:增加将来引入错误的可能性,并且如果他们以后必须支持您的代码,则更难以理解其他人。

如上所述,您应该使用JOIN。