この質問について何か新しい活動があったので久しぶりだと思います。しかし、他の投稿者がコメントしたget_result()
ように、MySQLネイティブドライバー(mysqlnd)をインストールすることによってPHPでのみ利用可能になり、場合によっては、mysqlndをインストールすることが不可能または望ましくない場合があります。だから、私はこの答えを、get_result()
提供する機能をどのように得るかについての情報とともに投稿することは役立つだろうと思いました-を使わずにget_result()
。
get_result()
is / wasと組み合わせてfetch_array()
結果セットをループし、結果セットの各行からの値を数値インデックスまたは連想配列に格納することがよくあります。たとえば、次のコードは、get_result()とfetch_array()を使用して結果セットをループし、各行の値を数値インデックスの$ data []配列に格納します。
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
ただし、get_result()
が使用できない場合(mysqlndがインストールされていないため)、これを使用すると、結果セットの各行の値を配列に格納する方法に問題が生じget_result()
ます。または、get_result()
それなしで実行するために使用するレガシーコードを移行する方法(例:bind_result()
代わりに)-残りのコードへの影響を最小限に抑えます。
数値でインデックス付けされた配列に各行の値を格納することは、を使用してそれほど簡単ではないことがわかりますbind_result()
。 bind_result()
(配列ではなく)スカラー変数のリストが必要です。そのため、結果セットの各行からの値を配列に格納するためには、少し時間がかかります。
もちろん、コードは次のように簡単に変更できます。
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
ただし、これには、への呼び出しで$ data [0]、$ data [1]などを個別に明示的にリストする必要があるためbind_result()
、理想的ではありません。$ data [0]、$ data [1]、... $ data [N-1]を明示的にリストする必要がないソリューションが必要です(Nはselectステートメントのフィールド数です)。への呼び出しでbind_results()
。多数のクエリがあるレガシーアプリケーションを移行する場合、各クエリに含まれるフィールドの数が異なる場合があります。select
句にいる場合、移行は非常に労働集約的で、上記のようなソリューションを使用するとエラーが発生しやすくなります。
理想的には、「ドロップイン置換」コードのスニペットが必要です- get_result()
関数と次の行のwhile()ループを含む行のみを置換します。置換コードは、while()ループ内の行を含め、前の行または後の行に影響を与えることなく、置換するコードと同じ機能を持つ必要があります。理想的には、置換コードをできる限りコンパクトにしたいと考えています。また、フィールド内のフィールド数に基づいて置換コードを調整する必要はありません。select
あり、クエリの句の。
インターネット上で検索、私は使用するソリューションの数を発見したbind_param()
とcall_user_func_array()
(例えば、動的にバインドmysqli_stmtパラメータ、次いで結合結果(PHP) )、私は最終的に、連想配列に格納された結果にない導く見られるほとんどのソリューション数値でインデックス付けされた配列。これらのソリューションの多くは、私が望むほどコンパクトではなかった、および/または「ドロップイン置換」ほど適していませんでした。しかし、私が見つけた例から、私はこの解決策をまとめることができました。
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
もちろん、for()ループを1行にまとめてコンパクトにすることもできます。
これがbind_result()
、数値インデックス配列に各行の値を格納するために使用するソリューションを探している、および/またはを使用してレガシーコードを移行する方法を探しているすべての人に役立つことを願っていますget_result()
。コメントを歓迎します。
$stmt = $conn->mysqli->stmt_init();
?