8768 sujets

Développement web côté serveur, CMS

Bonjour à tous
J'ai une table 'Users' dans une base de donnée mySQL avec
une colonne 'userID' qui est déclarée comme index et une colonne 'userName' qui contient un nom de personne (et d'autres colonnes bien entendu).
Dans un tableau PHP je dispose d'une liste de paires [userID, userName] sous la forme

$data = ['user1' => 'name1',  'user2' => 'name2', ...];

Je cherche à mettre à jour ma table ce qui me conduit à quelque chose comme

$sql = <<<SQL
    INSERT INTO Users (userID, userName) VALUES (:user, :name) 
    ON DUPLICATE KEY UPDATE  (userID, userName) VALUES (:user2, :name2) ;
SQL;
$stmt = $database -> pdo -> prepare($sql)
foreach($data as $user => $name) {
    $stmt -> bindValue(':user', $user);
    $stmt -> bindValue(':user2', $user);
    $stmt -> bindValue(':name', $name);
    $stmt -> bindValue(':name2', $name);
    $stmt -> execute();
}

ou bien créer un tableau de valeurs et le passer dans execute(), mais ça ne change pas grand chose

Cela me semble très lourd, en particulier le fait de devoir exécuter autant de requêtes qu'il y a d'entrées dans mon tableau.

Auriez vous une idée pour simplifier ce code?
Merci de vos conseils.
Modifié par PapyJP (04 Oct 2021 - 12:39)
Salut,

Pour faire de l'insert multiple, ça risque de compliquer l'écriture de ta requête (en gros je pense qu'il va falloir faire une boucle pour rajouter autant de (?, ? ) que nécessaire pour ton tableau de user et donner ça a préparer comme requête). Je ne suis pas du tout convaincu que tu auras un gain quelconque, que ce soit en terme de simplicité de code ou de performance Smiley ohwell
Merci de ta réponse
Si je comprends bien la doc, on peut faire des insert multiples mais pas des update multiples.
Modérateur
Et l'eau,

Avec PDO, tu ne peux pas faire l'insert multiple. Regarde du côté de mysqli. Pour l'update, regarde peut être du côté de CASE/WHEN/THEN