Rien n'est ajouté à la base de donnée

Résolu/Fermé
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014 - Modifié par leadgn le 5/06/2014 à 17:51
Hugo69009 Messages postés 13 Date d'inscription mercredi 6 novembre 2013 Statut Membre Dernière intervention 7 juin 2014 - 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.

13 réponses

Utilisateur anonyme
5 juin 2014 à 17:45
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.
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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 ...
0
Utilisateur anonyme
6 juin 2014 à 08:20
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.
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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.
0
As-tu aussi mis tous tes appels à PDO à l'intérieur du 'try' ?
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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();
  		
	}
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
6 juin 2014 à 09:31
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.
0
reaverlost Messages postés 150 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 14 mai 2018 21
6 juin 2014 à 09:31
Salut,

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

$req = "INSERT INTO vehiculesneufs ....
0

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

Posez votre question
Utilisateur anonyme
6 juin 2014 à 10:40
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.
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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
0
Utilisateur anonyme
6 juin 2014 à 11:29
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 ?
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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.
0
Utilisateur anonyme
6 juin 2014 à 12:01
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 ?
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
6 juin 2014 à 15:13
Je vois le tuple de PHPmyadmin ...
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 juin 2014 à 15:24
Salut,

Peux tu nous donner la structure de ta table sql ?
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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)
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 6/06/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.
0
Utilisateur anonyme
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
0
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.
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
6 juin 2014 à 16:16
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 !
0
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
6 juin 2014 à 16:26
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 !
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
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...
0
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.
0
Utilisateur anonyme
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.
0
Hugo69009 Messages postés 13 Date d'inscription mercredi 6 novembre 2013 Statut Membre Dernière intervention 7 juin 2014 7
5 juin 2014 à 19:32
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 (?, ?, ?, ?, ?);

^^
-1
leadgn Messages postés 13 Date d'inscription jeudi 5 juin 2014 Statut Membre Dernière intervention 17 juin 2014
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 ?
0
Utilisateur anonyme
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.
0
Hugo69009 Messages postés 13 Date d'inscription mercredi 6 novembre 2013 Statut Membre Dernière intervention 7 juin 2014 7
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
0
Hugo69009 Messages postés 13 Date d'inscription mercredi 6 novembre 2013 Statut Membre Dernière intervention 7 juin 2014 7
7 juin 2014 à 16:53
pour déboguer tes action utilise var_dump pour voir comment php traite ton code
0