2013-03-19 92 views
0

我試圖用預處理語句更改我的SQL查詢。 想法:我用while循環從數據庫中獲取多條記錄,然後從循環中的數據庫獲取一些附加數據。多個預處理語句(SELECT)

這是我的老SQL代碼(簡化):

$qry = "SELECT postId,title,userid from post WHERE id='$id'"; 
$rst01 = mysqli_query($mysqli, $qry01); 
// loop trough mutiple results/records 
while (list($postId,$title,$userid) = mysqli_fetch_array($rst01)) { 
// second query to select additional data 
$query05 = "SELECT name FROM users WHERE id='$userid"; 
$result05 = mysqli_query($mysqli, $query05); 
$row05 = mysqli_fetch_array($result05); 
$name = $row05[name ]; 

echo "Name: ".$name; 

// do more stuff 

// end of while loop 
} 

現在我想用預處理語句改寫這個。 我的問題:是否有可能在提取另一個準備好的語句時運行預準備語句?我仍然需要像我在$ name中使用的舊SQL代碼那樣的名稱。

這是迄今爲止所寫的內容。

$stmt0 = $mysqli->stmt_init(); 
$stmt0->prepare("SELECT postId,title,userid from post WHERE id=?"); 
$stmt0->bind_param('i', $id); 
$stmt0->execute(); 
$stmt0->bind_result($postId,$title,$userid); 
// prepare second statement 
$stmt1 = $mysqli->stmt_init(); 
$stmt1->prepare("SELECT name FROM users WHERE id= ?"); 
while($stmt0->fetch()) { 

$stmt1->bind_param('i', $userid); 
$stmt1->execute(); 
$res1 = $stmt1->get_result(); 
$row1 = $res1->fetch_assoc(); 

echo "Name: ".$row1['name'] ; 

} 

它返回一個錯誤在循環中的第二條語句:

Warning: mysqli_stmt::bind_param(): invalid object or resource mysqli_stmt in ... 

如果我使用的循環舊的方法,只是準備好的語句來獲取$名字它的工作原理。

+1

這個問題每天都在問。通常的三層結構:沒有錯誤報告,無法運行嵌套語句,必須使用JOIN來代替這些嵌套循環 – 2013-03-19 14:14:04

+0

@YourCommonSense ok ... – 2013-03-19 14:20:06

回答

2

實際上,你可以用一個JOIN版查詢做到這一點:

SELECT p.postId, p.title, p.userid, u.name AS username 
FROM post p 
JOIN users u ON u.id = p.userid 
WHERE p.id = ? 

在一般情況下,如果你正在運行在一個循環的查詢時,有可能是這樣做的更好的方法。

+0

感謝您的回答。 – 2013-03-19 14:25:53