bind_result
対get_result
を使用して呼び出す方法の例と、一方を他方の上で使用する目的を確認したいと思います。
また、それぞれを使用することの長所と短所もあります。
どちらを使用する場合の制限は何ですか?違いがあります。
私にとっての決定要因は、*
を使用してクエリ列を呼び出すかどうかです。
bind_result()
を使用することをお勧めします。// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
get_result()
を使用することをお勧めします。// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
bind_result()
を使用した$query1
の例1$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Store the result (to get properties) */
$stmt->store_result();
/* Get the number of rows */
$num_of_rows = $stmt->num_rows;
/* Bind the result to variables */
$stmt->bind_result($id, $first_name, $last_name, $username);
while ($stmt->fetch()) {
echo 'ID: '.$id.'<br>';
echo 'First Name: '.$first_name.'<br>';
echo 'Last Name: '.$last_name.'<br>';
echo 'Username: '.$username.'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
get_result()
を使用した$query2
の例2$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Get the result */
$result = $stmt->get_result();
/* Get the number of rows */
$num_of_rows = $result->num_rows;
while ($row = $result->fetch_assoc()) {
echo 'ID: '.$row['id'].'<br>';
echo 'First Name: '.$row['first_name'].'<br>';
echo 'Last Name: '.$row['last_name'].'<br>';
echo 'Username: '.$row['username'].'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
ご覧のとおり、bind_result
と*
を併用することはできません。ただし、get_result
は両方で機能しますが、bind_result
はより単純で、$row['name']
の混乱を取り除きます。
長所:
$row['name']
をいじる必要はありませんfetch()
を使用します短所:
*
を使用するSQLクエリでは機能しません長所:
fetch_assoc()
を使用します短所:
$row[]
をいじる必要がありますそれぞれのマニュアルページで見つけることができる例。
長所と短所は非常に簡単ですが、
とにかく、もしあなたのアイデアがアプリケーションコードの中でどちらかの機能を使うことなら、このアイデアは間違っています。それでも、クエリからデータを返すメソッドにカプセル化されている限り、実際に使用するのは重要ではありません。bind_resultを実装するために10倍のコードが必要になるという事実を除きます。
私が気づいた主な違いは、bind_result()
がエラー2014
を与えることです。ネストされたコードをしようとすると$ stmtが他の$ stmtの中にあり、それはfetched( mysqli::store_result()
なし):
準備に失敗しました:(2014)コマンドが同期していません。今このコマンドを実行することはできません
メインコードで使用される関数。
function GetUserName($id)
{
global $conn;
$sql = "SELECT name FROM users WHERE id = ?";
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($name);
while ($stmt->fetch()) {
return $name;
}
$stmt->close();
} else {
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
}
}
メインコード。
$sql = "SELECT from_id, to_id, content
FROM `direct_message`
WHERE `to_id` = ?";
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param('i', $myID);
/* execute statement */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($from, $to, $text);
/* fetch values */
while ($stmt->fetch()) {
echo "<li>";
echo "<p>Message from: ".GetUserName($from)."</p>";
echo "<p>Message content: ".$text."</p>";
echo "</li>";
}
/* close statement */
$stmt->close();
} else {
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
}
get_result()は、MySQLネイティブドライバー(mysqlnd)をインストールすることにより、PHPでのみ使用できるようになりました。環境によっては、mysqlndのインストールが不可能または望ましくない場合があります。
それにもかかわらず、mysqliを使用して 'select *'クエリを実行し、フィールド名を使用して結果を取得できます-get_result()を使用するよりも少し複雑で、phpのcall_user_func_array()関数を使用する必要があります phpでget_result()の代わりにbind_result()を使用する方法 の例を参照してください。これは単純な 'select *'クエリを実行し、結果を(列名とともに)HTMLテーブルに出力します。
Store_resultとget_resultは両方ともテーブルから情報を取得するため、例2はこのようにしか機能しないと思います。
だから削除
/* Store the result (to get properties) */
$stmt->store_result();
そして、順序を少し変更します。これが最終結果です。
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Get the result */
$result = $stmt->get_result();
/* Get the number of rows */
$num_of_rows = $result->num_rows;
while ($row = $result->fetch_assoc()) {
echo 'ID: '.$row['id'].'<br>';
echo 'First Name: '.$row['first_name'].'<br>';
echo 'Last Name: '.$row['last_name'].'<br>';
echo 'Username: '.$row['username'].'<br><br>';
}
/* free results */
$stmt->free_result();