web-dev-qa-db-ja.com

PDOで複数の値をバインドする

繰り返しなしでPDOに複数の値をバインドする簡単な方法はありますか?次のコードを見てください。

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)");

$result_set->bindValue(':username', '~user');
$result_set->bindValue(':password', '~pass');
$result_set->bindValue(':first_name', '~John');
$result_set->bindValue(':last_name', '~Doe');

$result_set->execute();

ここでは、4回繰り返される方法で値をバインドしました。 PDOに複数の値をバインドする簡単な方法はありますか?

22
Yousuf Memon

値が_PDO::PARAM_STR_(文字列)として処理されていれば、execute()の引数内の値をいつでもバインドできます。

_$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)");
$result_set->execute(array(
    ':username' => '~user',
    ':password' => '~pass',
    ':first_name' => '~John',
    ':last_name' => '~Doe'
));
_

渡された配列は、他の配列と同じように使用できます。

_$user = "Nile";
$pdo->execute(array(":user" => $user));
_
34
jeremy

タイプ(文字列、整数など)に基づいてバインドする場合は、いいえ。すべてを文字列としてバインドすることに問題がない場合:

$stmt = $db->prepare("...");
$stmt->execute(array(
    'foo' => 'bar',
    'something' => 'else',
    'third' => 'thing',
));
6
Corbin

本当に2回入力しないようにするには、配列を使用してデータを提供し、同じ配列で関数を使用してMySQLクエリのバインディング部分を出力できます。例えば:

_function bindFields($fields){
    end($fields); $lastField = key($fields);
    $bindString = ' ';
    foreach($fields as $field => $data){ 
        $bindString .= $field . '=:' . $field; 
        $bindString .= ($field === $lastField ? ' ' : ',');
    }
    return $bindString;
}
_

データと列の名前は、単一の連想配列(_$data_)から取得されます。次に、bindFields($data)を使用して_column = :column_ペアの文字列を生成し、MySQLクエリに連結します。

_$data = array(
    'a_column_name' => 'column data string',
    'another_column_name' => 'another column data string'
);

$query = "INSERT INTO tablename SET" . bindFields($data);

$result = $PDO->prepare($query);
$result->execute($data);
_

bindFields($data)出力:

_ a_column_name=:a_column_name,another_column_name=:another_column_name 
_
2
equazcion