Page 1 sur 1

Problème update mysql

Posté : 17 avr. 2016, 21:09
par Seymon
Bonjour à tous !

Je rencontre un petit problème pour la mise à jour d'un enregistrement SQL. Il s'agit d'un script d'ajout / modification / suppression de news, jusque là, rien de bien compliqué.

L'ajout et la suppression fonctionnent sans problème, il y a juste un "hic" à la modification: la modification est bien prise en compte en local (easyPhp 14.1), mais pas quand je le fais online chez mon hébergeur (OVH). Franchement, bizarre !

Le script complet est ci-dessous: il s'agit d'un seul code me permettant d'ajouter OU de modifier un enregistrement SQL, en fonction de la valeur ID :

Code : Tout sélectionner

<?php if(isset($_POST['titre']) && isset($_POST['texte']) && isset($_POST['statut'])){ //Si les variables sont déclarées if($_POST['titre']!=NULL && $_POST['texte']!=NULL && $_POST['statut']!=NULL){ //Si les variables ne sont pas vides if ($_POST['id_news'] == 0){ //s'il s'agit d'une nouvelle news $date=date("d-m-Y H:i:s"); $titre=addslashes($_POST['titre']); $texte=addslashes($_POST['texte']); $statut=$_POST['statut']; $bdd -> exec("INSERT INTO aer_news VALUES ('', '$date', '$titre','" . nl2br($texte) . "', '$statut')"); if($statut=='1'){ // si elle était déjà en ligne echo'<p>News postee avec succes</p>'; } else{ echo'<p>Enregistrement effectue, mais a valider ulterieurement</p>'; } } else{ // Sinon, c'est une modification: on update $_POST['id_news'] = addslashes($_POST['id_news']); $bdd -> exec("UPDATE aer_news SET titre='" . $_POST['titre'] . "', texte='" . nl2br($_POST['texte']) . "' WHERE id='" . $_POST['id_news'] . "'"); echo'<p>News mise a jour avec succes!</p>'; } } else{ echo'erreur'; } } else{ echo'erreur'; } ?>
Je précise simplement que la modification n'est pas effecutée au final, MAIS que la ligne "mise à jour avec succès" apparaît quand même. Honnêtement, je suis perdu.

Merci d'avance pour votre aide, et très bonne soirée ! :-)

Re: Problème update mysql

Posté : 17 avr. 2016, 21:17
par or 1
test en local sans ' dans la zone de texte, et avec ' chez ovh ?

Re: Problème update mysql

Posté : 17 avr. 2016, 21:22
par Seymon
test en local sans ' dans la zone de texte, et avec ' chez ovh ?
il prend effectivement la modification en compte pour certains articles, mais pas d'autres. Et je n'arrive pas à comprendre sur base de quoi le script se base pour modifier ou non. Y aurait-il qqch à corriger dans mon code? Ou erreur de syntaxe?

Re: Problème update mysql

Posté : 19 avr. 2016, 15:16
par Ryle
Bonjour,

Si le message de succès apparaît, c'est qu'il n'y a pas d'erreur au niveau de php. En revanche si ton enregistrement n'est pas mis en jour en base de données, c'est que tu as un problème avec la requête SQL. Vérifie que tes tables et colonnes sont identiques en local et sur ton serveur.

Tu peux également tester le résultat du exec et en cas d'erreur afficher les messages SQL généré. Une autre solution simple consiste à afficher la requête SQL générée et à tester celle-ci directement dans un phpMyAdmin...
$sql = "UPDATE aer_news SET titre='" . $_POST['titre'] . "', texte='" . nl2br($_POST['texte']) . "' WHERE id=" . $_POST['id_news'];
$success = $bdd -> exec($sql);
if ($success === false) {
  print_r($bdd->errorInfo(), true);
  echo $sql;
}
A noter que :
- si la colonne id est numérique, les valeurs que tu passes ne devraient pas être délimitées par des apostrophes (réservées aux chaines, textes, dates, ...),
- si le titre ou le texte contiennent des apostrophes et que la directive magic_quotes n'est pas activée sur le serveur, celles-ci ne seront pas protégées et généreront des erreurs SQL...

Re: Problème update mysql

Posté : 21 avr. 2016, 11:47
par Seymon
Merci beaucoup pour ta réponse, Ryle. J'ai mis le doigt sur ce qui pose problème: c'est lorsque j'ai un ' (apostrophe) dans le titre ou dans le contenu du message que la modification n'est pas prise en compte. Par contre, pour l'ajout d'un nouveau message, le fait qu'il y ait des apostrophes ne pose pas de problème pour l'ajout en SQL.

Y a-t-il une option pour "contourner" ce problème? :-)
Bonjour,

Si le message de succès apparaît, c'est qu'il n'y a pas d'erreur au niveau de php. En revanche si ton enregistrement n'est pas mis en jour en base de données, c'est que tu as un problème avec la requête SQL. Vérifie que tes tables et colonnes sont identiques en local et sur ton serveur.

Tu peux également tester le résultat du exec et en cas d'erreur afficher les messages SQL généré. Une autre solution simple consiste à afficher la requête SQL générée et à tester celle-ci directement dans un phpMyAdmin...
$sql = "UPDATE aer_news SET titre='" . $_POST['titre'] . "', texte='" . nl2br($_POST['texte']) . "' WHERE id=" . $_POST['id_news'];
$success = $bdd -> exec($sql);
if ($success === false) {
  print_r($bdd->errorInfo(), true);
  echo $sql;
}
A noter que :
- si la colonne id est numérique, les valeurs que tu passes ne devraient pas être délimitées par des apostrophes (réservées aux chaines, textes, dates, ...),
- si le titre ou le texte contiennent des apostrophes et que la directive magic_quotes n'est pas activée sur le serveur, celles-ci ne seront pas protégées et généreront des erreurs SQL...

Re: Problème update mysql

Posté : 21 avr. 2016, 16:01
par Ryle
J'aurais tendance à dire qu'il faut faire pour l'update comme tu fais pour l'insert ;)

Actuellement, tu utilises la valeur envoyée par l'utilisateur sans aucun contrôle. Si le titre est " L'apostrophe ", ta requête devient :
UPDATE aer_news SET titre='L'Apostrophe'
ce qui engendre une erreur sql :)

La directive magic_quotes lorsqu'elle est active sur le serveur ajoute automatiquement un antislash devant les apostrophes et guillemets des variables reçues en get, post ou cookie. Si elle n'est pas active, il faut protéger tes chaines avec un addslashes() par exemple ou mieux encore mysql_real_escape_string() ou PDO::quote() pour les enregistrements en base.
UPDATE aer_news SET titre='L\'Apostrophe'
Mais le besoin n'est pas seulement de protéger les apostrophes, il faut aussi contrôler les variables reçues pour éviter les injections SQL qui pourraient permettre à un hacker d'utiliser ton script pour exécuter ses propres requêtes sur ta base de données. Avec PDO tu peux aussi utiliser les requêtes préparées, bien qu'elles ne suffisent pas à elles seules à garantir une protection complète, elles découragent les amateurs :)
(Pour autant, une requête préparée qu'on exécute qu'une seule fois, ça perd beaucoup de son intérêt à mon sens :))