Aller au contenu

Problème MySQL avec UPDATE


Sujets conseillés

Posté (modifié)

Bonsoir à toutes et à tous,

Ceci est mon premier message et c'est pour demander de l'aide ;)

Mais tout d'abord je tiens à féliciter tous les participants de ce site/forum car on y trouve vraiment des aides et conseils très précieux pour nous les webmasters :hypocrite:

Donc je me lance en ésperant que quelqu'un aura une petite idée de solution.

J'ai donc un site (http://www.francemanager.net) qui possède une administration que j'ai réalisé afin d'ajouter/editer/supprimer divers articles, une administration basique.

Voilà mon problème, en local tout se passe sans aucun problème, je peux ajouter, modifier et supprimer à mon gré, mes requêtes SQL sont toujours bonnes.

Mais j'ai mis ma nouvelle console d'administration en ligne sur mon site aujourd'hui et à chaque fois que je tente d'éditer un article, la requête est éxécutée mais tout les champs sensés être modifiés se retrouvent vide.

(Les requêtes d'ajout et de suppression focntionnent sans problème par contre)

Je n'arrive pas à comprendre pourquoi quand j'utilise les requêtes de ce style :

UPDATE cr_news SET auteur = \"$_POST[auteur]\", titre = \"$_POST[titre]\", genre = \"$_POST[genre]\" where id = '$id'";

Et que à l'affichage de cette requête j'ai tout qui est bon, ex :

UPDATE cr_news SET auteur = "Bridou", titre = "Toujours plus grand", genre = "Site" where id = '29'

Le résultat est que je perd toutes les anciennes informations et que les champs de ma table se retrouvent vide.

Alors que si je recopie la requête telle quelle dans PHP MyAdmin, et bien elle est valable et fonctionne bien.

Je sais que ca peut paraître bizarre et pas évident à comprendre mais je suis bien embêter car dès que je veux corriger les fautes d'un article, par exemple, et bien tout s'efface sans raison valable...

Que puis-je dire d'autre qui puisse vous aider :

Pour tout ce qui est base de données j'utilise un classe que j'ai trouvé sur internet qui gère la connection, les requêtes etc.. et qui en local fonctionne parfaitement.

Je m'en remet à vos connaissance en ésperant que vous ayez quelques idées d'où pourrait provenir le problème car je ne vois vraiment pas quoi changer, en local ca fonctionne, la requête comporte bien tout les bons champs, je l'affiche avant de l'éxécuté et tout est correct.

Et paf le bon enregsitrement est modifié mais toutes les donnés sont "vides".

Merci d'avance, et si vous avez besoin de plus amples informations, n'hésitez pas ;)

P.S : Voici la structure de ma table, au cas où...

CREATE TABLE `cr_news` (
 `id` int(11) NOT NULL auto_increment,
 `ladate` datetime NOT NULL default '0000-00-00 00:00:00',
 `auteur` varchar(30) default NULL,
 `genre` varchar(255) NOT NULL default '',
 `titre` varchar(100) NOT NULL default '',
 `corps` longtext NOT NULL,
 PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=33;

Bridou

Modifié par Bridou
  • Réponses 60
  • Créé
  • Dernière réponse

Contributeurs actifs dans ce sujet

Contributeurs actifs dans ce sujet

Posté
UPDATE cr_news SET auteur = "Bridou", titre = "Toujours plus grand", genre = "Site" where id = '29'

Le résultat est que je perd toutes les anciennes informations et que les champs de ma table se retrouvent vide.

le resultat ci dessus , c'est en local ou sur ton site web?

parce qu'a mon avis, je pense que tu as des versions différentes de php entre tes 2 environnements (1 version < php 4.1.0 et une version > php 4.1.0) et ta requete doit plutot ressembler a ceci

UPDATE cr_news SET auteur = "", titre = "", genre = "" where id = '29'

remarque que pour l'$id, c'est la seule variable qui n'est pas du genre $_POST

toujours dans la meme idée, je remplacerais tes $_POST par $HTTP_POST_VARS

pour obtenir :

UPDATE cr_news SET auteur = \"$HTTP_POST_VARS[auteur]\", titre = \"$HTTP_POST_VARS[titre]\", genre = \"$HTTP_POST_VARS[genre]\" where id = '$id'";

Posté

Alors, dans l'ordre :

1) C'est le résultat obtenu aussi bien en local ...qu'en ligne, malheureusement.

2 ) Pour les versions de PHP c'est ce que j'ai pensé peut être, ou un problème de configuration, j'ai écris à mon hébergeur et j'attend sa réponse.

3) En cas j'essairai la solution $HTTP_POST_VARS, sait on jamais, même si avec $_POST, la requête est correctement affichée mais mal éxécutée.

Merci pour ton aide.

Posté

Je vais essayer car mon code est beaucoup découpé pour me simplifier un peu la vie :)

(c'est du codage maison donc surement "dégeulasse" :D)

Donc dans mon fichier j'ai plusieurs fonctions, le principe est le suivant :

Quand je clique sur Editer

Si j'ai passé la relference de l'article j'edite

Sinon j'affiche a liste des articles

(Juste pour information, la classe de DB se trouve en fin de sujet mais pour comprendre de suite :

$BDD_EDITER->Requete() : execute la requete passée en parametre

$BDD_EDITER->ligne_suivante() : renvoie un Array

)


function Editer($reference="")
{
Global $session , $rubrique;
$BDD_EDITER = new DB;

if(!empty($reference))
{
$rub = array("FM Infos","Joueurs","Equipes","Entrainements","Tactiques","Graphismes","Downloads","Records","Communauté","Site","Forum");

  $BDD_EDITER->Requete("select * from cr_news where id = '$reference'");
  $r = $BDD_EDITER->ligne_suivante();  
 
echo "<table width=\"620\" border=\"0\" cellspacing=\"10\">
   <tr>
     <td align=middle>
 <form method=\"post\" action=\"*****.php?session=".$session."&rubrique=$rubrique&action=editerBDD&reference=".$reference."\">

  Auteur :</td><td>
  <input type=\"text\" name=\"auteur\" value=\"$r[auteur]\">
  </td></tr><tr><td align=middle>
  Rubrique associée à cette info :</td><td>
  <select name=\"genre\">";
      for($i=0;$i<11;$i++)
      {
       if($rub[$i]==$r[genre])
        $select = "selected";
       else
        $select = "";
       
        echo"<option value=\"$rub[$i]\" $select >".ucfirst($rub[$i])."</option>";
      }
  echo"
    </select>        
  </td></tr><tr><td align=middle>
 Titre de l'info :</td><td>
  <input type=\"text\" name=\"titre\"  size=50 value=\"$r[titre]\">
  </td></tr><tr><td align=middle colspan=2>
 Contenu de l'info : <br>
  <textarea name=\"contenu\" cols=\"90\" rows=\"30\">$contenu</textarea>
  <br>
    <input type=\"submit\" name=\"Submit\" value=\"Valider\">
   
 </form>
     </td>
   </tr>
 </table>";  
}
else
{
  Liste("editer");
}
}

Donc si j'ai passé l'identifiant de l'article j'obtiens par exemple ceci :

IMAGE DE L'ADMIN

Puis donc si je clique sur Valider, j'arrive dans la fonction EditerBDD :


function EditerBDD($id)
{
$BDD_EDITER = new DB;
 if (isset($id))
 {
  if ($BDD_EDITER->Requete("UPDATE cr_news SET auteur = \"$_POST[auteur]\", titre = \"$_POST[titre]\", genre = \"$_POST[genre]\" where id = '$id'"))
  {
   echo "Les modifications dans la base de données ont été effectuées.";
  }
  else
  {
   echo "Une erreur est intervenue";
  }
 }
 else
 {
  echo "L'id n'est pas bon : $id";
 }
}[/code]

Et donc, étant en ligne, si je fait :

[code]
echo "UPDATE cr_news SET auteur = \"$_POST[auteur]\", titre = \"$_POST[titre]\", genre = \"$_POST[genre]\" where id = '$id'";

J'obtiens

CET ECRAN

Et j'ai bien le message : "Les modifications dans la base de données ont été effectuées."

Voici la classe contenant la gestion de la BDD au cas où :


class DB {


       var $Host   = SQL_HOST;    // Hostname of our MySQL server
       var $Database  = SQL_BDD;     // Logical database name on that server
       var $User   = SQL_USER;    // Database user
       var $Password  = SQL_PASSWORD;// Database user's password

       var $Link_ID    = 0;           // Result of mysql_connect()
       var $Query_ID = 0;           // Result of most recent mysql_query()
       var $Resultat  = array();     // Current mysql_fetch_array()-result
       var $ResultatF;
       var $Row;                      // Current row number
       var $Errno   = 0;           // Error state of query
       var $Error   = "";

#
# Create a link id to the MySQL database
# Allow to call $var = new DB($otherhost,$otherDB,$otheruser,$otherpass);
# where $other* are connections vars different from
# $this->Host, etc
#
       
function DB($altHost = "",$altDB = "",$altUser = "",$altPassword = "") {
 if ($altHost == "")
  $altHost = $this->Host;
 if ($altDB == "")
  $altDB = $this->Database;
 if ($altUser == "")
  $altUser = $this->User;
 if ($altPassword == "")
  $altPassword = $this->Password;

 $this->Host = $altHost;
 $this->Database = $altDB;
 $this->User = $altUser;
 $this->Password = $altPassword;
}

   #
   # Stop the execution of the script
   # in case of error
   # $msg : the message that'll be printed
   #
   
   function halt($msg) {
       echo("<FONT COLOR=\"#FFFFFF\"><B>Database error:</B> $msg<BR>\n");
       echo("<B>MySQL error</B>:
        $this->Errno ($this->Error)<BR>
        <BR></FONT><H1>Le site est en travaux...
        Merci de repasser plus tard</H1>\n");
       die("Session halted.");
   }


#
# Connect to the MySQL server
#

function connect() {
 global $DBType;
 
 if($this->Link_ID == 0) {
  $this->Link_ID = mysql_connect($this->Host,
          $this->User,
          $this->Password);
  if (!$this->Link_ID) {
   $this->halt("Link_ID == false, connect failed");
           }
           $SelectResult = mysql_select_db($this->Database, $this->Link_ID);
  if(!$SelectResult) {
   $this->Errno = mysql_errno($this->Link_ID);
   $this->Error = mysql_error($this->Link_ID);
   $this->halt("cannot select database <I>".$this->Database."</I>");
  }
 }
}

#
   # Send a query to the MySQL server
   # $Query_String = the query
   #
   
   function requete($Req) {
 
 $this->connect();
 $this->Query_ID = mysql_query($Req,$this->Link_ID);
       $this->Row = 0;
       $this->Errno = mysql_errno();
       $this->Error = mysql_error();
       if (!$this->Query_ID) {
  $this->halt("Invalid SQL: ".$Req);
 }
 return $this->Query_ID;
}

#
# return the next record of a MySQL query
# in an array
#

   function ligne_suivante() {
 $this->Resultat = mysql_fetch_array($this->Query_ID);
 $this->Row += 1;
 $this->Errno = mysql_errno();
 $this->Error = mysql_error();
 $stat = is_array($this->Resultat);
 if (!$stat) {
  mysql_free_result($this->Query_ID);
  $this->Query_ID = 0;
 }
 return $this->Resultat;
   }

#
# return the next record of a MySQL query
# in an array
#

   function ligne_suivanteF() {
 $this->ResultatF = mysql_fetch_object($this->Query_ID);
 $this->Row += 1;
 $this->Errno = mysql_errno();
 $this->Error = mysql_error();
 $stat = is_array($this->ResultatF);
 if (!$stat) {
  mysql_free_result($this->Query_ID);
  $this->Query_ID = 0;
 }
 return $this->ResultatF;
   }

#
# Return the number of rows affected by a query
# (except insert and delete query)
#

function nbre_resultats() {
 return mysql_num_rows($this->Query_ID);
}

#
# Return the number of affected rows
# by a UPDATE, INSERT or DELETE query
#

   function nbre_lignes_modifiees() {
 return mysql_affected_rows($this->Link_ID);
}
   
   #
   # Return the id of the last inserted element
   #
   
function dernier_id() {
 return mysql_insert_id($this->Link_ID);
}

#
# Optimize a table
# $tbl_name : the name of the table
#

function optimize($tbl_name) {
 $this->connect();
 $this->Query_ID = _AT_mysql_query("OPTIMIZE TABLE $tbl_name",$this->Link_ID);
}

#
# Free the memory used by a result
#

function clean_results() {
 if($this->Query_ID != 0) mysql_freeresult($this->Query_ID);
}

#
# Close the link to the MySQL database
#

function close() {
 if($this->Link_ID != 0) mysql_close($this->Link_ID);
}

function changer_BDD()
{
 mysql_select_db($this->Database);
}
}
?>

En ésperant que cela vous aide, encore merci.

Posté

Je ne comprend vraiment rien !

J'ai remarqué un truc vraiment bizarre, quand j'ajoute un article et qu'après je veux l'éditer j'ai donc le problème que mes champs se retrouvent vide.

Mais si je clique sur le bouton précédent, j'ai le message qui me dit "Attention.. l'action va être refaite si vous cliquez sur OK parceque c'est un formulaire...".

Et si je clique sur OK, il refait donc la requête et là les changements sont effectués.

Et par la suite si je fais de nouvelles éditions, et bien ca fonctionne correctement...

C'est à ni rien comprendre, mais ca ne résoud pas mon problème, je ne vais pas dire à ceux qui bossent avec moi :

"Pour éditer vous cliquez sur Valider, puis vous revenez en arrière, vous cliquez sur OK et c'est bon"...

Je ne comprend donc pas pourquoi la première édition plante et après avec le même code et les même manipulations cela fonctionne...

De quoi cela peut il venir ?

Posté

Salut à toi ;)

Tu devrais essayer ça comme requète :

UPDATE cr_news SET auteur = '$_POST[auteur]', titre = '$_POST[titre]', genre = '$_POST[genre]' where id = '$id'"

Moi je fais plutôt avec des apostrophes qu'avec des guillemets... Il pourrait y avoir des guillemets dans un de tes champs, qui arrêterait la requète, et donc qui ferait tout merder... Mais bon, c'est juste une idée, je me goure peut-être totalement !

Sinon, l'echo de la requète, tu le fais dans quel fichier ? Il faudrait le faire directement dans ta fonction requete($req) en fait, pour être sûr que tout est bien passé!

Par contre ta dernière observation va contre toute hypothèse, je vois pas en quoi un refresh de la page peut faire marcher la requète correctement :|

Posté

Alors pour ta première solution, j'ai utilisé les \" car justement s'il y'a des apostrophes ils seront bien interpretés, alors que dans ton cas si le titre d'une news s'appelle par exemple :

"C'est l'été"

Et bien là il y aura erreur à cause des apostrophes, me trompes-je ? :)

Le echo je le fait autant dans le fichier que dans la fonction qui éxecute la requête et tout est toujours bon.

Je craque vraiment, en local ca marche impeccable, dans mon site je fais d'autre UPDATE selon la même syntaxe, par exemple pour donner des notes à des articles, mais il y'a juste dans l'administration où ca bloque.

Est-ce que ca pourrait venir d'un problème de session ?

Et effectivement pour le Refresh je ne comprend vraiment pas.

Posté
Alors pour ta première solution, j'ai utilisé les \" car justement s'il y'a des apostrophes ils seront bien interpretés, alors que dans ton cas si le titre d'une news s'appelle par exemple :

"C'est l'été"

Et bien là il y aura erreur à cause des apostrophes, me trompes-je ? smile.gif

Non justement, du moins sur mon serveur les variables $_POST comportent déjà les antislashs là où il faut pour éviter les erreurs ! Je n'ai pas besoin de les rajouter, et donc je fais ma requète avec les apostrophes...

Si ta news s'appelle : Elle disait tout le temps "je suis la plus belle"

Il n'y aura pas d'antislash sur les guillemets, et la requète ne marchera pas... Du moins je le vois comme ça moi ;)

Posté (modifié)

Alors je vais tester ca pour voir, et je reviens donner les résultats ;)

En tout cas merci d'essayer de m'aider.

--------

Alors j'ai testé et le problème ne vient pas de là, voici la dernière solution que j'ai essayé :

 	 $auteur = $_POST["auteur"];
 $titre = $_POST["titre"];
 $genre = $_POST["genre"];

echo "UPDATE cr_news SET auteur = '$auteur', titre = '$titre', genre = '$genre' where id = '$id'";

La requête est toujours valide mais le résultat et toujours mauvais :gueule:

Modifié par Bridou
Posté

Bon en fait quand tu dis résultat mauvais c'est qu'il te vide la ligne de ta BDD ? Enfin, il laisse la ligne, l'id en place, mais vide les autres cases ? Essaye de faire des semi requètes, ne changer qu'un truc à la fois, pour voir s'il y a des requètes qui marchent... Parce que c'est bizarre ton histoire :P

UPDATE cr_news SET auteur = '$auteur' where id = '$id'
UPDATE cr_news SET titre = '$titre' where id = '$id'
UPDATE cr_news SET genre = '$genre' where id = '$id'

Voilà fais ces trois requètes et regarde le résultat... J'y comprend plus rien mdr

Posté (modifié)

Bon ben je sais plus quoi faire.

J'ai repris les commandes de bases, à savoir :

	$connection = mysql_connect($host, $user, $pwd);
mysql_select_db(SQL_BDD, $connection);

Et bien je fais ca :

$Req = "UPDATE cr_news SET auteur = '$auteur' where id = '$id'";

$res_ID = mysql_query($Req,$connection);
echo "R : $Req , C : $connection , Res : $res_ID";

Le résultat est que l'echo affiche bien ce qu'il afaut :

UPDATE cr_news SET auteur = 'Bridou' where id = '23'

Que le retour de mysql_query, $res_ID, m'affiche 1.

Et que l'auteur se retouve vide.

Et si je fais précédent et OK, l'auteur est bien changé.

Sérieusement je n'ai jamais vu ca et je suis paumé (les autres champs eux n'ont pas été modifié, seul auteur est devenu vide)

Modifié par Bridou
Posté
Sérieusement je n'ai jamais vu ca et je suis paumé

Bah...On est deux là... Tu dis que ça marche avec myadmin, que ça marche en faisant un refresh de la page, mais ça marche pas lors du premier passage... :|

Là je suis désolé je vois vraiment plus ce qu'il y a sur ton truc... Tu as essayé d'afficher toutes les erreurs, avec error_reporting(E_ALL); ? Ca n'affichera que les erreurs PHP, mais là je comprend vraiment plus où est le problème... Config de Mysql ? Je doute, mais bon... Pfiou, je peux plus t'aider désolé :(

Posté

Essaie ca :

$res_ID = mysql_query($Req);

A la place de

$res_ID = mysql_query($Req,$connection);

Tu n'as pas besoin de spécifier la connexion vue ce que tu as mis au dessus.

++

Posté

Portekoi s'il y avait un problème de connexion les données ne seraient pas effacées dans la BDD, c'est bien là le problème : la connexion est faite vu que la requète a un impact... Le problème est donc ailleurs :wacko:

Posté (modifié)

Pardon mais quand je fais une requete avec 'mysql_query', je ne spécifie pas la connexion si au dessus j'ai un 'select_db'.

Le problème peut donc venir de là et toutes les solutions sont bonnes à tester.

C'est justement en disant : "Ca c'est pas possible" que justement, c'est de là que ca viens.

Tout tester, toujours ;)

++

Portekoi

Modifié par portekoi
Posté (modifié)

J'ai essayé mais tu t'en douteras, même résultat :(

Il n'y a pas d'erreur non plus, et c'est vraiment à la première édition que ca plante.

Car si je fais ca :

J'ajoute un article, j'édite => ca efface les champs modifiés

Je re-édite le même article, aucun problème

Et je peux encore re-édité tout fonctionne.

C'est que la première fois, vraiment bizarre :gueule:

Ca pourrait venir de la structure de la table ?

(Bien que ca soit la même qu'en Local qui fonctionne bien :()

Modifié par Bridou
Posté
Ca pourrait venir de la structure de la table ?

J'en doute un peu, si ça venait de là aucun update ne marcherait...

Quand tu dis que ça marche la deuxième fois, c'est bien quand tu retournes à la page de traitement et que ton navigateur te propose de renvoyer les POST à nouveau ?

Dis moi, tu as essayé de transférer tes scripts sur un autre hébergement et de tester sur un autre serveur ? Ca te dirait au moins si c'est un plutôt un problème de script ou un problème de configuration du serveur...

Posté (modifié)

Essaie un REPAIR TABLE mais je n'en suis pas persuadé...

La passation des arguments n'est pas en cause vue le deriner exemple.

La requete est apparement exécutée (tu as essayé ceci : mysql_query($sql) or die (mysql_error()); ?

Sinon ben... tu as plus quà passer tes fichiers à quelqu'un pour tester.

Mais ca doit être une erreur toute bête... reste à savoir laquelle :(

++

PS: C'est qui ton hébergeur?

Modifié par portekoi
Posté (modifié)
Quand tu dis que ça marche la deuxième fois, c'est bien quand tu retournes à la page de traitement et que ton navigateur te propose de renvoyer les POST à nouveau ?

Ca marche :

1 ) Si effectivement je fait retour avec renvoie du POST

2 ) Mais égalementen refaisant la même manip, c'est à dire je choisis l'article à modifier, le formulaire s'affiche, je change les valeurs, et je valide, à la deuxième tentative, et bien ca marche :x

Dis moi, tu as essayé de transférer tes scripts sur un autre hébergement et de tester sur un autre serveur ?

<{POST_SNAPBACK}>

Non, je vais essayer de voir si je peux le faire.

Essaie un REPAIR TABLE mais je n'en suis pas persuadé...

Ai essayé ce matin, sans succès apparent...

La requete est apparement exécutée (tu as essayé ceci : mysql_query($sql) or die (mysql_error()); ?

Je vais essayer, au cas où...

Mais ca doit être une erreur toute bête... rest à savoir laquelle :(

<{POST_SNAPBACK}>

Tout à fait, et après l'avoir trouvée, je me penderai :D

Mon heberegeur, c'est JN-HEBERGEMENT

Modifié par Bridou
Posté (modifié)

Bon le mysql_error ne renvoie rien car la requête "est" bien éxécutée.

Et concernant ce que je disais avant que ca marchait à la deuxième édition, et bien ce n'est pas toujours le cas...

Y'a des fois ca fonctionne, et des fois ben non :fou:

Modifié par Bridou
Posté
Tout à fait, et après l'avoir trouvée, je me penderai biggrin.gif

Ce serait con d'avoir perdu autant de temps juste pour te pendre à la fin... :P

Mon hebergeur, c'est JN-HEBERGEMENT

Je ne le connais pas... Essaye effectivement sur un autre serveur, je pense que c'est la meilleure chose à faire en l'état actuel des choses ;).. Si ça marche sur ton local, ça marchera peut-être sur un autre serveur, et là tu pourras demander à JN-Hebergement de trouver le problème à ta place :P

Posté

Si tu n'as pas d'autre serveur, envoie moi tes fichiers à ' contact_AT_Portekoi.com ' .

Tu peux me fiare confiance, certains de se forum l'ont fait, aucn soucis :)

Sinon, si tu trouves, tiens nous au courant pour que l'on se pende tous ensemble :P

++

Portekoi

Posté

OK merci, j'ai un compte chez free, je vais tester d'abord là-bas, sinon je te contacterai :)

Encore merci.

Posté

Bon bah j'ai testé sur un compte free, et le résultat est le même :boude:

Je vais attendre jusqu'à ce soir voir si mon hebergeur me répond, sinon ben je pense que j'essairai de recoder le tout mais ca m'ennuie vraiment sachant que ca fonctionne en local et sans problème :(

Néanmoins, si tu es toujours d'accord Portekoi, je veux bien faire un pack de ce qui est necessaire et t'envoyer les fichiers pour que tu testes de ton côté.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant

×
×
  • Créer...