2013-03-19 131 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