IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur PHP ou MySQL ?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 485
    Par défaut Erreur PHP ou MySQL ?
    Bonjour,

    Je veux insérer la valeur prise par la variable de session $_SESSION["FruitOrdre_$i"] dans la table feuille-fruit-desordre mais l'insertion de mon enregistrement ne s'effectue pas.
    Dans mon code, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $SQLinsertPlant = insertPlant();
    sachant que la fonction insertPlant est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function insertPlant()
    	{
    		$SQLinsertPlant = $pdo->query("INSERT INTO `feuille-fruit-desordre` (`id`, `fruit`) VALUES (NULL,   '".$_SESSION["FruitOrdre_$i"]."')  ");
    		return $SQLinsertPlant;
    	}
    Je ne rencontre pas de message d'erreur mais l'insertion ne se fait pas et si je fais appel à vous, c'est parce que je ne vois pas mon erreur.
    Êtes-vous plus réveillé(e)s que moi ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Bonjour,

    Qu'est-ce qui est retourné par $pdo->query() ?
    Un objet instance de la class PDOStatement ou FALSE ?

  3. #3
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 485
    Par défaut
    Citation Envoyé par Soundboy39 Voir le message
    Bonjour,

    Qu'est-ce qui est retourné par $pdo->query() ?
    Un objet instance de la class PDOStatement ou FALSE ?
    Bonjour Sounboy39,

    Merci pour ton intervention mais je suis incapable de répondre à ta question. Il n'y a aucun message de retourné.

  4. #4
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Sur base de la lecture de ton code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function insertPlant()
        {
            $SQLinsertPlant = $pdo->query("INSERT INTO `feuille-fruit-desordre` (`id`, `fruit`) VALUES (NULL,   '".$_SESSION["FruitOrdre_$i"]."')  ");
            return $SQLinsertPlant;
        }
    Que vaut la variable $i ? Elle n'est pas déclarée dans ta fonction.
    Et que vaut $pdo ? Non déclaré également au sein de ta fonction.

    Ton code est plutôt mauvais; toutes mes excuses d'être aussi direct :

    * Tu utilises des variables non déclarées,
    * Tu ne vérifies pas p.ex. avec un isset() pour voir si $_SESSION contient effectivement ta variable,
    * Tu ne protèges pas ton code (en ce qui concerne les SQL injections),
    * Tu retournes quelque chose mais qu'est-ce ? un objet ? un booléen ?

    Vu que ta fonction ne contient qu'une seule ligne (le pdo->query), je te suggère en l'état de supprimer ta fonction et de remplacer son appel par, justement, le $pdo->query que je suppose initialisé à ce moment-là.

    Bonne soirée.

  5. #5
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 485
    Par défaut
    Bonjour à tous 2 et merci pour vos interventions.
    Je regarde ça et reviens vers vous asap.

  6. #6
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 485
    Par défaut
    Bonjour cavo789,

    Désolé pour le délai mais j'ai dû en urgence m'ateler à d'autres tâches.

    Citation Envoyé par cavo789 Voir le message
    Que vaut la variable $i ? Elle n'est pas déclarée dans ta fonction.
    En effet, elle n'est as déclarée dans la fonction. C'est juste une avriable que j'incrémente et qui m'a permis précédemment de créer des variables de session différentes dans lesquelles j'ai stocké des valeurs.
    Quand $i=0, j'ai par exemple $_SESSION["FruitOrdre_1"] qui contient Peuplier, $_SESSION["FruitOrdre_2"] qui contient Aulne, etc.

    Citation Envoyé par cavo789 Voir le message
    Et que vaut $pdo ?
    C'est la connexion à la BdD

    Citation Envoyé par cavo789 Voir le message
    Ton code est plutôt mauvais; toutes mes excuses d'être aussi direct :
    Aucun problème, je suis un amateur pur et dur et n'ai aucune prétention technique dans ce domaine, ce n'est pas mon métier. Je me borne juste à maintenir en vie un site pour une communauté.

    Citation Envoyé par cavo789 Voir le message
    Tu utilises des variables non déclarées
    Si tu entends par là que les variables n'existent pas, hé bien elles existent. J'ai limité le code car il aurait fallu que j'envoie 5 fichiers de plusieurs centaines de lignes et j'ai eu peur de noyer le poisson.

    Citation Envoyé par cavo789 Voir le message
    Tu ne vérifies pas p.ex. avec un isset() pour voir si $_SESSION contient effectivement ta variable
    Exact, j'ai oublié ça. Je le modifie ainsi mais ne suis pas sûr de mon coup.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	function insertPlant()
    	{
    		if (isset($_SESSION["FruitOrdre_$i"]))
    			{
    				$SQLinsertPlant = $pdo->query("INSERT INTO `feuille-fruit-desordre` (`id`, `fruit`) VALUES (NULL,   '".$_SESSION["FruitOrdre_$i"]."')  ");
    			}
     
    		else
    			{
    				$SQLinsertPlant ="Probleme";
    			}
    		return $SQLinsertPlant;	// provoque la fin de la fonction et le renvoi de la valeur qui la suit
    	}
    Citation Envoyé par cavo789 Voir le message
    Tu ne protèges pas ton code (en ce qui concerne les SQL injections)
    C'est également vrai mais ça dépasse largement mon domaine de compétence.

    Citation Envoyé par cavo789 Voir le message
    Tu retournes quelque chose mais qu'est-ce ? un objet ? un booléen ?
    Aucune idée, comment savoir ?

    Citation Envoyé par cavo789 Voir le message
    Vu que ta fonction ne contient qu'une seule ligne (le pdo->query), je te suggère en l'état de supprimer ta fonction et de remplacer son appel par, justement, le $pdo->query que je suppose initialisé à ce moment-là.
    Là encore, j'ai joué à l'apprenti-sorcier en mettant ce code dans un fichier à part, un peu sur ce que j'ai cru comprendre du fonctionnement d'un modèle MVC pour lequel on met les fonctions dans le modèle, non ?

  7. #7
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour Denis

    Citation Envoyé par Denis Placé Voir le message
    En effet, elle n'est as déclarée dans la fonction. C'est juste une avriable que j'incrémente et qui m'a permis précédemment de créer des variables de session différentes dans lesquelles j'ai stocké des valeurs.
    Oui mais non ;-)
    Reprends ta fonction (celle que j'ai commentée) : tu utilises la variable $i dans ta fonction; au sein de ta fonction cette variable n'existe pas; elle n'y est ni déclarée ni assignée. Elle vaut donc null.

    Ce que tu me dis c'est que tu as déclaré et initialisé cette variable ailleurs; ok, très bien mais ... dans ta fonction, cette variable est inconnue.

    Et c'est la même chose pour ma question "Et que vaut $pdo ?"

    Au sein de ta fonction, $pdo est inconnu d'où problème; c'est quoi ? ben c'est rien. Et donc pas du tout ta connexion à la base de données.

    Citation Envoyé par Denis Placé Voir le message
    Aucune idée, comment savoir ?
    Ben... vu que tu es le programmeur, tu devrais le savoir ;-) (je taquine)

    Avec un code propre, quand tu fais appel à une fonction comme "getFirstName()" p.ex. tu attends quoi ? Ici, j'ai pris un exemple simple : une chaîne de caractères. Il n'est pas logique de recevoir un chiffre.

    Ta fonction devrait retourner; selon un principe "clean code" (code propre), un boolean je suppose. Tu es intéressé de savoir si ton insert à fonctionné.

    Que retourne $pdo->query ? Regarde la doc. Tu reçois un recordset qui retourne les valeurs (comme si je fais un SELECT FROM; je reçois les records).

    Toi tu veux faire quoi ? Un INSERT. Ne devrais-tu pas alors t'intéresser à la fonction pdo->exec() plutôt (https://www.php.net/manual/en/pdo.exec.php) ?
    Cette fonction va retourner, voir dans la doc, un entier : le nombre de records ayant été impacté. Si aucun n'a été impacté, retourne 0.

    Donc, si zéro, ouch!, il y a eu un souci. Ton INSERT est supposé ajouté un enregistrement.

    Du coup, si $pdo->exec(....) retourne le chiffre 1, ta fonction est réussie et peut retourner la valeur true. Sinon, ouch.

    Voici une proposition de code (PHP 7)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function insertPlant(string $fruit): void
    {
        $rows = $this->pdo->exec("INSERT ...");
     
        if (1 !== $rows) {
            throw new \Exception("Un problème est survenu");
        }
    }
    L'idée : tu appelles ta fonction depuis une classe qui a déjà initialisé la propriété $this->pdo (afin qu'elle soit globale).

    La fonction est appelée avec un paramètre qui correspond à ton $_SESSION["FruitOrdre_$i"].

    Cette fonction ... ne retourne rien. Car, en fait, on n'est pas intéressé de savoir si elle retourne true ou false. On veut (clean coding) qu'elle plante s'il y a eu un problème afin qu'on puisse réagir. En programmation propre, les erreurs ne doivent jamais être silencieuses; il faut les capturer immédiatement et les gérer (avec un try catch p.ex.).

    Je sais que j'ai été très certainement très technique ici; l'idée est de te donner quelques pistes.

    Bonne journée.

  8. #8
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 485
    Par défaut
    Re-bonjour cavo789,

    Suite à ton intervention, j'ai lu et tenté de comprendre ce que tu dis......
    J'ai donc modifié ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function insertPlant(string $fruit): void
    {
        $rows = $this->pdo->exec("INSERT INTO `feuille-fruit-desordre` (`id`, `fruit`) VALUES (NULL,   '".$fruit."')  ");
     
        if (1 !== $rows) {
            throw new \Exception("Un problème est survenu");
        }
    }
     
    insertPlant(string $fruit);
    J'ai bien entendu vérifié que $fruit existe bien et contient ma bonne chaîne de caractères qui, parfois, peut valoir bota-1234.jpg (mais c'est normal ).
    Malheureusement, le traitement du script s’arrête (et donc l'insertion ne se fait pas) et aucun message d'erreur ne s'affiche.

    Citation Envoyé par cavo789 Voir le message
    Je sais que j'ai été très certainement très technique ici; l'idée est de te donner quelques pistes.
    Euh.... légèrement technique J'ai de la lecture pour plusieurs jours, en tenant compte du travail de compréhension que cela entraîne.

    Merci de t'occuper de mon cas.

  9. #9
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Ton script est-il gigantesque car si pas, poste le ici pour qu'on puisse t'aider.

    Dans la fonction tu fais appel à $this->pdo mais as-tu défini cette propriété ? L'as-tu initialisée ? J'ai supposé dans mon dernier message que tu étais dans une classe php et j'ai supposé que tu avais initialisé la variable....

    Pour "rien ne se passe" pense à afficher les erreurs php. Cherche des infos sur error_reporting().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Erreur PHP ne peut charger l'extension mysql
    Par cyberfred1073 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/03/2007, 00h27
  2. Message d'erreur page PHP et MySQL
    Par littlesnoopy dans le forum Installation
    Réponses: 6
    Dernier message: 19/01/2007, 10h25
  3. Erreur php ou erreur mysql
    Par heyboy dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 11/10/2006, 11h45
  4. erreur php mysql
    Par taka10 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/08/2006, 10h41
  5. Erreur PHP et MySQL
    Par rane dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/05/2006, 19h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo