簡體   English   中英

由准備語句生成的 while 循環中的准備語句

[英]Prepared statement inside while loop generated by 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個或更多的語句,這不好嗎?

感謝您的回答。

每次准備語句時,都需要調用MySQL,開銷很大。 如果是同一個語句,這是不必要的,而且是浪費時間。

您也只需要綁定一次參數。 bind_param將參數與對變量的引用相關聯。 所以循環只需要更新變量的值並調用execute

在您的代碼中,似乎沒有必要每次通過循環重復內部查詢。 它不依賴於從外部查詢中檢索到的任何內容,因此每次都會返回相同的結果集。 你應該做一次,將結果保存在一個數組中,然后每次都遍歷數組,以避免不必要地訪問數據庫。

如果這只是一個人為的示例,並且您確實在從外部查詢返回的數據與內部查詢的參數之間確實存在依賴關系,那么您可能應該將它們作為包含兩個表之間的JOIN的單個查詢來執行。

人們普遍認為這是不好的做法。

你讓代碼更難閱讀,也比它需要的更復雜:增加了未來引入錯誤的可能性,如果他們以后必須支持你的代碼,其他人更難理解。

如上所述,您應該使用 JOIN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM