0

プリペアドステートメントを使用してSQLクエリを変更しようとしています。アイデア:whileループを使用してデータベースから複数のレコードを取得し、ループ内のデータベースからいくつかの追加データを取得しています。

これは私の古い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'] ;

}

ループ内の2番目のステートメントに対してエラーを返します。

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

ループに古いメソッドを使用し、プリペアドステートメントだけを使用して$ nameをフェッチすると、機能します。

4

1 に答える 1

2

JOIN実際には、単一のed クエリでこれを行うことができます。

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 = ?

一般に、クエリをループで実行している場合は、おそらくもっと良い方法があります。

于 2013-03-19T14:15:20.710 に答える