PB ecriture dans base de donnée.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PB ecriture dans base de donnée.

par sadeq » 22 juil. 2008, 18:39

Le problème n'est pas dans la requête INSERT, il est ailleurs. Mais il faudra nous donner le code HTML de ton formulaire.

Voilà j'anticipe pour t'expliquer le problème :
Dans un formulaire les champs sont nommés et les noms doivent être les mêmes que ceux que tu utilises dans ta requête INSERT.

Le formulaire a une méthode d'envoi. Par défaut : GET, sauf si on utilise POST. De ce fait, PHP doit récupérer d'abord les champs envoyés selon la méthode d'envoi GET ou POST.

Voici un exemple :
La page du formulaire HTML:

Code : Tout sélectionner

<form method="GET" action="programme1.php"> <input type="text" name="champ1" /> <input type="text" name="champ2" /> <input type="submit" name="envoyer" value="Envoyer" /> </form>
Le programme1.php :
<?php
// Réception des champs
if ($_GET["envoyer"]) { // si le formulaire est envoyé
  $champ1 = $_GET["champ1"]; // La méthode d'envoi est GET
  $champ2 = $_GET["champ2"];

  // Requête INSERT
  $sql = "INSERT INTO maTable VALUES ('', '$champ1', '$champ2')";

  // L'exécuter
   mysql_connect("localhost", "root", "");
   mysql_select_db("test");
   mysql_query($sql);
}
?>
Si la méthode d'envoi est POST il faut simplement utiliser $_POST au lieu de $_GET
Remarque que tous les champs du formulaire y compris le bouton submit sont utilisés dans le script PHP avec leurs noms d'origine mais via la méthode d'envoi $_GET ou $_POST.

Donc :
  • On a utilisé $_GET car le formulaire est <form method="GET" action="programme1.php">
    $_GET["champ1"] correspond au champ <input type="text" name="champ1" />
    $_GET["champ2"] correspond au champ <input type="text" name="champ2" />
    $_GET["envoyer"] correspond au champ <input type="submit" name="envoyer" value="Envoyer" />
$_GET ou $_POST sont des tableaux superglobaux qui contiennent automatiquement tous les champs envoyés par un formulaire. Chaque champ occupe une case dont l'index porte le nom du champ et qui contient la valeur remplie par l'utilisateur.

par Patriboom » 22 juil. 2008, 18:09

Il te manque un point (.) après $titre

par Azra8 » 22 juil. 2008, 15:30

La base de donnée....

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.6 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mar 22 Juillet 2008 à 15:25 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `bdbaa` -- -- -------------------------------------------------------- -- -- Structure de la table `ecrireindex` -- CREATE TABLE `ecrireindex` ( `id` mediumint(9) NOT NULL auto_increment, `auteur` text NOT NULL, `date` text NOT NULL, `titre` text NOT NULL, `texte` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ; -- -- Contenu de la table `ecrireindex` -- INSERT INTO `ecrireindex` (`id`, `auteur`, `date`, `titre`, `texte`) VALUES (16, 'Date', 'monprénom', 'Test', 'Par le code source de la page ecrire_accueilphp'), (17, '', '', '', ''), (18, 'Date', 'monprénom', 'Test', 'Par le code source de la page ecrire_accueilphp'), (19, 'Date', 'monprénom', 'Test', 'Par le code source de la page ecrire_accueilphp');

Comme tu peux le constater le contenu de la table correspond au moult fois où j'ai fait la première manip que j'expliquais.

!!!
J'ai bien inclu ton code dans ma page (au passage il manquait un guillemet après texte.... lol)
Voici ce que mysql à repondu :

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\wamp\www\test\ecrire_accueil.php on line 30

La ligne 30 est la suivante :
$requete = 'INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');

par Patriboom » 22 juil. 2008, 14:51

$requete = 'INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.')';
echo 'Voici ma requête: '.$requete.'<br>';
if (mysql_query($requete, $db)) { echo "Bon travail" } else { echo "Voici l'erreur ".mysql_error()."<br>"; }
Désole, je n'arrive pas à corriger ce code.... etant débutant, il y a des trucs que je comprends mal : qu'est-ce donc que ce '<br>' ?
dois-je écrire $requete ou cela signifie-t-il "mets ta requete en l'occurence mysql_query" ?
Tu peux copier/coller tel quel.

Le <br>, c'est du HTML ordinaire pour "saut de ligne"
Ceci étant je confirme le "or die ne donne rien du tout ! Et c'est ca qui fait la différence comme dirait michel chevalet....
C'est normal que "or die" ne donne rien. La commande "or die" demande de tout arrêter (mourir) s'il y a un problème. C'est la commande mysql_error() qui affichera le trouble.
Déja tenté cette solution, j'ai vraiment repris caractère après caractère vérifié la syntaxe et nommé les champs, revérifié l'ordre dans la bd, dans la requete ainsi que dans mon formulaire...
$requete = 'INSERT INTO ecrireindex (liste, des, quatre, champs) VALUES( "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
Il ne s'agit pas de copier caractère par caractère (car tu pourrais corriger la chose sans trop t'en rendre compte, mais bien de faire: sélectionner (avec ta souris, noircir le texte), puis copier - coller dans ton PhpMyAdmin. Là, tu seras sûr de transporter tes erreurs.

Conformément aux règles de ce forum, il faudrait que tu fournisses la structure de ta table si tu veux que nous t'aidions. C'est plus efficace pour nous. Tu fais: "exporter" dans PhpMyAdmin, tu choisis la table sur laquelle nous discutons ici, tu sélectionne "exporter la structure" et tu fais copier - coller du résultat que tu obtiens à l'écran. Ce devrait être quelque chose comme CREATE TABLE machinTruc (champ1, champ2, champ3 ...)

par Azra8 » 22 juil. 2008, 09:40

Merci de vos réponses. Je vais tenter d'être le plus clair possible :
Ceci :

:?:
$requete = 'INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.')';
echo 'Voici ma requête: '.$requete.'<br>';
if (mysql_query($requete, $db)) { echo "Bon travail" } else { echo "Voici l'erreur ".mysql_error()."<br>"; }
:arrow:

Désole, je n'arrive pas à corriger ce code.... etant débutant, il y a des trucs que je comprends mal : qu'est-ce donc que ce '<br>' ?
dois-je écrire $requete ou cela signifie-t-il "mets ta requete en l'occurence mysql_query" ?

Ceci étant je confirme le "or die ne donne rien du tout ! Et c'est ca qui fait la différence comme dirait michel chevalet....

:?:
$requete = 'INSERT INTO ecrireindex (id, liste, des, quatre, champs) VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
:arrow:

Déja tenté cette solution, j'ai vraiment repris caractère après caractère vérifié la syntaxe et nommé les champs, revérifié l'ordre dans la bd, dans la requete ainsi que dans mon formulaire...

:?:
$requete = 'INSERT INTO ecrireindex (liste, des, quatre, champs) VALUES( "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
:arrow:

Pour cette partie, tout betement parceque j'ai appris que l'id en auto-increment s'ecrivait quand meme dans la requete sous forme de deux guillemet ou apostrophe sans rien entre les deux ;)

Merci de votre aide quand même....

par Patriboom » 22 juil. 2008, 04:16

Pour déboguer une inscription à la base, il n'y a rien comme un echo qui nous donne la valeur traitée par le serveur MySQL:


$requete = 'INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.')';
echo 'Voici ma requête: '.$requete.'<br>';
if (mysql_query($requete, $db)) { echo "Bon travail" } else { echo "Voici l'erreur ".mysql_error()."<br>"; }
Tu prends (copier/coller) cet affichage et tu l'envoies directement dans la case "SQL" de phpmyadmin et tu lis attentivement le message d'erreur. En principe, le message d'erreur devrait positionner le début de la citation qu'il fera de ta commande précisément où se situe d'erreur (souvent une question de guillemets, de virgule, de nombre de champs).

Autre chose, il est plus facile de gérer l'insertion des champs aux bons endroits, lorsqu'on prend la peine de les nommer:
$requete = 'INSERT INTO ecrireindex (id, liste, des, quatre, champs) VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
Je suppose aussi que tu as fait un auto_increment à ton id. Puisque MySQL le fera automatiquement, pourquoi encombrer ton code d'une gestion que le serveur fera:
$requete = 'INSERT INTO ecrireindex (liste, des, quatre, champs) VALUES( "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
Je suis du même avis que chrislabricole, c'est plus clair avec les guillemets ouvrant et fermant comme il te le propose. Tu peux déjà en voir un fruit dans la coloration qu'offre ce forum.

par Patriboom » 22 juil. 2008, 04:13

Pour déboguer une inscription à la base, il n'y a rien comme un echo qui nous donne la valeur traitée par le serveur MySQL:


$requete = 'INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.')';
echo 'Voici ma requête: '.$requete.'<br>';
if (mysql_query($requete, $db)) { echo "Bon travail" } else { echo "Voici l'erreur ".mysql_error()."<br>"; }
Autre chose, il est plus facile de gérer l'insertion des champs aux bons endroits, lorsqu'on prend la peine de les nommer:
$requete = 'INSERT INTO ecrireindex (id, liste, des, quatre, champs) VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
Je suppose aussi que tu as fait un auto_increment à ton id. Puisque MySQL le fera automatiquement, pourquoi encombrer ton code d'une gestion que le serveur fera:
$requete = 'INSERT INTO ecrireindex (liste, des, quatre, champs) VALUES( "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
Je suis du même avis que chrislabricole, c'est plus clair avec les guillemets ouvrant et fermant comme il te le propose. Tu peux déjà en voir un fruit dans la coloration qu'offre ce forum.

par Sékiltoyai » 22 juil. 2008, 00:26

Ouais mais bon, c'est plus compréhensible quand même :oops:
Cela dépend, et cela ne fait pas avancer le problème…

par chrislabricole » 22 juil. 2008, 00:20

Oops j'ai oublier un point dans mon code :P

Ouais mais bon, c'est plus compréhensible quand même :oops:

par Sékiltoyai » 21 juil. 2008, 23:33

mysql_query('INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
C'est un simple problème d'apostrophe/guillemets ;)
Non, de ce point de vue le code était tout à fait correct…

Tu dis qu'un or die(mysql_error()) n'affiche rien ?

par chrislabricole » 21 juil. 2008, 18:01

mysql_query('INSERT INTO ecrireindex VALUES("", "'.$date.'", "'.$auteur.'", "'.$titre'", "'.$texte.'")');
C'est un simple problème d'apostrophe/guillemets ;)

PB ecriture dans base de donnée.

par Azra8 » 21 juil. 2008, 17:49

Bonjour à tous,
Après avoir écumé un autre forum, après avoir usé les nerfs de 4 ou 5 gentils forumeurs qui ont tout tentés, j'ai toujours le même soucis.
J'utilise wampserver2.0 en local.
Firefox 3.0.1

Je tente de dynamiser mon site en faisant un petit script tout simple pour écrire des articles facilement.
On écrit dans un formulaire "ecrire.php" auteur, date, titre, texte
Il insert dans la base de donnée qui est lut par une autre page (ici c'est index.php).
Désolé c'est très simple comme explication pour l'instant mais bon c'est juste histoire d'être clair.

Mon soucis :

Si je mets cette requête :

Code : Tout sélectionner

<?php mysql_connect("localhost", "root", ""); mysql_select_db("bdbaa"); // On ajoute une entrée avec mysql_query mysql_query("INSERT INTO ecrireindex VALUES('', 'Date', 'Mon prénom', 'Test', 'Par le code source de la page ecrire_accueilphp')"); mysql_close(); //CETTE PAGE FONCTIONNE LES VALEURS SONT INCLUES DANS LA BDD DES QUE L'ON APPUI SUR ENVOYER (EN LAISSANT LES CHAMPS DU FORMULAIRE VIDE) ?>
La table est correctement remplie par cette requête (comme mit en commentaire) et la page index.php lit parfaitement et affiche tout comme je le désire.

Cependant si je remplace les valeurs à inclure par des variables :

Code : Tout sélectionner

mysql_query("INSERT INTO ecrireindex VALUES('', '$date', '$auteur', '$titre', '$texte')");
alors rien n'est entrée dans la base de donnée, le or die ne donne rien et donc rien n'apparait sur ma page cible.

Mis à part la première entrée 'id' en auto_increment et primary ,j'ai tenté de me simplifier la vie en ne mettant que des types "text" pour toutes les autres entrées.

Voilà, je bloque, une fois ceci terminé il me faudra plus que 20 minutes pour terminer mon site merci de votre aide éventuelle...