web-dev-qa-db-fra.com

Liaison de plusieurs valeurs dans pdo

Existe-t-il un moyen facile de lier plusieurs valeurs dans PDO sans répétition? Jetez un œil au code suivant:

$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();

Ici, j'ai lié des valeurs d'une manière répétée qui est 4 fois. Existe-t-il un moyen simple de lier plusieurs valeurs dans PDO?

22
Yousuf Memon

Vous pouvez toujours lier des valeurs dans les arguments de execute() tant que vous êtes d'accord avec les valeurs traitées comme PDO::PARAM_STR (chaîne).

$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'
));

Vous pouvez utiliser le tableau transmis comme n'importe quel tableau:

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

Si vous souhaitez effectuer une liaison en fonction du type (chaîne, entier, etc.), alors non. Si vous êtes d'accord pour tout lier sous forme de chaîne:

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

Pour ne jamais vraiment taper deux fois, vous pouvez utiliser un tableau pour fournir les données et utiliser une fonction sur ce même tableau pour sortir la partie de liaison de la requête MySQL. Par exemple:

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

Les noms de données et de colonnes proviennent d'un seul tableau associatif ($data). Ensuite, utilisez bindFields($data) pour générer une chaîne de paires column = :column À concaténer dans la requête 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) sortie:

 a_column_name=:a_column_name,another_column_name=:another_column_name 
2
equazcion