PHP: Erreur logique dans Update

Résolu
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   -  
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
J'ai une erreur de logique (ligne 48) dans mon script pour l'update. Je sais que c'est une erreur de syntaxe mais ne trouve pas le hic ! Voici une partie du code:
<?php  
$id = ($_POST['ID']);
$lien = (htmlspecialchars($_POST['Lien']));
$source = (htmlspecialchars($_POST['Source']));
$date = (htmlspecialchars($_POST['Date'])); // le champ est de type varchars au lieu de date.
$titre = (htmlspecialchars($_POST['Titre']));
$stitre1 = (htmlspecialchars($_POST['Stitre1']));
$stitre = (htmlspecialchars($_POST['Stitre']));
$info = (htmlspecialchars($_POST['Info']));

 // Infos de connexion à la BDD et affichage des boutons Précédent et Suivant si limite par page dépassée
require 'Fonctions_Agenda.php';

 // connection à la BDD
$link = mysql_pconnect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); // connection à la base
mysql_select_db($db) or die('Erreur : '.mysql_error());  // si ça ne se passe pas bien on affiche une erreur
(ligne 48 en question) mysql_query("UPDATE agenda SET lien='".mysql_real_escape_string($_POST['Lien'])."', source='".mysql_real_escape_string($_POST['Source'])."', date='".mysql_real_escape_string($_POST['Date'])."', titre='".mysql_real_escape_string($_POST['Titre'])."', stitre1='".mysql_real_escape_string($_POST['Stitre1'])."', stitre='".mysql_real_escape_string($_POST['Stitre'])."', info='".mysql_real_escape_string($_POST['Info'])."' WHERE id='".mysql_escape_string($_POST['ID'])."'"); or die ('Erreur : '.mysql_error() );

  // on teste la déclaration de nos variables et on prévient l'utilisateur que la modification s'est bien déroulée
if (isset($_POST['Lien']) && isset($_POST['Titre'])) {
  // on affiche le résultat en supprimant les antislashes 
echo '<p>l\'événement "<em>'.htmlentities(stripslashes($_POST['Lien'])).'</em>" de la page "<em>'.htmlentities(stripslashes($_POST['Titre'])).'</em>"à été modifié avec succès dans l\'agenda"</p>';  
echo '<p align="center"><font color="#0000FF">Vous allez etre redirigé automatiquement pour une autre saisie dans 5 secondes</font></p>';
}


Quelqu'un pourrait-il me regarder ce code ? Je l'en remercie beaucoup d'avance !



Le bonheur est la seule chose que l'on peut donner sans l'avoir.
A voir également:

11 réponses

vincebzh Messages postés 137 Date d'inscription   Statut Contributeur Dernière intervention   29
 
Salut. Supprime le ";" avant le "or die", avec un vrai IDE (genre eclipse PDT) tu l'aurais vu.
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
Merci vincebzh,
C'est quoi un IDE (éditeur de code type note pad++ ?).
J'utilise Dreamweaver MX 2004 qui colore aussi le code avec en plus l'avantage de pouvoir avoir des retours à la ligne auto sans incidence sur le code. C'est juste pour la lecture sans ascenseur latéral.
Bref, malgré ta correction, ça n'ajoute rien dans la table. Ex. http://editionsgracianne.free.fr/Agenda/Formulaire.php (Modification (user=test et pass=toto). Tu peux tester allègrement, la table sera supprimée à la fin des tests. Je tente d'ajouter un second sous titre par exemple, je valide, ça m'affiche le résumé mais si je regarde en recliquant sur le lien que j'ai modifié rien n'a été ajouté. Je suis pas très clair mais fait un test par toi même si tu veux.
Encore merci d'avoir regardé !

Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0
vincebzh Messages postés 137 Date d'inscription   Statut Contributeur Dernière intervention   29
 
Notepad++ n'est pas un IDE, c'est juste un éditeur de texte avec coloration syntaxique.

Un IDE, c'est l'outil dont les développeurs ne devraient pas se passer. Il te propose l'autocompletion des fonctions, avec la doc qui lui est associé, il sait rechercher quels fonctions tu as déjà écrites (le raccourcis ctrl+clic te permet d'aller directement à cette fonction), il te souligne en rouge lorsque la syntaxe n'est pas bonne, il permet de faire du débogage pas à pas, etc...
( https://fr.wikipedia.org/wiki/Environnement_de_D%C3%A9veloppement_Int%C3%A9gr%C3%A9 )
Enfin bref, une fois que tu y as gouté, tu ne peux plus t'en passer.

Personnellement, j'utilise Eclipse PDT (prévu pour le PHP), qui est disponible sur plusieurs OS (windows, MacOS, Linux ...). Le seul inconvénient, c'est qu'il est hyper gourmand en ressources et pas super stable. Il en existe d'autre (netbeans, phpDesigner ...)

Après, pour ton problème, je ne connais pas la structure de ta table. Peux tu mettre un export SQL de ta table pour que je puisse voir ce qu'il ne va pas ?
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
Merci beaucoup pour tes explications sur l'IDE. Ca m'a l'air super interressant, surtout pour moi qui fait pas mal d'erreur de syntaxe hi hi hi... Je vais le tester.
Ci dessous, l'export de la table:
-- phpMyAdmin SQL Dump
-- version 3.1.5
-- https://www.phpmyadmin.net/
--
-- Serveur: editionsgracianne.sql.free.fr
-- Généré le : Dim 09 Janvier 2011 à 21:51
-- Version du serveur: 5.0.83
-- Version de PHP: 5.2.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de données: 'editionsgracianne'
--

-- --------------------------------------------------------

--
-- Structure de la table 'agenda'
--

CREATE TABLE IF NOT EXISTS 'agenda' (
  'ID' int(11) NOT NULL auto_increment,
  'Lien' varchar(255) collate latin1_general_ci NOT NULL,
  'Source' varchar(255) collate latin1_general_ci default NULL,
  'Date' varchar(10) collate latin1_general_ci NOT NULL,
  'Titre' varchar(255) collate latin1_general_ci default NULL,
  'Stitre1' varchar(255) collate latin1_general_ci default NULL,
  'Stitre' varchar(255) collate latin1_general_ci default NULL,
  'Info' longtext collate latin1_general_ci,
  KEY 'ID' ('ID')
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=93 ;

--
-- Contenu de la table 'agenda'
--

INSERT INTO 'agenda' ('ID', 'Lien', 'Source', 'Date', 'Titre', 'Stitre1', 'Stitre', 'Info') VALUES
(1, '<a href="http://www.suite101.fr/content/le-dernier-roman-de-gracianne-hastoy-va-encore-plus-loin-a22024?sms_ss=facebook&at_xt=4cfe8e672679750d%2C0" class="lien">Sébastien Soumagnas à écrit </a>', '', '0000-00-', '', '', '', ''),
(2, 'André Labarrere: le parfum des capucines', 'Le journal de Biarritz (Vincent Dubecq)', '0000-00-', 'André LABARRERE', 'par Cracianne HASTOY', 'Le parfum des capucines', 'Editions Atlantica \r\n\r\nCritique de Mr Dubecq pour « Le Journal de Biarritz »\r\n\r\n« Malheur au livre qu''on peut lire sans s''interroger totalement sur l''auteur »: cette phrase de Cioran illustre à la perfection le livre de Gracianne Hastoy sur André Labarrère. \r\n\r\nIl y a une telle harmonie entre l''auteur et le sujet que nous avons du mal à les dissocier. L''auteur annonce la couleur quand elle se déclare" victime complaisante des charmes déployés » de son sujet. Mais cette complaisance n''est pas courtisane, flatteuse ; elle permet simplement de mieux comprendre l''homme. André Labarrère. Nous sommes loin de cette littérature d''écrivain-procureur, de journaliste accusateur comme sont tous ces ouvrages sur des hommes politiques, et en particulier le dernier en date de Gisbeirg sur Chirac. Comme si dire du mal des hommes publics était devenu un sport national ! '),
(92, 'lala', '', '', 'tyty', '', '', '<p>que <s>la </s><strong>riviere </strong>est <br />jolie</p>'),
(88, 'Mise en forme avec balises html parsées', 'Cathy', '31/12/2010', 'Mise en forme avec balises html parsées', 'Preview: OK', '', '<strong>Circa hos dies</strong> Lollianus primae lanuginis adulescens, <em>Lampadi filius ex praefecto</em>, exploratius causam Maximino spectante, <u>convictus codicem noxiarum</u> artium nondum per aetatem firmato consilio descripsisse. \r\nExulque mittendus, <s>ut sperabatur</s>, patris inpulsu provocavit ad principem, et iussus ad eius comitatum duci, de fumo, ut aiunt, in flammam traditus Phalangio Baeticae consulari cecidit funesti carnificis manu.'),
(89, 'Ajout de texte dans l''agenda', 'Graci', '31/12/2010', 'Ajout de texte dans l''agenda', '', '', '<p><strong>Ajout</strong> de texte dans <u>l''agenda 2011</u>. Ici le contenu du texte avec les balises <s>html</s> <em>parsées</em>.</p>'),
(90, 'Test avec retour chariot au clavier.', 'Bebert', '06/01/2011', 'Test avec retour chariot au clavier.', 'Le retour se fait au clavier', '', '<p><strong>Altera sententia est</strong>, quae definit amicitiam paribus officiis ac voluntatibus. Hoc quidem est nimis exigue et exiliter ad calculos vocare amicitiam, ut par sit ratio <u>acceptorum et datorum</u>. \r\nDivitior mihi et affluentior videtur esse <em>vera amicitia nec observare restricte</em>, ne plus reddat quam acceperit; neque enim verendum est, ne quid excidat, aut ne quid in terram defluat, aut ne plus aequo quid in amicitiam congeratur. Restabat ut Caesar post haec properaret accitus et abstergendae causa suspicionis sororem suam, eius uxorem, Constantius ad se tandem desideratam venire multis fictisque blanditiis hortabatur.</p> <p><strong>Quae</strong> licet ambigeret metuens saepe cruentum, spe tamen quod eum lenire poterit ut germanum profecta, cum Bithyniam introisset, in statione quae Caenos Gallicanos appellatur, absumpta est vi febrium repentina. cuius post obitum maritus contemplans cecidisse fiduciam qua se fultum existimabat, anxia cogitatione, quid moliretur haerebat.</p>');


Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vincebzh Messages postés 137 Date d'inscription   Statut Contributeur Dernière intervention   29
 
Salut. Désolé d'avoir mis autant de temps à répondre.

Supprime les parenthèses autour de ta liste de variables, et utilises les variables dans la requêtes à la place des mysql_escape_string(...).
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
De rien,
Mais ta solution ne fonctionne pas non plus. Je ne comprends vraiment pas ce qui se passe. Soit il y a une erreur de syntaxe (mais ça se corrige) soit ça affiche le résumé (prise en compte de l'action via un message OK puis retour auto après 5 secondes), mais l'update n'a pas fonctionné.
J'ai passé 2 mois rien que pour afficher les datas dans le formulaire de modif. Pourtant j'étais pratiquement sur du code et à force de modifier (finalement retour vers ce que j'avais écrit au départ) ça s'est mis à fonctionner. C'est pour ça que j'ai beaucoup de doutes. Ce n'est peut être pas moi qui fait des fautes (en dehors des fautes de syntaxe).
Je vais péter un câble ! Sur le site du zéro ils disent bien de mettre mysql_real_escape_string pour protéger les données entrées dans le champ.
lien='".mysql_real_escape_string($_POST['Lien'])."',
Alors pourquoi tu me le fait enlever ? Y-a-t-il une raison particulière ? Tu sais, si ça dois fonctionner, tant mieux mais ce n'est même pas le cas pour le moment. Ou alors l'erreur est ailleurs, plus haut dans le code.
Merci quand même d'avoir pris le temps de regarder.

Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0
vincebzh Messages postés 137 Date d'inscription   Statut Contributeur Dernière intervention   29
 
Je ne sais pas sur quel tuto tu as vu ca, mais sur l'officiel, il n'est marqué nul pars d'utiliser "mysql_real_escape_string()" vu qu'il utilise PDO.
As tu essayé en supprimant les parenthèses au début du script que tu donnes ?

$id = $_POST['ID'];
$lien = htmlspecialchars($_POST['Lien']);
$source = htmlspecialchars($_POST['Source']);
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
Salut vincebzh,
J'ai mis un echo pour voir si ma requete passait (dans mon cas d'exemple j'ajoute toto dans le champ Stitre du formulaire. toto est bien dans la $stitre mais l'id est vide. http://editionsgracianne.free.fr/Agenda/Formulaire.php (user=test et pass=toto pour la modif, au milieu). Tu clique sur un des liens et tu aura le formulaire pré-renseigné. Si tu ajoute quelque chose dans le second sous-titre qui est vide puis tu valide tu aura le résultat de la requete (affiché pendant 5 secondes avant le retour) mais tu peux recommencer autant de fois que tu veux pour t'apercevoir que l'id est vide.

UPDATE agenda SET Lien="Mise en forme avec balises html parsées", Source="Cathy", Date="31/12/2010", Titre="Mise en forme avec balises html parsées", Stitre1="Preview: OK", Stitre="toto", Info="Circa hos dies Lollianus primae lanuginis adulescens, Lampadi filius ex praefecto, exploratius causam Maximino spectante, convictus codicem noxiarum artium nondum per aetatem firmato consilio descripsisse. \r\nExulque mittendus, ut sperabatur, patris inpulsu provocavit ad principem, et iussus ad eius comitatum duci, de fumo, ut aiunt, in flammam traditus Phalangio Baeticae consulari cecidit funesti carnificis manu." WHERE ID="vide" (j'ai mis le mot vide pour que tu le vois mieux)

<?php  
$id = $_POST['ID'];
$lien = htmlspecialchars($_POST['Lien']);
$source = htmlspecialchars($_POST['Source']);
$date = htmlspecialchars($_POST['Date']); // le champ est de type varchars au lieu de date à cause du calendrier.
$titre = htmlspecialchars($_POST['Titre']);
$stitre1 = htmlspecialchars($_POST['Stitre1']);
$stitre = htmlspecialchars($_POST['Stitre']);
$info = htmlspecialchars($_POST['Info']);

 // Infos de connexion à la BDD et affichage des boutons Précédent et Suivant si limite par page dépassée
require 'Fonctions_Agenda.php';

 // connection à la BDD
$link = mysql_pconnect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); // connection à la base
mysql_select_db($db) or die('Erreur : '.mysql_error() );  // si ça ne se passe pas bien on affiche une erreur
$sql = 'UPDATE agenda SET Lien="'.mysql_real_escape_string($_POST['Lien']).'", Source="'.mysql_real_escape_string($_POST['Source']).'", Date="'.mysql_real_escape_string($_POST['Date']).'", Titre="'.mysql_real_escape_string($_POST['Titre']).'", Stitre1="'.mysql_real_escape_string($_POST['Stitre1']).'", Stitre="'.mysql_real_escape_string($_POST['Stitre']).'", Info="'.mysql_real_escape_string($_POST['Info']).'" WHERE ID="'.mysql_real_escape_string($_POST['ID']).'"';

echo $sql; // sert à visualiser le contenu de la requete

Je pense que mon Pb vient du fait que l'id est passé en GET et ici je me le trouve en POST.
Le début du Formulaire_Modifier.php:
<form  name="Presse" id="Presse" action="Traitement_Agenda_Modifer.php" onSubmit="return verif(this)" method="POST">
<input type="hidden" name="id" id="id" value="$id" />
et ici le début du script de ce même formulaire:
<?php
// On recupere la variable "id" correspondant à l'article choisi
// ce script est appelé par un click sur le lien n'est ce pas, alors l'id est passé par l'URL donc en GET 
$id = $_GET['ID']; // on récupère la requete par la variable $_GET


Une question: La méthode est POST donc l'id est aussi en POST à l'arrivée, non ? ou bien dois-je écrire comme ci-dessus
<?php
// On recupere la variable "id" correspondant à l'article choisi
// ce script est appelé par un click sur le lien n'est ce pas, alors l'id est passé par l'URL donc en GET 
$id = $_GET['ID']; // on récupère la requete par la variable $_GET
et les autres variables en POST ?

Je te remercie infiniment car je perds la boule, ça fait trop de temps que je passe sur cette page.
Je t'ai mis les fichiers ici: http://editionsgracianne.free.fr/Forms_Agenda.zip
Ce sera beaucoup plus clair pour tout le monde je pense. Par contre, si tu observe des erreurs, je te demanderai de "commenter" les lignes que j'ai écrite et celles que tu pourrai corriger car cela me permettra de voir où j'ai merdé ! Merci encore.

Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0
vincebzh Messages postés 137 Date d'inscription   Statut Contributeur Dernière intervention   29
 
Le problème semble venir de la balise input type="hidden".

Regarde dans le code source du navigateur, ce n'est pas l'id qui est entrée mais le nom de la variable.

Dans la page Formulaire_Modifier.php, remplace :
<input type="hidden" name="id" id="id" value="$id" /> 


Par :
<input type="hidden" name="id" id="id" value="<?php echo $id; ?>" /> 


Un autre truc, au début du php, dans la page du traitement du formulaire, tu stock tous les post dans des varibles, pourquoi tu ne les réutilisent pas dans la requêtes ?

$sql = 'UPDATE agenda SET Lien="'.mysql_real_escape_string($lien).'", Source="'.mysql_real_escape_string($source).'", Date="'.mysql_real_escape_string($date).'", Titre="'.mysql_real_escape_string($titre).'", Stitre1="'.mysql_real_escape_string($stitre1).'", Stitre="'.mysql_real_escape_string($stitre).'", Info="'.mysql_real_escape_string($info).'" WHERE ID="'.mysql_real_escape_string($id).'"'; 
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
Bonsoir vincebzh,
Idem (mais j'avais déjà tenté cette option aussi). C'est pour ça que je ne comprends plus rien. Après de très nombreux essais, rien ne va ! J'utilise le
"'.mysql_real_escape_string($source).'"
pour protéger les données entrées mais cette ligne
ID="'.mysql_real_escape_string($id).'"';
est-elle correcte au moins ? J'ai de gros doutes là ! J'avais essayé
ID='$id';
(l'id étant de type int et auto-incrémental) mais sans plus de résultats. Et je ne vois nulle part sur les tutos du web une syntaxe utilisant des variables pour les updates.

Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0
txiki Messages postés 6596 Date d'inscription   Statut Contributeur Dernière intervention   521
 
Bonjour et merci à tous pour votre patience !
Ça y est ! c'est EN...FIN !!! réglé (je ne sais pas par quel mystère mais cela fonctionne.
Note: j'avais déjà eu le même Pb pour afficher les données dans un formulaire qui devait être pré-rempli.

Le bonheur est la seule chose que l'on peut donner sans l'avoir.
0