Ajouter commentaires dans une page et inserer dans BDD

jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010 - 30 déc. 2009 à 14:09
mimisonia Messages postés 2 Date d'inscription jeudi 31 mars 2011 Statut Membre Dernière intervention 29 mai 2011 - 29 mai 2011 à 08:51
Salut,

Je souhaite réaliser une page ou l'utilisateur peut écrire un commentaire et envoyer ce commentaire. Le commentaire est alors inséré dans la base de données. Je n'arrive pas à l'insérer dans ma base de données.

voila mon code:

//je fais une requete (je sais pas si c'est nécessaire?)
$sql =  "SELECT * FROM table_commentaire WHERE id_image=$id_image";
$result_com = mysql_query($query_com)
or die ("La requete '$sql' a echouee");

//boucle pour recuperer les champs que je met dans des variables			
while ($row = mysql_fetch_assoc($result_com)) {
$texte = $row['texte_commentaire'];
$id_commentaire = $row['id_commentaire'];
}

$commentaire=$_POST['commentaire'];

//insertion dans la base de donnés
if (isset($_POST['commentaire']))
{
$add_com = "INSERT INTO commentaire (commentaire) VALUES ($commentaire)";
mysql_query($add_com) or die ("Erreur SQL: $add_com");

}


 Ajouter un commentaire: 
<form method ="post">
<textarea name="commentaire" action="<?php echo $PHP_SELF; ?>" cols="50" rows="5"></textarea> 


</form>


Erreur SQL: INSERT INTO commentaire (texte) VALUES (ce que j'ecris dans mon textarea)

19 réponses

jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
30 déc. 2009 à 14:11
Pardon j'ai mal recopier mon code le voici:

Salut,

Je souhaite réaliser une page ou l'utilisateur peut écrire un commentaire et envoyer ce commentaire. Le commentaire est alors inséré dans la base de données. Je n'arrive pas à l'insérer dans ma base de données.

voila mon code:

//je fais une requete (je sais pas si c'est nécessaire?)
$sql =  "SELECT * FROM table_commentaire WHERE id_image=$id_image";
$result_com = mysql_query($sql)
or die ("La requete '$sql' a echouee");

//boucle pour recuperer les champs que je met dans des variables			
while ($row = mysql_fetch_assoc($result_com)) {
$texte = $row['texte_commentaire'];
$id_commentaire = $row['id_commentaire'];
}

$commentaire=$_POST['commentaire'];

//insertion dans la base de donnés
if (isset($_POST['commentaire']))
{
$add_com = "INSERT INTO commentaire (commentaire) VALUES ($commentaire)";
mysql_query($add_com) or die ("Erreur SQL: $add_com");

}


 Ajouter un commentaire: 
<form method ="post">
<textarea name="commentaire" action="<?php echo $PHP_SELF; ?>" cols="50" rows="5"></textarea> 


</form>


Erreur SQL: INSERT INTO commentaire (texte) VALUES (ce que j'ecris dans mon textarea)
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
30 déc. 2009 à 14:22
Salut,

Je n'ai pas lu le code.
Si tu remplaçais ton :
die ("Erreur SQL: $add_com");

par :
die ("Erreur SQL: $add_com
Voici l'erreur reportée par MySQL :
".mysql_error());

Tu aurais sans doute plus d'information.


Cordialement,



Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
30 déc. 2009 à 14:24
Profites en pour faire un petit tour par ici :
http://fr.php.net/manual/fr/function.mysql-real-escape-string.php



Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
30 déc. 2009 à 15:20
Salut, merci de ta réponse. J'ai revu mon code (merci de ne pas tenir compte du code que j'ai écrit auparavant) qui me donne maintenant une erreur plus précise. Voici la partie de mon code qui fait qu'il y a une erreur:

if(isset($_POST['commentaire'])) $commentaire= $_POST['commentaire']; else $commentaire=""; // s'il y a un commentaire écrit dans le champ 'commentaire' alors on le met dans la variable $commentaire.Sinon, la variable $commentaire ne contient rien.

if (isset($commentaire)) {
$ajout_commentaire = "INSERT INTO commentaire (texte_com) VALUES ('$commentaire')"; //si la variable existe alors on insère la donnée qu'elle contient (donc le commentaire récupéré) dans le champs  texte_com  de ma table commentaire  Je précise que le champs texte_com dans ma table est de type text et interclassement utf8_unicode_ci

mysql_query($ajout_commentaire) or die('Erreur SQL:'.mysql_error());
}
// retourne un message d'erreur en cas de problème (voir plus bas)

Les champs en HTML:
Ajouter un commentaire:
<form method ="post">
<textarea name="commentaire" action="<?php echo $PHP_SELF; ?>" cols="50" rows="5"></textarea> 


</form>


Et l'erreur retournée est:

Erreur SQL:Cannot add or update a child row: a foreign key constraint fails


Ça serait un problème au niveau de la BD donc ? ma requête pour insérer à l'air correcte ?...
0

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

Posez votre question
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
30 déc. 2009 à 16:22
Désolé de me répéter :
Profites en pour faire un petit tour par ici :
sur http://fr.php.net/manual/fr/function.mysql-real-escape-string.php


Que dis la commande SQL suivante ?
SHOW CREATE TABLE commentaire;


(à copier / coller dans phpMyAdmin par exemple)


Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
31 déc. 2009 à 11:44
j'ai fait cette requete dans phpmyadmin:
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
31 déc. 2009 à 13:23
Désolé mais, comme tu le constates sans doute, il n'y a rien d'exploitable là dedans.
Refais la requête et cliques sur "version imprimable (avec textes complets)" et copie le résultat.

Pense également à fournir ton code modifié (cf le lien que je t'ai donné avant)
Profites en pour modifier :
die('Erreur SQL:'.mysql_error());
=>
die('Erreur SQL sur la requête :
'.$ajout_commentaire.'
'.mysql_error());

Et donne nous le résultat.


Cordialement,


Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
2 janv. 2010 à 10:38
Désolé, je n'avais pas bien compris. Voila le resultat de la requete dans phpmyadmin:



J'ai modifié le code:

<?php
include "private.inc.php";
include "connect_bd.inc.php";

$id_photo=$_GET['id_photo'];

$query "SELECT * FROM photo INNER JOIN user ON user.id_user photo.id_user AND id_photo=$id_photo";

$result = mysql_query($query)
or die ("La requete '$query' a echouee");

while ($row = mysql_fetch_assoc($result)) {
$id_user = $row['login'];
$id_photo = $row['id_photo'];
    $titre = $row['titre'];
    $description = $row['description'];
    $date_depot = $row['date_depot'];
$nom_fic = $row['nom_fic'];
}
$chemin_photo="img/".$id_user.'/';

if(isset($_POST['commentaire'])) $commentaire=$_POST['commentaire']; else $commentaire=""; 
if (isset($commentaire)) {
$ajout_commentaire = "INSERT INTO commentaire (texte_com) VALUES ('$commentaire')";

mysql_query($ajout_commentaire) or die('Erreur SQL sur la requête :
'.$ajout_commentaire.'
'.mysql_error());
}

?>


Erreur SQL sur la requète :
INSERT INTO commentaire (texte_com) VALUES ('')
Cannot add or update a child row: a foreign key constraint fails
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
2 janv. 2010 à 10:40
Ma capture d'écranest trop large,voici le résultat de la requête : http://i46.tinypic.com/se3tqs.jpg
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
2 janv. 2010 à 12:02
Re,

Dis moi, je ne voudrais pas me faire désagréable, mais je ne veux pas non plus passer mon temps à parler dans le vide.

Je la refais une dernière fois :
le mercredi 30 décembre 2009 à 14:24:07
=>
Profites en pour faire un petit tour par ici :
sur http://fr.php.net/manual/fr/function.mysql-real-escape-string.php [ Lien ]


le mercredi 30 décembre 2009 à 16:22:09
=>
Désolé de me répéter :

Profites en pour faire un petit tour par ici :
sur http://fr.php.net/manual/fr/function.mysql-real-escape-string.php

le jeudi 31 décembre 2009 à 13:23:24
=>
Pense également à fournir ton code modifié (cf le lien que je t'ai donné avant)


Nous sommes le 2 janvier et je ne vois toujours aucune trace de mysql_real_escape_string() dans ton code
La moindre des choses il me semble et de prendre en compte les remarques, entends par là y répondre ("je n'ai pas compris à quoi cela pouvait servir ...", "tu te trompes, ...", "je n'arrive pas à l'intégrer, ..." ... sont des réponses)

Ton problème ne vient vraisemblablement pas de là, mais j'attends que tu corriges avant d'aller plus loin.


Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
5 janv. 2010 à 20:36
Salut, désolé de ne pas avoir inclus la fonction mysql real eascape string, je ne comprenais pas à quoi elle servait. Je les ais mises du coup car c'est utile en effet. Au bon endroit j'espère... Ceci dit je continue à rencontrer le même problème.

<?php
include "private.inc.php";
include "connect_bd.inc.php";

$_GET['id_photo'] =  mysql_real_escape_string ($_GET['id_photo']);
$id_photo=$_GET['id_photo'];

$query "SELECT * FROM photo INNER JOIN user ON user.id_user photo.id_user AND id_photo=$id_photo";

$result = mysql_query($query)
or die ("La requete '$query' a echouee");

while ($row = mysql_fetch_assoc($result)) {
$id_user = $row['login'];
$id_photo = $row['id_photo'];
    $titre = $row['titre'];
    $description = $row['description'];
    $date_depot = $row['date_depot'];
$nom_fic = $row['nom_fic'];
}
$chemin_photo="img/".$id_user.'/';

//jusque la ça va, j'ai les details qui s'affichent.
// c'est la requête ci dessous, insérer le commentaire dans le champ "texte_com" de la BDD

$_POST['commentaire'] = mysql_real_escape_string ($_POST['commentaire']);
if(isset($_POST['commentaire'])) $commentaire=$_POST['commentaire']; else $commentaire="";
 { echo $_POST['commentaire'];
$ajout_commentaire = "INSERT INTO commentaire (texte_com) VALUES ('$commentaire')";
mysql_query($ajout_commentaire) or die('Erreur SQL sur la requête :
'.$ajout_commentaire.'
'.mysql_error());
}

?>


 Ajouter un commentaire: 
<form method ="post">
<textarea name="commentaire" action="<?php echo $PHP_SELF; ?>" cols="50" rows="5"></textarea> 


</form>


Erreur SQL sur la requète :
INSERT INTO commentaire (texte_com) VALUES ('')
Cannot add or update a child row: a foreign key constraint fails


J'obtient cette erreur dés que je clique sur l'url http://localhost/details'idphoto=1 ou =2 ou n'importe quelle photo. J' ai un textarea (pour le commentaire) sous la photo et insérer le commentaire saisi dans ma BDD (dans le champ 'texte_com)' pour la photo 1 ou 2 etc.

Voila j'espère que c'est assez clair! Merci encore pour tout.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
5 janv. 2010 à 21:17
Re,

Tu te sers mal de mysql_real_escape_string(), même si ça fonctionne très bien ainsi.
Par exemple :
$_GET['id_photo'] = mysql_real_escape_string ($_GET['id_photo']);
$id_photo=$_GET['id_photo'];

=> tu compliques pour rien :
$id_photo = mysql_real_escape_string ($_GET['id_photo']);

est bien suffisant, même chose pour la variable $_POST un peu plus loin.
Par ailleurs préfère ne pas toucher aux variables POST, GET, etc ... affectent les plutôt à des variables, ça pourrait t'éviter des problèmes.

Par exemple là tu modifies ta variable $_POST['commentaire'] :
$_POST['commentaire'] = mysql_real_escape_string ($_POST['commentaire']);
=> préfère donc :
$commentaire = mysql_real_escape_string ($_POST['commentaire']);
... et bien sur tu utilises $commentaire pour la suite.

Concernant ton problème :
INSERT INTO commentaire (texte_com) VALUES ('')

Tu dois préciser l'id_user, qui doit exister dans la table use, même chose pour l'id_photo qui doit exister dans la table photo.
D'ailleurs tu récupères déjà ces infos, et d'autres, ... alors que tu ne les utilises pas


Cordialement,



Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
5 janv. 2010 à 21:46
Merci de cette réponse détaillée, c'est vrai, pourquoi faire compliqué quand on peut faire simple! J'ai précisé l'id user ainsi que l'id photo avec leurs variables respectables à savoir $id_user et $id_photo, ma requête est maintenant devenue celle ci:

$commentaire = mysql_real_escape_string ($_POST['commentaire']); 
if(isset($_POST['commentaire'])) $commentaire=$_POST['commentaire']; else $commentaire="";//puis- je fais un if(isset($commentaire)) plutôt? car cette ligne me paraît bizarrement écrite maintenant.

 { echo $_POST['commentaire'];

$ajout_commentaire = "INSERT INTO commentaire (texte_com) VALUES ('$commentaire') WHERE id_user=$id_user AND id_photo=$id_photo";
mysql_query($ajout_commentaire) or die('Erreur SQL sur la requête :
'.$ajout_commentaire.'
'.mysql_error());

}

Qui me retourne l'erreur suivante:
Erreur SQL sur la requête :
INSERT INTO commentaire (texte_com) VALUES ('') WHERE id_user=Malcolm AND id_photo=0
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id_user=toto AND id_photo=0' at line 1


Je me suis renseigné et apparemment il n'est pas possible de préciser, dans une une requête INSERT, un WHERE et un AND ? Cela serait possible seulement avec un UPDATE ?
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
5 janv. 2010 à 22:24
$commentaire = mysql_real_escape_string ($_POST['commentaire']);
if(isset($_POST['commentaire'])) $commentaire=$_POST['commentaire']; else $commentaire="";//puis- je fais un if(isset($commentaire)) plutôt? car cette ligne me paraît bizarrement écrite maintenant.

Oui, elle l'est, car si $_POST['commentaire'] n'est pas définie tu vas te retrouver avec une erreur au niveau du $commentaire = mysql_real ...
=>
if(isset($_POST['commentaire'])) {
$commentaire = mysql_real_escape_string($_POST['commentaire']);
} else $commentaire = "";
(je mets ici le code sur plusieurs lignes dans un simple souci de lisibilité, tu peux bien sur le mettre sur une seule ligne)

Je me suis renseigné et apparemment il n'est pas possible de préciser, dans une une requête INSERT, un WHERE et un AND ? Cela serait possible seulement avec un UPDATE ?

=>
Continue à te renseigner et à lire la doc et les multiples tutos qu'il existe sur le net, car il s'agit là des bases les plus essentielles du SQL.
INSERT : insertion d'un nouvel enregistrement, il va donc de soit que tu ne peux préciser une clause WHERE
UPDATE : mise à jour d'un enregistrement existant, la clause WHERE est donc nécessaire pour préciser quel enregistrement mettre à jour (sans ça c'est une mise à jour de tous les champs de la table)

Renseigne toi également sur les contraintes (doc mysql et google : "mysql FOREIGN KEY", "mysql clés étrangères") car ton problèmes initial se trouve là (voir le résultat de la requête SQL que je t'ai demandé de passer)

Sauf erreur de ma part tu es dans le cas d'un insert, il faut donc insérer tous les enregistrements qui te sont utiles (j'imagine ceux que tu récupères via post et get), et obligatoirement ceux que j'ai précisés et ceux qui n'auraient pas une valeur par défaut.

Cordialement,

Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
9 janv. 2010 à 23:11
Ok merci. Le problème se trouve effectivement dans la gestion des relations des clés... Malheureusement pour moi je ne vois pas ou est le problème... la configuration de mes tables m'a l'air tout à fait correcte, les relations sont logiques et devraient permettre à la requête INSERT INTO de fonctionner, mais en vain. Je suis donc bloqué à nouveau.

La table user est liée à la table photo qui elle même est liée à la table commentaire. Ce qui me permet de supprimer en cascade: un user et toutes ses photos + commentaires associés, ou bien une photo et ses commentaires.

Voila trois captures d'écran montrant les détails des tables, si par hasard vous voyez ou est le problème, je vous en serait très, très reconnaissant...!!

Table user:


Table photo:


Et table commentaire:


Merci pour tout.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
10 janv. 2010 à 00:37
Pour l'heure j'ai la flemme de relire le tout.

et devraient permettre à la requête INSERT INTO de fonctionner

As tu essayé de tester ce que je t'ai déjà conseillé plusieurs fois ?
Peut être est il utile de le re re re noter ?
Tu dois préciser l'id_user, qui doit exister dans la table use, même chose pour l'id_photo qui doit exister dans la table photo.
D'ailleurs tu récupères déjà ces infos, et d'autres, ... alors que tu ne les utilises pas

Sauf erreur de ma part tu es dans le cas d'un insert, il faut donc insérer tous les enregistrements qui te sont utiles (j'imagine ceux que tu récupères via post et get), et obligatoirement ceux que j'ai précisés et ceux qui n'auraient pas une valeur par défaut.


Le problème existe t il toujours ?
si oui où est le code modifié ?
le message d'erreur a t il changé ?




Kohntark -
0
jayjay1985 Messages postés 11 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 10 janvier 2010
10 janv. 2010 à 12:17
Oui j'essaye d'insérer les enregistrements récupérés, mais ça ne fonctionne pas. VOila le code:

<?php
require_once "private.inc.php";
include "connect_bd.inc.php";

$id_photo = mysql_real_escape_string ($_GET['id_photo']);

$query "SELECT * FROM photo INNER JOIN user ON user.id_user photo.id_user AND id_photo=$id_photo";

$result = mysql_query($query)
or die ("La requete '$query' a echouee");

while ($row = mysql_fetch_assoc($result)) {
$login = $row['login'];
$id_photo = $row['id_photo'];
    $titre = $row['titre'];
    $description = $row['description'];
    $date_depot = $row['date_depot'];
$nom_fic = $row['nom_fic'];
}
$chemin_photo="img/".$login.'/';

//la requete pour insérer me semble correcte:

$commentaire = mysql_real_escape_string($_POST['commentaire']);

if(isset($_POST['envoyer'])) {
$id_user = $_SESSION['id_user'];
$ajout_commentaire="INSERT INTO commentaire(`texte_com`,`id_user`,`id_photo`) VALUES ('$commentaire','$id_user','$id_photo')";
$result=mysql_query($ajout_commentaire) or die('Erreur SQL sur la requête :
'.$ajout_commentaire.'
'.mysql_error());

}
//cette partie ci dessous me servira à afficher le commentaire, mais qui ne fonctionne pas pour l'instant bien evidement car le commentaire ne peut pas etre inséré dans la bdd:

$select_data="SELECT id_com, texte_com, id_user FROM commentaire WHERE id_photo=($id_photo)";
$result=mysql_query($select_data) or die ('Erreur SQL:'.$select_data.'
'.mysql_error());

while ($com_data = mysql_fetch_assoc($result)) 

{
$id_com=$com_data["id_com"];
$texte_com=$com_data["texte_com"];
$id_user=$com_data["id_user"];
}


Erreur SQL sur la requête :
INSERT INTO commentaire(`texte_com`,`id_user`,`id_photo`) VALUES ('teste commentaire','toto','1')
Cannot add or update a child row: a foreign key constraint fails


J'ai fais des capture d'écran de mes tables dans mon post précédent...
Merci
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
10 janv. 2010 à 13:28
Oui j'essaye d'insérer les enregistrements récupérés, mais ça ne fonctionne pas.

Pense à le dire et à donner le code comme tu viens de le faire (lorsque c'est nécessaire), parce que vu de chez moi je ne peux pas le deviner !!

Sans chercher très loin (allons y pas à pas) voici la requête que tu tentes d'exécuter :

INSERT INTO commentaire(`texte_com`,`id_user`,`id_photo`)
VALUES ('teste commentaire','toto','1')

où (en se référant à tes copies d'écran) :
id_user => INT(11)
id_photo => INT(11)

Ce que tu essaies d'insérer :
id_photo => 1 => OK
id_user => 'toto' => String de 4 char != INT(11) => bad

Cordialement,


Kohntark -
0
mimisonia Messages postés 2 Date d'inscription jeudi 31 mars 2011 Statut Membre Dernière intervention 29 mai 2011
29 mai 2011 à 08:51
jn,b,n;
0
Rejoignez-nous