Version complète: sur le forum Webmaster Hub : Problème MySQL avec UPDATE
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Pages: 1, 2
Bridou
Bonsoir à toutes et à tous,

Ceci est mon premier message et c'est pour demander de l'aide wink.gif
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.gif


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 :
CODE
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 :

CODE
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 wink.gif

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

CODE
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
Vincent
CITATION(Bridou @ mardi 26 juillet 2005, 21h38)
CODE
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
CODE
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 :
CODE
UPDATE cr_news SET auteur = \"$HTTP_POST_VARS[auteur]\", titre = \"$HTTP_POST_VARS[titre]\", genre = \"$HTTP_POST_VARS[genre]\" where id = '$id'";
Bridou
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.
Portekoi
Salut,

Peux tu mettre ton code pour que l'on regarde?

++

Portekoi
Bridou
Je vais essayer car mon code est beaucoup découpé pour me simplifier un peu la vie smile.gif

(c'est du codage maison donc surement "dégeulasse" biggrin.gif)

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
)
CODE

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 :

CODE

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ù :

CODE

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.
Bridou
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 ?
sarc
Salut à toi wink.gif

Tu devrais essayer ça comme requète :

CODE
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 :|
Bridou
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

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.
sarc
CITATION
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 wink.gif
Bridou
Alors je vais tester ca pour voir, et je reviens donner les résultats wink.gif

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é :

CODE
     $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:
sarc
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 tongue.gif

CODE
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
Bridou
Bon ben je sais plus quoi faire.

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

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


Et bien je fais ca :
CODE
$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 :
CODE
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)
sarc
CITATION
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é sad.gif
Portekoi
Essaie ca :

CODE
$res_ID = mysql_query($Req);


A la place de
CODE
$res_ID = mysql_query($Req,$connection);


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

++
sarc
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.gif
Portekoi
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 wink.gif

++

Portekoi
Bridou
J'ai essayé mais tu t'en douteras, même résultat sad.gif

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 sad.gif)
sarc
CITATION
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...
Portekoi
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 sad.gif

++

PS: C'est qui ton hébergeur?
Bridou
CITATION(sarc @ mercredi 27 juillet 2005, 12h26)
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

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

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


CITATION(portekoi @ mercredi 27 juillet 2005, 12h27)
Essaie un REPAIR TABLE mais je n'en suis pas persuadé...


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

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

Je vais essayer, au cas où...

CITATION
Mais ca doit être une erreur toute bête... rest à savoir laquelle sad.gif
*


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

Mon heberegeur, c'est JN-HEBERGEMENT
Bridou
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 IMSTP6.gif
sarc
CITATION
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... tongue.gif

CITATION
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 wink.gif.. 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 tongue.gif
Portekoi
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 smile.gif

Sinon, si tu trouves, tiens nous au courant pour que l'on se pende tous ensemble tongue.gif

++

Portekoi
Bridou
OK merci, j'ai un compte chez free, je vais tester d'abord là-bas, sinon je te contacterai smile.gif

Encore merci.
Bridou
Bon bah j'ai testé sur un compte free, et le résultat est le même IMSTP5.gif

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 sad.gif

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é.
Portekoi
Fais moi un pack avec le formulaire, le fichier de traitement et un fichier sql avec les tables nécessaires.

Test ce que tu m'envoies au cas où et si cela ne marche toujours pas, envoie moi le tout.

Je le testerais ce soir et posterais de suite après smile.gif

smile.gif

++
sarc
Ma foi je le veux bien au passage aussi wink.gif
Portekoi
Bonsoir,

Après moulte test, je n'ai pas résolu le problème.

Cela viens, je pense, de la class utilisée pour exécuter la requête mais parfois cela fonctionne, et parfois non.

Ce que j'ai fais :

J'ai exécuté la requete directement à savoir :

Au lieu d'avoir ceci :
CITATION
//$BDD_EDITER->Requete("UPDATE cr_news SET auteur = '".$_POST["auteur"]."', titre = '".$_POST["titre"]."', genre = '".$_POST["genre"]."' where id = '$id'");


J'ai mis :
CITATION
$requete = mysql_query("UPDATE cr_news SET auteur = 'ffdsfdsfdsf', titre = 'fdsfdsfdsfsd', genre = 'fdsfdsfdsfsd' where id = '$id'") or die (mysql_error());


En mettant en dur, cela fonctionne à tous les coups. Par contre, si je mets ceci :

CITATION
//$requete = mysql_query("UPDATE cr_news SET auteur = '".$_POST["auteur"]."', titre = '".$_POST["titre"]."', genre = '".$_POST["genre"]."' where id = '$id'") or die (mysql_error());


Cela ne fonctionne plus. La connexion à la base ce fait bien. La requête est bien affichée et exécutée. Mais les valeurs sont à blanc dans la base de données alors qu'elle est bien affichée à l'écran. La péthode est bien en POST.
J'ai pensé à un moment que le tableau '$_POST' était manipulé quelque part mais je n'ai rien trouvé de tel.

Je continuerais ce soir car cela m'intrigue fortement. D'ici là, si quelqu'un veut essayer, contacter Bridou ^_^

Bonne nuit

Portekoi
Portekoi
Re,

Notre ami a mis ceci :

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


et j'ai rajouter des 's' à la fin de chaque chaine :

CITATION
$auteur = $_POST["auteur"]."s";
$titre = $_POST["titre"]."s";
$genre = $_POST["genre"]."s";


Et devinez quoi? Et oui, lors de l'update, il n'a enregistré que les s ...

J'ai donc changé la method en 'GET' et cela fonctionne. Il y a bien un conflit au niveau du POST mais je n'ai pas trouvé avec quoi...

Et la dodo time smile.gif

++
Vincent
J'ai un doute sur l'accessibilité des variables $_POST a l'interieur de la fonction EditerBDD($id)

Est-ce qu'il ne faudrait pas non plus les passer en parametre?

function EditerBDD($id, $auteur, $titre, $genre)

ou alors utiliser la définition global
sarc
Vincent je pensais ça aussi, que les variables POST devraient être dans les paramètres, mais à l'affichage de la requète tout marche... J'ai testé l'affichage de la requète dans la class, ainsi que juste avant de faire le mysql_query, et tout s'affiche correctement...

Donc les variables sont passées finalement :|
Portekoi
Le plus dingue c'est qu'il affiche la requete...

Je continue ce soir.

++
Dan
Salut Portekoi,

Es-tu certain de tes variables $_POST ? Particulièrement si elles peuvent contenir des caractères tels que les simples quotes...
Tu devrais utiliser addslashes($_POST['titre']) histoire d'être tranquille.
Il y aura toujours bien un jour un titre avec une simple quote qui fera foirer ta requête. wink.gif

Dan
Portekoi
Bonjour,

Non, je test simplement le script de Bridou en mettant des valeurs telles que Test smile.gif

Le truc vraiment bizarre, c'est que le echo de la requete affiche bien tout mais les champs sont quand même vides ^_^

En GET, les champs ne sont pas vide...

Première fois que je vois ca...
sarc
Bah moi aussi j'ai testé directement les scripts, j'ai changé des petites choses, j'ai fait juste un
CODE
echo $requete;
mysql_query($requete);

... l'affichage de la requète est bon, il n'y a aucun souci dedans. Par contre, la requète vide les champs dans la BDD...

Le pire n'est même pas là, on pourrait imaginer un problème de configuration quelque part, bref une toute petite erreur... Le pire, c'est que quand on essaye la requète plusieurs fois, au bout d'un moment (2, 3 fois) elle marche ! La même requète marche une fois sur deux... C'est incompréhensible, bravo Bridou tu as le problème PHP+sql de l'année je crois !
Boo2M0rs0
Heu j'ignore si c'est utile mais quand on modifie des champs à partir des formulaires de phpmyadmin, il y a toujours un point virgule à la fin de la requête.
Et ici il n'y est pas...
sarc
Si c'était un problème de syntaxe rien ne serait touché sur la BDD, il ne se passerait rien, et l'affichage des erreurs pourrait renvoyer l'erreur de MySQL... Or, la ligne modifiée est vidée de son contenu et le script ne renvoie aucune erreur, tout est bien, il est content du résultat le script...
Bridou
Je rentre juste du boulot et vois qu'au bout du compte je suis quand même pas un idiot, c'est pas trop de ma faute si ca fonctionne pas biggrin.gif

Je remercie tout le monde pour le temps que vous passez à essayer de trouver une solution.

_AT_Dan : Concernant :"Es-tu certain de tes variables $_POST ?"

Comme dit plus haut, c'est verifié à tout les niveaux possibles et ce sont bien les valeurs que l'on saisit à modifié qui sont affichées, donc les valeurs sont bel et bien récupérées.
Portekoi
CITATION(sarc @ jeudi 28 juillet 2005, 13h38)
Si c'était un problème de syntaxe rien ne serait touché sur la BDD, il ne se passerait rien, et l'affichage des erreurs pourrait renvoyer l'erreur de MySQL... Or, la ligne modifiée est vidée de son contenu et le script ne renvoie aucune erreur, tout est bien, il est content du résultat le script...
*


D'ailleurs, il n'y a que lui qui est content de se résultat ^_^

Ce soir, je lui fais ca peau biggrin.gif

@Bridou : Mets GET au lieu de POST et tu verras que cela fonctionne. Reste à savoir pourquoi smile.gif
Bridou
Ma foi si ca marche je vais essayer cette solution, peu m'importe la technique en fait du moment que ca fonctionne.

Merci beaucoup, je m'en vais tester le GET de ce click...
Bridou
Je n'ai pas du bien comprendre pour le GET wink.gif

Je remplace POST par GET, où ?

Si je le fait dans le formulaire ca ne marche pas quand je met valider.

Les variables sont bien passées dans l'url mais je perd les informations de session et rubrique.

Au lieu d'avoir :

page.php?session=xxxxxx&rubrique=news&titre=yyyy&auteur=zzzz

J'obtiens :
page.php?titre=yyyy&auteur=zzzz

Donc je suis délogguer de l'administration car perte de la session dans l'url...

Qu'ais-je encore fais de mal ? IMSTP5.gif
Portekoi
Ouaip car au lieu de faire

<form action="page.php?session=<?=$session?>...."

mets tous ces champs en hidden smile.gif

Mais sinon, tu as été déloggé de l'admin mais vérifie si dans la base, cela a fonctionné...

Un McDo que oui tongue.gif

++
Bridou
Bon ben je t'achète un Happy Meal si tu veux biggrin.gif

Effectivement j'ai fait plusieurs test et ca à l'air de fonctionner via cette technique, donc je vais mettre à jour mes fichiers avec cette solution pour le moment.

Ca doit faire la 251,5 ème fois, mais encore Merci tongue.gif
sarc
Moui mais je boycotterai ton site tant que tu n'auras pas trouvé le problème avec les POST... D'abord, non mais ho !
C'est trop facile de changer la méthode pour arriver à ses fins lool
Bridou
C'est la roue de secours usée avant d'acheter une nouvelle roue toute neuve biggrin.gif

Je prefere mettre cette solution en place pour "mon staff" qu'ils puissent bosser sans soucis et contiuer a chercher par la suite.
Bridou
Bon maintenant le soucis est que un article est composé de texte, que ce texte peut faire plus de 256 octets, et que donc par la method GET et bien ca ne fonctionne pas correctement, le contenu de l'article est coupé.

Arghhhh IMSTP6.gif IMSTP6.gif
Portekoi
Lol ^_^

Faut pas prendre le get comme solution. C'était juste pour montrer le pb du $_POST smile.gif

On va y arriver... enfin j'espère IMSTP2.gif
Bridou
Je ne vois quand même pas pourquoi le POST fait planter car autant avec le GET qu'avec le POST on affecte ces variables à d'autre variables :

$auteur = $_POST["auteur"]
ou
$auteur = $_GET["auteur"]

Et ensuite on utilise $auteur dans la requête, donc à ce moment donné le POST ou GET n'ont plus de role a jouer, c'est ca qui est dur à comprendre...
Bridou
A priori "j'ai" trouvé !

Suite à ta remaque des champs HIDDEN, j'ai testé cette solution tout en gardant la méthode POST et cela fonctionne l'édition ne plante plus.

Je vais encore faire des tests mais je pense qu'on tient le bon bout ! wub.gif
Portekoi
Hum.... j'ai pas creusé par là hier mais je n'utilise que les champs hidden pour ma part....

Met tout à plat pour voir smile.gif

++

PS : Pour moi, ce sera un Golden Menu, Frites +Coca avec une boite de 4 et un sunday chocolat. Sur place biensur ^_^
Et Je suis sur Saint Lazare biggrin.gif tongue.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.