Page 1 sur 1

insertion en base de données mysql

Posté : 19 nov. 2013, 14:02
par rjuan
bonjour,
Je ne comprends pas pourquoi je ne peux insérer une nouvelle entrée dans ma base avec ces deux pages :
La première appelant la seconde.
Page "minichat.php" :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <title>Mini-chat</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <style type="text/css">
    form
    {
        text-align:center;
    }
    </style>
    <body>
    
    <form action="minichat_post.php" method="post">
        <p>
        <label for="nom">Nom</label> : <input type="text" name="nom" id="nom" /><br />
        <label for="message">Message</label> :  <input type="text" name="message" id="message" /><br /><br />
        <input type="submit" value="Envoyer" />
	</p>
   

<?php
include('db_connect.php');
$bdd=  \Connection();
$reponse = $bdd->query('SELECT nom, message FROM minichat ORDER BY ID DESC LIMIT 0, 10');
while ($donnees = $reponse->fetch())
{
	echo '<p><strong>' . htmlspecialchars($donnees['nom']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>';
}
$reponse->closeCursor();
?>
 </form>
    </body>
</html>
et la seconde ("minichat_post.php") :
<?php

/**
 * Description:
 * insère le message reçu par $_POST
 * et redirige vers minichat.php
 */
//appelé par Mininchat après connection, on sait que $bdd est initialisé.
// insertion de la requète
if (isset($_POST['Envoyer']) && isset($_POST['nom']) && isset($_POST['message']))
    {
    $req=$bdd->prepare('INSERT INTO minichat (id,pseudo,message) VALUES (:id,:nom, :message)');
    $req=$bdd->exec(array(
                        '',
                        $_POST['nom'],
                        $_POST['message']
                    ));
}
// 
// redirection vers le script appelant
header('Location:minichat.php');
?>

Re: insertion en base de données mysql

Posté : 19 nov. 2013, 14:12
par xTG
Parce que $_POST['Envoyer'] n'existe pas.
Tu n'as pas d'attribut name à ton bouton.

Re: insertion en base de données mysql

Posté : 19 nov. 2013, 17:00
par rjuan
Désolé, je n'arrive pas à comprendre pourquoi $_POST['nom'] n'existe pas :-(

Re: insertion en base de données mysql

Posté : 19 nov. 2013, 17:02
par xTG
Bah peut être parce qu'il existe ?
Relis ma réponse. ;)

Petit indice je ne parle pas le franglais...

Re: insertion en base de données mysql

Posté : 19 nov. 2013, 18:20
par rjuan
Je lis
Parce que $_POST['Envoyer'] n'existe pas.
Tu n'as pas d'attribut name à ton bouton.
.
J'ai attribué le paramètre "name" à mon bouton.
Quant à
Relis ma réponse. ;)
, je pense que tu fais allusion à ce paramètre, hmm?
Dans tous les cas, je n'arrive pas à comprendre, pour le moment.

Re: insertion en base de données mysql

Posté : 19 nov. 2013, 19:47
par xTG
Au temps pour moi dans ce cas, n'ayant pas eu de retour sur mon premier message je pensais que tu l'avais mal interprété.

Que te donnes un var_dump($_POST); sur ta page de traitement ?
Enfin ta requête préparée est mal utilisée.
Tu ne peux nommer des attributs si tu ne les insères pas explicitement (cf :nom, :message, ...).
Donc soit tu utilises l'attribut passe partout qui est le point d'interrogation.
Soit tu nommes tes attributs dans le execute (et non exec au passage qui prend en paramètre une requête SQL) qui sera appelée à partir du retour de prepare.

http://us3.php.net/manual/fr/pdostatement.execute.php

Re: insertion en base de données mysql

Posté : 20 nov. 2013, 17:33
par rjuan
var_dump($_POST) donne :

Code : Tout sélectionner

array 'nom' => string 'Jean' (length=4) 'message' => string 'Et moi ...' (length=10) 'Envoyer' => string 'envoyer' (length=7)

Re: insertion en base de données mysql

Posté : 20 nov. 2013, 17:34
par rjuan
... ce que j'attendais => ?

Re: insertion en base de données mysql

Posté : 20 nov. 2013, 20:53
par moogli
cela indique que ton formulaire fournit bien les infos que tu as besoin.

ensuite ce n'est pas la méthode exec qu'il te faut utiliser mais la méthode execute


@+

Re: insertion en base de données mysql

Posté : 21 nov. 2013, 11:50
par rjuan
Hargh, désolé, mais j'ai déjà modifié le script en remplaçant exec par executecomme ci-dessous et cela ne fonctionne pas; l'erreur étant :
Fatal error: Call to a member function prepare() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/eBookSDZero/chat/minichat_post.php on line 12.

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Mini-chat</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <style type="text/css"> form { text-align:center; } </style> <body> <form action="minichat_post.php" method="post"> <p> <label for="nom">Nom</label> : <input type="text" name="nom" id="nom" /><br /> <label for="message">Message</label> : <input type="text" name="message" id="message" /><br /><br /> <input type="submit" name="Envoyer" value="envoyer" /> </p> <?php include('db_connect.php'); $bdd= \Connection(); $reponse = $bdd->query('SELECT nom, message FROM minichat ORDER BY ID DESC LIMIT 0, 10'); while ($donnees = $reponse->fetch()) { echo '<p><strong>' . htmlspecialchars($donnees['nom']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>'; } $reponse->closeCursor(); ?> </form> </body> </html>
Cela étant pour la page formulaire, et ci-dessous pour la méthode d'insertione:

Code : Tout sélectionner

<?php // insertion de la requète if (isset($_POST['Envoyer']) && isset($_POST['nom']) && isset($_POST['message'])){ echo \var_dump($_POST); $req=$bdd->prepare('INSERT INTO minichat (nom,message) VALUES (?,?)'); $req->execute(array($_POST['nom'],$_POST['message'])); } // // redirection vers le script appelant header('Location:minichat.php'); ?>
Voilà, je continue à bidouiller mais j'y suis toujours pas, sachant que la ligne echo \var_dump($_POST) affiche bien les données saisies sur le formulaire.

Re: insertion en base de données mysql

Posté : 24 nov. 2013, 16:32
par rjuan
Tout fonctionne si je rapatrie le code minichat_post.php dans la procédure "appelante".

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Mini-chat</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <style type="text/css"> form { text-align:center; } </style> <body> <form action="minichat.php" method="post"> <p> <label for="nom">Nom</label> : <input type="text" name="nom" id="nom" /><br /> <label for="message">Message</label> : <input type="text" name="message" id="message" /><br /><br /> <input type="submit" name="Envoyer" value="envoyer" /> </p> <?php include('db_connect.php'); $bdd= \Connection(); // insertion de la requète if (isset($_POST['Envoyer']) && isset($_POST['nom']) && isset($_POST['message'])){ echo \var_dump($_POST); $req=$bdd->prepare('INSERT INTO minichat (nom,message) VALUES (?,?)'); $req->execute(array($_POST['nom'],$_POST['message'])); } $reponse = $bdd->query('SELECT nom, message FROM minichat ORDER BY ID DESC LIMIT 0, 10'); while ($donnees = $reponse->fetch()) { echo '<p><strong>' . htmlspecialchars($donnees['nom']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>'; } $reponse->closeCursor(); ?> </form> </body> </html>
C'est bien, mais c'est dommage que je n’ai pas pu savoir pourquoi le dernier code posté ne fonctionnait pas :(
Je vois bien que c'est donc un problème de relation entre les deux scripts... mais quoi :?: