6 votes

Mise à jour de plusieurs colonnes de tables MySQL à l'aide de tableaux avec PDO

J'essaie de faire passer toutes mes connexions MySQL de l'ancien système mysql_query à PDOs. J'essaie de mettre à jour plusieurs lignes et colonnes d'une table MySQL en utilisant différents tableaux et je reçois l'erreur suivante :

[42000] : Erreur de syntaxe ou violation d'accès : 1064 Vous avez une erreur dans votre syntaxe SQL ; vérifiez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '(accnt, car, radio, misc) values ('admin', '300.00', '400.00', '10.00') WHERE ID' à la ligne 1

A partir du code suivant :

$account = $_POST['account'];
$car_lease = $_POST['car_lease'];
$radio_lease = $_POST['radio_lease'];
$misc_lease = $_POST['misc_lease'];
$lease_ID = $_POST['lease_ID'];

//$data = array_map(null,$account,$car_lease,$radio_lease,$misc_lease);
$A = count($lease_ID);

try {
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $STH = $DBH->prepare('UPDATE lease (accnt, car, radio, misc) values (:account, :car_lease, :radio_lease, :misc_lease) WHERE ID = :lease_ID');
    $i = 0;
    while($i < $A) {
        $STH->bindParam(':account', $account[$i]);
        $STH->bindParam(':car_lease', $car_lease[$i]);
        $STH->bindParam(':radio_lease', $radio_lease[$i]);
        $STH->bindParam(':misc_lease', $misc_lease[$i]);
        $STH->bindParam(':lease_ID', $lease_ID[$i]);
        $STH->execute();
        $i++;
    }
}
catch(PDOException $e) {  
    echo "I'm sorry, but there was an error updating the database.";  
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

Je pense que ce problème est dû à la façon dont j'appelle le gestionnaire de déclaration, mais je ne suis pas sûr de la partie de ma syntaxe qui est incorrecte. Par ailleurs, est-ce la meilleure façon de gérer de telles situations ? Ou existe-t-il une meilleure méthode pour mettre à jour plusieurs lignes d'un tableau ?

17voto

Michael Berkowski Points 137903

Vous avez confondu la syntaxe entre INSERT y UPDATE déclarations. Au lieu d'un VALUES() vous avez besoin d'une SET clause :

$STH = $DBH->prepare('
    UPDATE lease 
    SET 
      accnt = :account, 
      car = :car_lease, 
      radio = :radio_lease, 
      misc = :misc_lease 
    WHERE ID = :lease_ID
');

Passez en revue le MySQL UPDATE référence syntaxique pour la spécification complète à utiliser avec UPDATE déclarations.

1voto

CairoCoder Points 345

Je pense que ce serait la solution la plus simple et la plus facile, si vous pouvez faire confiance à vos clés et à vos valeurs :

$update = 'SET ';
$fields = array_keys($_POST);
$values = array_values($_POST);
foreach ($fields as $field) {
    $update .= $field . '=?,';
}
$update = substr($update, 0, -1);
$db->query("update sub_projects ${update} where id=${_GET['id']}");
$db->execute($values);

0voto

viktorino Points 799

Une façon simple de mettre à jour plusieurs champs, mais il est très important que les entrées sur votre page d'édition soient dans le même ordre que votre table de base de données.

J'espère que cela vous aidera

if (isset($_POST['pageSubmit'])) {
echo '<pre>';
print_r($_POST['page']);
echo '</pre>';

 $fields = array('id','name','title','content','metaKey','metaDescr','metaTitle');//fields array

$fields = array_map(function($field){
return "`$field`";
},$fields);

$queryArray = array_combine($fields,$_POST['page']);//createng array for query

$countFields = count($queryArray);//getting count fields

$id = array_splice($queryArray , 0,-($countFields-1));//getting id of page

$insertArray = $queryArray;//getting new fields array without first key and value

function updatePage($db, array $fields, array $id){

    $where = array_shift($id);  
    $sql = array();
foreach ($fields as $key => $value) {

   $sql[] = "\n".$key."" ." = "."'".$value."'";
}
$sql = implode(",",$sql);

   try {

       $query = $db->prepare("UPDATE `pages` SET $sql WHERE `id` = $where ");           

       $query->execute();

   } catch (Exception $e) {

    echo $e->getMessage();

   }

 }

   updatePage($db, $insertArray, $id);

}

0voto

Tomek Points 21

Le meilleur moyen est CASE il est 3-4 fois plus rapide que la stmt préparée à l'avance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X