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

이 질문은 매일 묻습니다. 일반적인 triplex : 오류보고 없음, 중첩 된 문을 실행할 수 없음, 중첩 된 루프 대신 사용해야하는 JOIN –

+0

@YourCommonSense ok ... –

답변

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

답변 해 주셔서 감사합니다. –