2010-07-07 12 views
2

J'essaye de mettre à jour plusieurs lignes dans une table dans la base de données MySQL en faisant cela. Et ça ne marche pas.Mise à jour de plusieurs lignes dans MySQL

$query = "UPDATE cart SET cart_qty='300' WHERE cart_id = '21'; 
      UPDATE cart SET cart_qty='200' WHERE cart_id = '23'; 
      UPDATE cart SET cart_qty='100' WHERE cart_id = '24';"; 
mysql_query($query,$link);// $link is specified above 

Tout le monde sait ce qui ne va pas avec ceci.

+0

Utilisez-vous mysql ou mysqli? –

+0

Ressemble à trois requêtes distinctes (pourtant identiques structurelles) pour moi. Pourquoi voulez-vous les envoyer sous la forme d'une seule déclaration au lieu d'utiliser par exemple une déclaration préparée trois fois? – VolkerK

Répondre

5

De l'PHP documentation:

mysql_query() envoie une requête unique, (plusieurs requêtes ne sont pas pris en charge)

Le ; sépare les instructions SQL, vous devez séparer les requêtes si vous souhaitez continuer à utiliser la fonction mysql_query ...

+0

Eh bien, je sais que vous pouvez exécuter plusieurs requêtes de INSERT – Ross

+1

Les requêtes multiliple d'insertion tendent à être concaténées série d'ensembles de valeurs, combinées par une virgule: INSERT INTO panier (id, cart_qty) VALEURS (21,300), (23,200), (24,100) ; –

+0

@ Ross: Qu'est-ce que Brendan Bullen a dit ... –

3

mysql_query Impossible d'utiliser plusieurs requêtes.

Le plus simple est de les exécuter séparément. Je crois que vous pouvez faire des requêtes multiples, mais je ne l'ai pas essayé.

$updateArray = array(21=>300,23=>200,24=>100); 
foreach($updateArray as $id=>$value) 
{ 
    $query = "UPDATE cart SET cart_qty='$value' WHERE cart_id = '$id'"; 
    mysql_query($query,$link);// $link is specified above 
} 

Ceci acceptera une combinaison d'ID et de leur valeur de chariot correspondante. En boucle cependant, il construit la requête et l'exécute. Le tableau peut alors provenir d'une variété de sources (les résultats d'une autre requête, les entrées de formulaire ou, comme dans ce cas, les valeurs codées en dur)

Mise à jour:

Si vous avez vraiment besoin d'exécuter tout en un, Heres l'info PHP sur requête multiples:

mysqli::multi_query

0

Vous aurez besoin de les envoyer sous forme de requêtes distinctes. Pourquoi ne pas ajouter les requêtes en tant que chaînes à un tableau, puis parcourir ce tableau en envoyant chaque requête séparément?

Vérifiez également this thread for another idea

0

Ce n'est pas la meilleure méthode .. Mais si vous avez besoin de faire plusieurs requêtes vous pouvez utiliser quelque chose comme ...

function multiQuery($sql) 
{ 
    $query_arr = explode(';', $sql); 

    foreach ($query_arr as $query) 
    { 
    mysql_query($query); 
    } 
} 

un autre exemple d'une requête aide

function build_sql_update($table, $data, $where) 
{ 

    $sql = ''; 

    foreach($data as $field => $item) 
    { 
    $sql .= "`$table`.`$field` = '".mysql_real_escape_string($item)."',"; 
    } 

    // remove trailing , 
    $sql = rtrim($sql, ','); 

    return 'UPDATE `' . $table .'` SET '.$sql . ' WHERE ' .$where; 
} 

echo build_sql_update('cart', array('cart_qty' => 1), 'cart_id=21'); 
2

Vous pouvez le faire de cette façon:

UPDATE table 
    SET col1 = CASE id 
    WHEN id1 THEN id1_v1, 
    WHEN id2 THEN id2_v1 
    END 
    col2 = CASE id 
    WHEN id1 THEN id1_v2, 
    WHEN id2 THEN id2_v2 
    END 
    WHERE id IN (id1, id2) 

Cet exemple montre la mise à jour de deux colonnes différentes dans deux lignes différentes, ce qui vous permet d'étendre cette opération à davantage de lignes et de colonnes en regroupant une requête comme celle-ci. Il peut y avoir des problèmes de mise à l'échelle qui rendent l'instruction case inappropriée pour un très grand nombre de lignes.

Questions connexes