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 :

Requête préparée KO [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut Requête préparée KO
    Bonjour à tous,

    J'ai la requête suivant qui fonctionne dans une autre partie de mon script général:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if($_POST["showThumb"])
    {
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    $stmt -> execute();
    $stmt-> store_result();
    $stmt -> bind_result($id_size,$size_name);
    while($stmt -> fetch()){
    	echo'<span sizeID = "'.$id_size.'" >'.$size_name.'</span>';
    }
    $stmt -> close();
    }
    Mais, j'ai introduit cette même requête dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function showCart(){
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    		$stmt -> execute();
    		$stmt-> store_result();
    		$stmt -> bind_result($id_size,$size_name);
    		while($stmt -> fetch()){
    		echo'<span sizeID = "'.$id_size.'" >'.$size_name.'</span>';
    		}
    		$stmt -> close();
    }
    Résultat, ma fonction showCart() ne fonctionne pas quand je l'appelle. J'ai beau chercher je ne comprends pas pourquoi. Avez vous une idée svp?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Pour pouvoir répondre il faudrait la trace de la requête telle qu'exécutée pour s'assurer du code reçu (et non les différents morceaux assemblés dans le programme) et surtout le résultat (log d'exécution avec SQLCA complète)

  3. #3
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Merci escartefigue,

    Par contre je ne maîtrise pas très bien la prog... Quand tu parles de log d'exécution avec SQLCA, je balise !!!

    Je comprends ta demande pour que tu puisses voir le problème que mais vais tenter avec mes mots et mon niveau de débutant.

    En fait il y a dans ma fonction showCart() d'autres codes qui s'exécutent très bien jusque là. Mais quand je rajoute dans ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    $stmt -> execute();
    $stmt-> store_result();
    $stmt -> bind_result($id_size,$size_name);
    while($stmt -> fetch()){
    echo'<span sizeID = "'.$id_size.'" >'.$size_name.'</span>';
    }
    $stmt -> close();
    elle ne fonctionne plus, alors qu'ailleurs, ce bout de code fonctionne très bien et m'affiche bien en boucle : echo'<span sizeID = "'.$id_size.'" >'.$size_name.'</span>';

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Ce que je veux dire c'est qu'entre le programme qui prépare et émet l'ordre SQL, et la base de données qui exécute l'ordre SQL, il faut vérifier qu'il n'y a pas de pertes et que l'ordre reçu (si toutefois il est reçu) est bien celui attendu
    Ensuite tout ordre SQL exécuté produit un résultat, dont le diagnostic est émis via une zone formatée qui s'appelle la SQLCA.
    C'est cette zone qui contient notamment le SQLCODE et plein d'autres informations nécessaires au diagnostic (que ce soit OK ou non)

    Si tu cherches dans un moteur de recherche SQLCA tu en trouveras le découpage avec les explications.

  5. #5
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    OK, je vais voir cela en détail pour bien comprendre ce qu'est SQLCA...

    Je reviens au plus vite.

    Merci pour tes conseils.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut teddol .

    Tu as une fonction développé en php qui fait un accès à ta base de données.
    Tu l'utilises à deux endroits de ton application, donc dans deux scripts différents.
    Et dans un cas elle fonctionne et dans l'autre cas, elle ne fonctionne pas.
    C'est bien cela ?

    Quel est le message d'erreur que tu obtiens ?
    Il se peut que celui-ci ne s'affiche pas. Il faudrait alors regarder la log pour le retrouver.

    Une solution est de faire un test, en créant un nouveau script par recopie de ta fonction qui ne fonctionne pas et de le lancer.
    Ainsi par encadrement successif tu arriveras à trouver l'endroit dans ton script qui ne fonctionne pas.

    As-tu bien vérifié que la déclarative d'accès à ta base de données est exactement pareil ? Je parle de ta variable $mysqli.
    Est-ce que c'est sur le même compte que tu fais l'accès ? Il se peut que que le problème vienne de là.
    Après, j'ai plus trop d'idées.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Question bête : dans ta fonction show_Cart, d'où provient la variable $mysqli ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Ha ha!
    Ta question n'est pas bête du tout!
    je n'ai pas tester mais vu comme ça, $mysqli n'est pas déclaré dans ma function...
    ça vient donc de là.

    Je teste et vous confirme.

    Désolé pour les délais de réponse, décalage horaire oblige

  9. #9
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Re,

    Bon alors, 1èrement je ne comprends rien à MSQLCA... et aucune idée de me serir de "log". Je développe depuis un éditeur de mon hébergeur (Justhost)
    2èment, j'ai déclarer ma fonction de la façon suivante et résultat KO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function showCart($mysqli){
    echo '<select>';
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    $stmt -> execute();
    $stmt -> store_result();
    $stmt -> bind_result($id_size,$size_name);
    while($stmt -> fetch()){
    echo '<option value = "'.$id_size.'" >'.$size_name.'</option>';
    }
    $stmt -> close();
    echo '</select>';
    Pourquoi ça ne marche pas !!!?

  10. #10
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    J'ai aussi testé ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function showCart($mysqli){
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    }
    Et là ça bug ! Un problème avec $mysqli dans l'appel de la fonction??? Pourtant pas de bug dans le reste de mes codes qui utilisent $mysqli hors appel de fonction...

    HELP!!!

  11. #11
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Youhooo !

    En fait, je déclare $mysqli en "global", et ça marche! Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function showCart(){
    global $mysqli;
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    ...
    ...
    $stmt -> close();
    Par contre, si vous pouviez me dire s'il y a des conséquences à utiliser cette méthode...

    Merci à tous et à bientôt.
    Courage les débutants, l’autodidaxie est la récolte de la patience.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il n'y a pas de concéquences.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut teddol.

    Comme on ne voie pas la globalité de ton script, il est difficile de répondre à tes question.
    Peut-on savoir comment as-tu déclaré ta variable $mysqli ?

    Est-ce que tu l'as mis dans un script et que tu l'appelles par un 'include' ou un 'require_once' en début de ton script ?

    Si 'Global' fonctionne, est-ce que ta fonction ShowCart() ne serait pas imbriqué dans une autre fonction où justement ta variable $mysqli ne serait pas accessible ?

    Sinon pour répondre à ta question, non il n'y a pas de conséquence, mais ce n'est pas propre.
    Une variable 'global' se déclare au plus haut niveau dans un script. C'est pour cela qu'elle est globale.
    Il y a sûrement quelque chose qui est mal déclaré dans ton script et c'est la fonction ShowCart() qui détecte cette anomalie.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  14. #14
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Hello,

    Très pertinent ce que tu dis Artemus24 .

    Voici le code dans le même fichier où est écrite ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    include_once 'db_connect.php';
    include_once 'psl-config.php';
     
    function showCart(){
    global $mysqli;
     
    $stmt = $mysqli->prepare("SELECT * FROM size ");
    $stmt -> execute();
    ....
    ....
    ....
    }
    Dans db_connect.php on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    include_once 'psl-config.php'; 
    $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
    if ($mysqli->connect_error) {
        header("Location: ./error.php?err=Unable to connect to MySQL");
        exit();
    }
    Dans psl_config.php on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    define("HOST", "********"); 	
    define("USER", "*******"); 
    define("PASSWORD", "*********"); 
    define("DATABASE", "*********");
    Côté propreté, j'avoue que je n'ai pas cherché... Si vous pouviez y passer un coup de balai avec quelques explications, je suis preneur

  15. #15
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut teddol.

    Je déclare l'ouverture de ma base de données, en 'mysqli', de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <?php
    $serveur = "mysql.monserveursql.com";
    $base = "mabase";
    $user = "monuser";
    $pass = "monpass";
    
    $mysqli = new mysqli($serveur, $user, $pass, $base);
    ?>
    J'ai mis en rouge le '$' qui manque chez toi.
    Personnellement, je ne déclare pas comme tu le fais, les variables par un "define".
    Pour moi, une variable commence par un '$'.

    Peux-tu fusionner dans le même script "psl-config.php" avec "db_connect.php" ?
    Peux-tu supprimer les "include_once(psl_config.php)" qui sont utilisés par ailleurs ?

    Tu remplaces les "define" par ce que j'ai mis ci-après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $HOST = "******";
    $USER = "******"; 
    $PASSWORD = "******";
    $DATABASE = "******";
     
    $mysqli = new mysqli($HOST, $USER, $PASSWORD, $DATABASE);
    if ($mysqli->connect_error) {
        die('Erreur de connexion ('.$mysqli->connect_errno.')'. $mysqli->connect_error);
        exit();
    }
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  16. #16
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    OK Artemus24,

    Mais qu'est-ce qui est mieux alors pour appeler mon fichier de connxion? include("fichierdeconnexion.php") ou require("fichierdeconnexion.php") ?

  17. #17
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Bon, j'ai fait les changements mais en réessayant ma fonction sans "global $mysqli", ça marche pas... Comment déclarer $mysqli?

  18. #18
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut teddol.

    J'utilise plutôt des 'Require_once' par habitude, mais rien ne t'empeche d'utiliser un 'include'.
    Pour moi, cela ne change rien car je déclare tous mes scripts (sous-programme) au début de mon script principale.
    Cela signifie que je ne fais pas d'imbrication d'include dans d'autres includes et ainsi de suite.
    Autrement dit, je n'ai qu'un seul niveau d'imbrication, donc 'Require_once' ou 'include' cela revient au-même dans mon cas.

    Ayant plus l'habitude du langage 'C' que du 'php', il faut savoir qu'une variable global '$a', en 'C' n'a pas besoin d'être qualifié de "global $a" dans une fonction, à l'inverse du langage 'php' où cela est plus que nécessaire.
    Donc, dans votre fonction, vous devez mettre "global $mysqli" pour accéder à votre variable '$mysqli', sinon elle sera interprété comme une variable locale.

    http://php.net/manual/fr/language.variables.scope.php

    Une autre solution qui ne me plait pas du tout, est de mettre votre 'require_once' directement dans votre fonction.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    J'ai mis en rouge le '$' qui manque chez toi.
    Personnellement, je ne déclare pas comme tu le fais, les variables par un "define".
    Pour moi, une variable commence par un '$'.
    Juste au passage, define crée une constante, pas une variable. Les constantes s'utilisent sans $.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

Discussions similaires

  1. [PDO] Affichage d'une requête préparée
    Par Tchupacabra dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/02/2010, 03h48
  2. [PDO] Requête préparée
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2007, 12h07
  3. [PDO] Requête préparée, retour d'erreur à masquer
    Par speedev dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/06/2007, 10h39
  4. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  5. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07

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