Menu

Rien n'est ajouté à la base de donnée [Résolu/Fermé]

leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 5 juin 2014 à 17:33 - Dernière réponse : Hugo69009 13 Messages postés mercredi 6 novembre 2013Date d'inscription 7 juin 2014 Dernière intervention
- 7 juin 2014 à 16:53
Bonjour,

Je suis en train de créer un plugin wordpress, afin d'ajouter automatiquement un scooter à la base de donnée.

Pour se faire, j'utilise PhpMyAdmin, PHP.

J'ai donc créé un dossier "gallerie" dans mon dossier wp-content/plugins, dans lequel est répertorié le fichier gallerie.php.

gallerie.php est un formulaire :

<?php
try
 {
  $bdd = new PDO('mysql:host=localhost;dbname=scooter', 'root', '');
 }
  catch (Exception $e)
 {
        die('Erreur : ' . $e->getMessage());
 }

#Création du formulaire

?>

<form method="post" action="/wordpress/wp-admin/cible.php">
 <p>
  Marque : <input type="text" name="marque" />
  Modele : <input type="text" name="modele" />
  Option : <textarea name="option" rows="8" cols="45"></textarea>
  Garantie : <input type="text" name="garantie" />
  Prix : <input type="text" name="prix" />
     <input type="submit" value="Valider" />
    </p>
</form>


?>


Comme vous pouvez le voir, mon fichier appel cible.php, qui est programmé pour rentrer les données du formulaire dans la base de donnée. Ce fichier est placé dans le dossier /wp-admin

Voici son contenu :

<?php 
ini_set('display_errors', true);
error_reporting(E_ALL);

$marque = $_POST['marque'];
$modele = $_POST['modele'];
$option = $_POST['option'];
$garantie = $_POST['garantie'];
$prix = $_POST['prix'];

$utilisateur='root';
$mdp='';

  try
 {
  // Connexion à la base de donnée scooter
  $bdd = new PDO("mysql:host=localhost; dbname=scooter", $utilisateur, $mdp);
  // Requête SQL
  
 }
  catch (Exception $e)
 {
        die('Erreur : ' . $e->getMessage());
 }

   $req = "INSERT INTO 'vehiculesneufs' ('marque', 'modele', 'options', 'garantie', 'prix') VALUES
         (:marque, :modele, :option, :garantie, :prix)";

      
$base = $bdd->prepare($req);
    $base->bindValue(':marque', $marque, PDO::PARAM_STR);
    $base->bindValue(':modele', $modele, PDO::PARAM_STR);
    $base->bindValue(':option', $option, PDO::PARAM_STR);
    $base->bindValue(':garantie', $garantie, PDO::PARAM_STR);
    $base->bindValue(':prix', $prix, PDO::PARAM_INT);
    
    $base->execute();
    $base->closeCursor();
?>


Le souci est que lorsque je rentre mes données dans le formulaire et que je valide, rien n'est ajouté à la base de données.
Sur mon navigateur est affiché une page blanche, dont l'URL est http://localhost/wordpress/wp-admin/cible.php
et aucune erreur n'est affichée.

Cela fait 2 heures que j'essaie de trouver une solution, sans aucun résultat.
Merci d'avance de votre aide.
Afficher la suite 

29 réponses

le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 5 juin 2014 à 17:45
0
Utile
1
Bonjour

$base->bindValue(':prix', $marque, PDO::PARAM_INT);


Tu as mis $marque à la place de $prix. Ça ne doit pas convenir comme PARAM_INT. Je ne sais pas si ça suffit à expliquer ton problème.
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 5 juin 2014 à 17:49
Merci de m'avoir fait remarqué cette erreur de ma part. Mais ça n'a pas résolu mon problème ...
Hugo69009 13 Messages postés mercredi 6 novembre 2013Date d'inscription 7 juin 2014 Dernière intervention - 5 juin 2014 à 19:32
0
Utile
4
Je sais c'est tout bête tu utilise PDO pour te connecter à ta bdd donc au lieu de mettre :

VALUES (:marque, :modele, :option, :garantie, :prix)";

il faut mettre VALUES (?, ?, ?, ?, ?);

^^
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 5 juin 2014 à 19:39
Merci pour votre réponse. Je remplace donc mes valeurs par des points d'interrogation. Mais comment le code reconnaît quelle variable va à tel endroit du coup ?
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 08:17
Bonjour

Toi, tu n'as lu que la moitié de la doc sur PDO. Utiliser des ? n'est pas la seule, ni la meilleure manière d'utiliser PDO.
Hugo69009 13 Messages postés mercredi 6 novembre 2013Date d'inscription 7 juin 2014 Dernière intervention - 7 juin 2014 à 16:52
en pdo il faut utiliser les ? parce qu'en poo avec php les valeurs sont comme des objets et php va reprendre, pour insérer les données l'ordre du tableau précédent et c'est comme ça qu'on fait c'est tout j'invente rien au pire test moi ça marche
Hugo69009 13 Messages postés mercredi 6 novembre 2013Date d'inscription 7 juin 2014 Dernière intervention - 7 juin 2014 à 16:53
pour déboguer tes action utilise var_dump pour voir comment php traite ton code
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 08:20
0
Utile
3
Pour voir s'il y a une autre erreur, laisse tous tes appels à PDO à l'intérieur de 'try'.
Ajoute aussi un echo 'coucou'; juste avant ou après ton $base->execute(); pour être sûr que cette partie du code est bien exécutée.
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 09:17
J'ai ajouté le echo 'coucou'; juste après $base->execute(); et il s'affiche bien. Mais toujours rien dans la BDD.
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 09:19
As-tu aussi mis tous tes appels à PDO à l'intérieur du 'try' ?
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 09:22
Oui ..

		try
	{
		// Connexion à la base de donnée scooter
		$bdd = new PDO("mysql:host=localhost; dbname=scooter", $utilisateur, $mdp);
		$req = "INSERT INTO 'vehiculesneufs' ('marque', 'modele', 'options', 'garantie', 'prix') VALUES
	(:marque, :modele, :option, :garantie, :prix)";

      
		$base = $bdd->prepare($req);
  		$base->bindValue(':marque', $marque, PDO::PARAM_STR);
  		$base->bindValue(':modele', $modele, PDO::PARAM_STR);
  		$base->bindValue(':option', $option, PDO::PARAM_STR);
  		$base->bindValue(':garantie', $garantie, PDO::PARAM_STR);
  		$base->bindValue(':prix', $prix, PDO::PARAM_INT);
  		
  		$base->execute();
  		echo 'coucou';
  		$base->closeCursor();
  		
	}
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 09:31
0
Utile
J'ai lancé le fichier cible.php directement dans mon navigateur, http://localhost/wordpress/wp-admin/cible.php

et me voilà des erreurs !
Je pense qu'aucune erreur ne s'affichait auparavant, étant donné que gallerie.php est juste. Je vais maintenant essayer de résoudre ces erreurs.
(!) Notice Undefined index: marque
(!) Notice Undefined index: modele
etc. pour les 3 variables suivantes.
reaverlost 149 Messages postés jeudi 27 mai 2010Date d'inscription 28 mai 2015 Dernière intervention - 6 juin 2014 à 09:31
0
Utile
Salut,

Enlève les côtes simple côtes dans ta requête :

$req = "INSERT INTO vehiculesneufs ....
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 10:40
0
Utile
1
Si tu lances directement ta page cible.php, le formulaire n'est pas rempli, et il est donc parfaitement normal que les indices 'marque' et 'modele' ne soient pas définis. Il n'y a rien à corriger, au contraire ça prouve que ton formulaire est bien pris en compte.

Comme la requête semble bien s'exécuter, et qu'il n'y a aucun message d'erreur, je te propose à titre d'essai de provoquer une erreur pour voir qu'elle est bien détectée. Par exemple en mettant en commentaire le 'bind' d'une de tes variables.
S'il n'y a pas d'erreur, c'est que les erreurs ne sont pas détectées pour une raison qu'il faudra déterminer.
S'il y en a une, comme il n'y avait pas de message d'erreur jusqu'ici, c'est que la donnée est bien insérée, mais qu'il y a quelque chose qui ne va pas dans ta manière de vérifier si l'insertion a eu lieu.
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 11:15
J'ai suivi vos conseil, et j'ai mis la ligne
//$base->bindValue(':marque', $marque, PDO::PARAM_STR);

Et j'ai une erreur :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 11:29
0
Utile
1
Donc les erreurs sont bien détectées quand il y en a.
Donc il n'y a pas d'erreur. (Enfin, il n'y en aura plus quand tu auras retirée la mise en commentaire)
Donc l'insertion a bien lieu.
Alors les données ne sont peut-être pas celles que tu crois, ou tu ne les vérifie pas au bon endroit.
On va commencer par vérifier les données avec un echo $marque,' ',$modele; pour être sûr qu'il y a bien des données.
Ensuite, tu diras comment tu fais pour vérifier que les données ne sont pas insérées. Es-tu sûr de regarder dans la bonne base, la bonne table ? La table est-elle complètement vide, ou y a-t-il déjà des données dedans ?
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 11:34
Lorsque je fais un echo $marque; la marque est bien affiché.
Pour vérifier mes données, je vais sur http://localhost/phpmyadmin/
Je vais dans ma BDD 'scooter', puis sur la table 'vehiculesneufs'.
La table contient déjà un tuple, que j'avais rentré directement sur phpmyadmin et pas par le formulaire.
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 12:01
0
Utile
1
Pas possible.

Peux-tu ajouter dans ton script une requête SELECT pour afficher le contenu de ta table ? Juste pour voir si tu affiches le tuple que tu vois avec PHPmyadmin, ou ceux que tu aurais dû insérer ?
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 15:13
Je vois le tuple de PHPmyadmin ...
Pitet 2378 Messages postés lundi 11 février 2013Date d'inscription 2 février 2018 Dernière intervention - 6 juin 2014 à 15:24
0
Utile
3
Salut,

Peux tu nous donner la structure de ta table sql ?
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 15:27
Ma table s'appelle vehiculesneufs

- marque : varchar(50)
- modele : varchar(50)
- cylindree : varchar(10)
- options : varchar(200)
- garantie : varchar(50)
- prix : int(50)
Pitet 2378 Messages postés lundi 11 février 2013Date d'inscription 2 février 2018 Dernière intervention - 6 juin 2014 à 15:59
Non je ne vois rien de bloquant.

As-tu essayé d'enlever les guillemets simples dans ta requête comme conseillé par reaverlost ?

Tu pourrais également tester sans utiliser de requête préparée.
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 16:10
Pour les guillemets, si c'en était vraiment, celà provoquerait une erreur qui serait affichée. Il s'agit sûrement d'accents graves.
Je commence à manquer d'imagination
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - Modifié par le père. le 6/06/2014 à 16:13
0
Utile
Le champ cylindree n'est pas rempli. Ne serait-il pas défini en non null et sans valeur par défaut ? Essaye de lui donner une valeur dans ton INSERT (même fixe, juste pour voir)
Si jamais c'est ça, restera à comprendre pourquoi ça ne provoquait pas d'erreur.
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 16:16
0
Utile
Bon, j'ai résolu une partie du soucis.

Le soucis vient de la requête.
Lorsque je remplace les :marque, :modele etc.. par de vraies valeur, le tuple s'ajoute à la table.
Actuellement, rien ne s'ajoute à la base de données étant donné que PHPmyadmin attend des '' autour des valeur à ajouter.

Il faut donc que je trouve une solution pour permettre à PHPMyAdmin de lire mes variables !
leadgn 13 Messages postés jeudi 5 juin 2014Date d'inscription 17 juin 2014 Dernière intervention - 6 juin 2014 à 16:26
0
Utile
1
C'est bon, problème résolu !

J'ai revu mon code, j'ai enlevé tous les bindValue, et suis revenue vers un code beaucoup plus soft !

$req = "INSERT INTO 'vehiculesneufs' ('marque', 'modele', 'cylindree', 'options', 'garantie', 'prix') VALUES
	('$marque', '$modele', '$cylindree', '$option', '$garantie', '$prix')";

$bdd->exec($req);


C'était majoritairement des problèmes de guillemets qui ne permettait pas à phpmyadmin de lire ma requête !

Merci à vous de m'avoir aidé, d'avoir pris de votre temps pour résoudre mon gros soucis, qui était en faite minuscule !

Encore merci !
Pitet 2378 Messages postés lundi 11 février 2013Date d'inscription 2 février 2018 Dernière intervention - 6 juin 2014 à 16:37
Attention aux injections sql.
Si tu construits toi même ta requête, utilise la méthode quote de pdo pour ajouter les guillemets et protéger ta requête contre les injections sql :
$req = "INSERT INTO 'vehiculesneufs' ('marque', 'modele', 'cylindree', 'options', 'garantie', 'prix') VALUES (" . $bdd->quote($marque) . ", " . $bdd->quote($modele) . ", " . $bdd->quote($cylindree) . ", " . $bdd->quote($option) . ", " . $bdd->quote($garantie) . ", " . $bdd->quote($prix) . ")"; 


Les requêtes préparées fonctionnent de la même façon : la méthode bindValue ajoute des guillemets autour de la valeur et protège la donnée contre les injections sql. Ton code avec la requête préparée était donc correct et aurait du donner le même résultat...
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - Modifié par le père. le 6/06/2014 à 16:32
0
Utile
1
Pas d'accord du tout.
Nous n'avons pas trouvé pourquoi ça ne marchait pas tel que tu le faisais avant. Normalement, ça aurait dû être bon.
Avec ton nouveau code 'qui marche', ça va planter dès que tu mettras des apostrophes dans tes marques, modèles, option...
Il n'y avait aucun problème de guillemets, en tous cas je ne vois pas où et phpmyadmin n'a rien à voir là dedans, je suppose que tu le confonds avec mysql.
le père. 6043 Messages postés mardi 15 mai 2012Date d'inscription 24 avril 2018 Dernière intervention - 6 juin 2014 à 16:38
C'était peut-être le closeCursor, qui n'avait rien à faire ici, même si je ne vois pas en quoi il pouvait gêner.