2010-05-14 7 views
0

J'utilise Postgresql + PHP.Comment mettre à jour plusieurs lignes avec une seule requête

Dire que j'ai ce tableau:

Books (id, title, year) 

et ce tableau de titres en PHP:

$titles = array ("bible","kafka","Book of Eli"); 

maintenant je veux mettre à jour toutes les lignes où le titre est dans le tableau de titres $ ci-dessus.

Je besoin d'une requête comme ceci:

UPDATE books SET year = '2001-11-11' WHERE title is in $titles; 

Est-il possible avec une seule requête? Ou dois-je utiliser une boucle FOR?

+0

Vous mettez à jour la date de la même valeur tous les cas où le titre est dans le tableau ou est-ce que différents titres auront des dates différentes? – TooManyCooks

+0

oui, ce n'est qu'un exemple :) – xRobot

Répondre

4

C'est possible, vous étiez en fait assez proche.

Pour SQL, la syntaxe ressemble à ceci:

UPDATE books SET year = '2001-11-11' WHERE title IN ('bible','kafka','Book of Eli'); 

Pour générer qu'utiliser PHP, vous aurez envie de faire quelque chose comme ceci:

$query = "UPDATE books SET year = '2001-11-11' WHERE title IN ('" . implode("','", $titles) . "');'"; 

La fonction PHP implode() rejoint tableau éléments ensemble en utilisant une chaîne, donc je mets ',' entre chacun d'eux, avec le ' initial et final étant mis dans la chaîne manuellement.

Notez que cela échouera actuellement si l'un des titres contient une apostrophe. Si c'est une possibilité, vous aurez besoin d'échapper à ceux-ci.

+0

On dirait que vous me battez à la poste. –

+0

Bonne réponse, mais le manuel PHP dit: "La chaîne de requête ne devrait pas se terminer par un point-virgule." –

+0

N'OUBLIEZ PAS d'appeler pg_escape_string() sur ces titres avant de les imploser! – intgr

1

Vous pouvez utiliser la fonction implode(), qui vous permettra de transformer le tableau en une chaîne séparée par des virgules:

$titles = array ("bible","kafka","Book of Eli"); 
$comma_separated = implode(",", $array) 
$sql = "UPDATE books SET year = '2001-11-11' WHERE title is in (" . $comma_separated .")" 
+0

Vous n'avez pas cité les chaînes, ne fonctionne pas actuellement. –

1

Qu'en est-

$sql = "UPDATE books SET year = '2001-11-11' WHERE title in ('".implode("','",$titles)."')"; 
+1

J'ai oublié la première/dernière citation, votre chaîne ressemblerait à: 'O WH titre IN (bible ',' kafka ',' Livre d'Eli)' –

+0

Je pense que vous avez manqué l'ouverture et la fermeture 'vous avez ceux entre le valeurs implosées. – TooManyCooks

+0

Cest vrai. Fixé. Merci –

Questions connexes