2

実行するためにループで変数を渡す方法??? ここでの1つの答えからの例...

$placeholders = array_fill(0, count($array), '?');

$keys = $values = array();
foreach($array as $k => $v) {
    $keys[] = $k;
    $values[] = !empty($v) ? $v : null;
}

$stmt = $mysqli->stmt_init();
$query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
         '('.implode(',', $keys).') VALUES '.
         '('.implode(',', $placeholders).')';
$stmt->prepare($query);

call_user_func_array(
    array($stmt, 'bind_param'), 
    array_merge(
        array(str_repeat('s', count($values))),
        $values
    )
);

$stmt->execute();

しかし、複数のアレイについてはどうでしょうか。db 10000の値を追加したいのですが、パスごとにステートメントをビルドしてバインドしたくないのですが、可能ですか?だから私は配列からステートメントを構築し、パラメータをバインドしたい(方法はわかりません)。ループパス変数(キーで識別)よりも実行...

すべてのテーブルにステートメントを記述しない場合は、何か普遍的なものになります(列名と変数の配列を作成するだけです)

4

1 に答える 1

0

プリペアド ステートメントと mysqli を使用する場合は、バインドされたパラメーターに格納されている値を変更して、execute をもう一度実行するだけです。これがバインドされたパラメーターのポイントであり、クエリを再送信するオーバーヘッドなしでステートメントを複数回実行できるようにします (これも本質的に優れたセキュリティに加えて、それは重要ではありません)。

たとえば、次のとおりです。

$param1 = '';
$param2 = '';
$param3 = '';
$param4 = '';
$query = 'INSERT INTO table VALUES (?, ?, ?, ?)';
$format = 'ssss';
$params = array(&$param1, &$param2, &$param3, &$param4);
$stmt = $mysqli->stmt_init();
$stmt->prepare($query);
$params = array_merge(array($format), $params); #set up format and parameters for binding
call_user_func_array(array($stmt, 'bind_param'), $params); #parameters specified so bind them


foreach($data as $data_point){
    $param1 = $data_point[0];
    $param2 = $data_point[1];
    $param3 = $data_point[2];
    $param4 = $data_point[3];
    $stmt->execute();
}

これにより、ステートメントが準備され、 $data に格納されているデータをループ処理して各値を取得し、それを準備済みパラメーターに入れ、新しいパラメーターを使用してステートメントを実行します。

この特定のコードでは、SQL エラー ステートメントのチェックを行わず、多くのアプリケーションで 1 回の挿入で複数の行を実行する方がはるかに効率的であるため、走行距離は異なります。

于 2012-10-31T18:04:45.940 に答える