insertion en base de données mysql

Eléphanteau du PHP | 16 Messages

19 nov. 2013, 14:02

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');
?>
Modifié en dernier par moogli le 19 nov. 2013, 14:12, modifié 1 fois.
Raison : Bbcode php

ViPHP
xTG
ViPHP | 7331 Messages

19 nov. 2013, 14:12

Parce que $_POST['Envoyer'] n'existe pas.
Tu n'as pas d'attribut name à ton bouton.

Eléphanteau du PHP | 16 Messages

19 nov. 2013, 17:00

Désolé, je n'arrive pas à comprendre pourquoi $_POST['nom'] n'existe pas :-(

ViPHP
xTG
ViPHP | 7331 Messages

19 nov. 2013, 17:02

Bah peut être parce qu'il existe ?
Relis ma réponse. ;)

Petit indice je ne parle pas le franglais...

Eléphanteau du PHP | 16 Messages

19 nov. 2013, 18:20

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.

ViPHP
xTG
ViPHP | 7331 Messages

19 nov. 2013, 19:47

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

Eléphanteau du PHP | 16 Messages

20 nov. 2013, 17:33

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)

Eléphanteau du PHP | 16 Messages

20 nov. 2013, 17:34

... ce que j'attendais => ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 nov. 2013, 20:53

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


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 16 Messages

21 nov. 2013, 11:50

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.

Eléphanteau du PHP | 16 Messages

24 nov. 2013, 16:32

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