Je fait un update dans une table nommée "police", dans cette table j'ai 2 colonne : type_police et prix. Quand je décide de modifier une ligne précise de la colonne type_police, sans entré des chiffre pour le prix, il me met une erreur Data truncate (ce qui est normal).
Et, a contrario, quand je modifie une ligne précise de la colonne prix, sans entré un nouveau nom de police, la requête s'exécute mais la ligne de la colonne type_police est vide.
Mon but : dans les 2 CAS, je veux garder la valeur du champ qui n'est pas modifier.
Voici mon code :
<?php
$police_id = $_POST['police_id'];
$type_police_modif = $_POST['type_police_modif'];
$prix_police_modif = $_POST['prix_police_modif'];
$req = $pdo->prepare('UPDATE police SET type_police = :type_police, prix = :prix WHERE id = :police_id');
$req->execute(array(
'type_police' => $type_police_modif,
'prix' => $prix_police_modif,
'police_id' => $police_id));
$req -> closeCursor();
?>
Il faudrait ne pas faire figurer la colonne qui se retrouverait avec une valeur vide ('') en clause SET dans ce cas ou alors faire un UPDATE pour chaque colonne dont la nouvelle valeur n'est pas '' ...
... sauf que ça impliquerait plus de code et éventuellement de construire dynamiquement la requête (si on veut ne faire qu'un UPDATE) donc, AMHA, le plus simple, serait de binder NULL si la valeur est '' de façon à écrire en SET, colonne = COALESCE(:marqueur, colonne) et ainsi garder cette seule requête préparée. Le but étant de prendre la valeur actuelle de la colonne concernée si la valeur en POST est '' soit ne pas la modifier.
$req = $pdo->prepare('UPDATE police SET
type_police = COALESCE(:type_police, type_police),
prix = COALESCE(:prix, prix)
WHERE id = :police_id');
$req->execute([
'type_police' => $type_police_modif == '' ? NULL : $type_police_modif,
'prix' => $prix_police_modif == '' ? NULL : $prix_police_modif,
'police_id' => $police_id,
]);
(ces foutus > sont des >)
Avec MySQL, on pourrait utiliser un simple IF et garder la chaîne vide plutôt qu'employer COALESCE et en "réécrivant" en PHP '' en NULL (ce qui donnerait colonne = IF(:marqueur = '', colonne, :marqueur) à la place de colonne = COALESCE(:marqueur, colonne) mais cette répétition du même marqueur nommé n'est possible qu'avec l'émulation).
PS : toujours pour MySQL, ici, les fonctions COALESCE et IFNULL sont interchangeables
D'ailleurs, comment tu te retrouves avec '' ? Parce qu'en général on remet les valeurs actuelles en value des input.
$sql="UPDATE police SET ";
if ($type_police_modif!='' AND $prix_police_modif!=0){
$sql.="type_police = :type_police prix= :prix";
$params=array($type_police_modif,$prix_police_modif);
}elseif($type_police_modif=='' AND $prix_police_modif!=0){
$sql.="prix= :prix_police_modif";
$params=array($prix_police_modif);
}elseif[$type_police_modif!='' AND $prix_police_modif==0){
$sql.="type_police= :type_police_modif";
$params=array($type_police_modif);
}
$sql.=" WHERE id= :police_id";
$req->prepare($sql);
$params[]=police_id;
$req->execute($params);
Conserver ancienne donnée avec une requête UPDATE
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli