2014-09-01 163 views
0

所以我只是想知道這是否是一種好的做法,或者由於某種原因,這種類型的代碼會影響系統的速度和功能?準備語句內部while循環生成的準備語句

$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個以上的語句會產生,這是壞?感謝您的答案。

+1

循環內的數據庫查詢幾乎不是一個好主意。您應該嘗試使用一個查詢來獲取所需的所有數據 - 查看JOIN。 – CBroe 2014-09-01 08:12:21

回答

1

每次您準備一份聲明時,都需要致電MySQL,這很貴。如果是相同的陳述,這是不必要的並且浪費時間。

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

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

如果這只是一個假象,而且確實在從外部查詢返回的數據和參數到內部查詢之間存在依賴關係,那麼您可能應該將它們作爲包含兩者之間的JOIN表。

+0

謝謝先生。我想我現在不會這樣做,作爲我的選擇的一部分。 – Bobski 2014-09-01 08:30:42

1

它被普遍認爲是不好的做法。

您正在代碼更難閱讀比它需要更復雜的:增加的潛力,用於引入未來和錯誤更難別人明白,如果他們以後要支持你的代碼。

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

+0

謝謝你的回覆,這對我有很大的幫助。謝謝 – Bobski 2014-09-01 08:31:09