PHPのmysqliデータアクセス関数を混合していますか?
質問
過去数日間に mysqli
を使用したいくつかの質問を見ましたが、答えは $ stmt-> execute()の違いを認識していないようです
および $ db-> query()
。
理解したように、 mysqli
の結果にアクセスするための2つの異なるモデルがあります。
これは生のSQLを使用し、プログラマがSQLインジェクション攻撃を防ぐために入力をエスケープする必要がありますが、プログラマは column =>を含む連想配列(またはプレーン配列)を取得できます。値
マッピング:
$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
# do something with $row['fieldname'];
}
別の方法として、これを行うこともできます。これにより、パラメーターと結果の適切なバインドが可能になりますが、単純な配列結果の種類を提供できません(
)。$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
# do something with $output_col1 and $output_col2
}
私の質問は- mysqli
を使用して、最初のパターンで示されている単純な配列出力を取得する方法はありますか?
とにかく見つけることができません(代わりに PDO
を使用する以外!)。
解決
PHPマニュアルのこのページのコメントに、この種のことを行う関数の実装が複数あります: mysqli_stmt :: fetch
他のヒント
Alnitak、
不明な点として、フェッチした結果に配列全体を自動的にバインドすることはできません。残念ながら。ただし、配列の振る舞いを探している場合(おそらく結果を渡すのが簡単なため)、これを試すことができます:
<?php
$dbh = new mysqli( ... );
$arr = array();
if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
{
$stmt->execute();
$stmt->bind_result( $arr['id'], $arr['email'] );
while( $stmt->fetch() )
DoSomething( $arr );
}
?>
これにより、上記の要求した動作が得られます。ただし、配列フィールドを配列内の連想インデックスに動的にバインドしません。つまり、idを$ arr ['id']などにバインドするように指定する必要があります。
連想インデックスへの動的バインディングが本当にシナリオで必要な場合、選択したフィールドのクエリを最初に解析し、次に連想配列インデックスを設定してからクエリを実行する単純なクラスを常に作成できます。
いいえと言います。 mysqli
や準備されたステートメントを大量に扱ったことはないと思いますが、2番目の例の各ステップは個別で必要だと思います。私があなたに与えることができる唯一の慰めは、最初の例が、2番目の例で安全かつ真に無視できるいくつかのSQLエスケープについて説明したことです。