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 :

non-exécution d'un fetch [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut non-exécution d'un fetch
    Bonsoir,

    dans le code ci-dessous, on ne passe pas dans le foreach qui affiche la valeur retournée par la requête SQL (quelconque). Pourquoi ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if (!empty($sql)) {
    	try{
    		$bdd = new MyPdo();
    	}catch(PDOException $e){
    		echo "argggggggggggggg".$e->getMessage();
    	}
    	echo "<table width='100%' border='1' style='text-align:center'><tr>";
    	$first = true;
    	var_dump($bdd); //on passe bien là
    	foreach ($bdd->query($sql, PDO::FETCH_OBJ) as $ligne) {
    		var_dump($ligne); //on ne passe pas là
    		if ($first) {
    			echo "<tr>";
    			foreach ($ligne as $key => $value) {
    				echo '<th>' . $key . '</th>';
    			}
    			echo "</tr>";
    			$first = FALSE;
    		}
    ...

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Bonjour,

    Et pourquoi tu ne mets pas la requête à l'intérieur du try{} ? C'est bien pour s'en servir qu'on a déclaré le mode exception dans l'initialisation de la connexion. Cela te donnerais les messages d'erreur appropriés.

    Il me semble aussi qu'on a déjà déclaré également le mode PDO::FETCH_OBJ dans l'initialisation de la connexion, donc encore une fois (et je te l'ai déjà dit) IL N'Y A PAS BESOIN DE LE REDECLARER PAR LA SUITE.

    Pour le reste je comprends pas trop l'histoire du deuxième foreach.

  3. #3
    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
    Par défaut
    Pourquoi ?
    Parce que ta requête ne retourne rien, soit elle produit une erreur, soit elle ne produit aucun résultat.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,
    tu n'as pas l'impression d'écrire le code en dépit du bon sens ?
    C'est quand même toujours plus ou moins écrit n'importe comment, non ?
    Et tu refais toujours plus ou moins les mêmes erreurs de débutant...

    On est encore quelques uns à avoir encore la bonne volonté de t'aider.
    Tu vas finir par épuiser tout notre quota de patience...

    Même ABCIWEB est en train de craquer...

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Pas la peine de t'énerver ABCIWEB ; en fait, ce n'est pas la même application : ici, c'est un phpMyAdmin-like (bon, pas vraiment), en gros un script qui me permet d'exécuter des requêtes SQL et d'en afficher le retour s'il y en a. (J'avais fait ça à une époque car chez Free, je trouvais phpMyadmin hyper lent donc je préférais m'en passer et en gros, je n'y ai recours que pour faire des imports/exports, et en ayant pris l'habitude, je m'en sers chez tous les hébergeurs).
    Mais du coup, j'ai aligné le connect.php sur l'autre, et du coup, j'ai enlevé le PDO::FETCH_OBJ ; d'autre part, j'ai aussi intégré la requête dans le try.

    Sabotage, je peux tester cela avec n'importe quelle requête et même celles qui doivent retourner quelque chose ne retourne rien ici.

    En fait, même avec echo "<br/>argggggggggggggg ".$e->getMessage(); dans le catch, ça affiche :
    argggggggggggggg SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
    show tables
    ' at line 1
    si je teste avec show tables.

    Bon, Jérôme, ce code est assez ancien, même si je l'ai converti de _mySQL à PDO il y a peut-être 2 ans, mais comme jusque là, il marchait, je ne le modifiais pas...et les erreurs de débutant ici, je les vois pas...

  6. #6
    Invité
    Invité(e)
    Par défaut
    La première "erreur de débutant" est que tu ne sais pas encore effectuer un débogage de base.

    Ensuite, c'est de ne pas appliquer les connaissances que tu as apprises, ou les conseils qui t'ont été donnés.

    Que le code soit ancien ou pas, tu es censé utiliser tes connaissances nouvelles.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    En mettant ta requête dans le try tu as maintenant le code d'erreur approprié. Reste à l'interpréter. Tu ne sais pas encore lire les messages d'erreur de php ? C'est pourtant de l'anglais très rudimentaire...

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    OK, mais pas très explicite :
    ERREUR PDO dans ... L.72 :SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
    show tables
    ' at line 1
    (alors que la requête SQL est show tables)

    et comme entre temps, j'ai mis des requêtes préparées et un vrai fetch (ce qui n'était le cas avant), voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    if (!empty($sql)) {
    	try{
    		$bdd = new MyPdo();			
    		echo "<table width='100%' border='1' style='text-align:center'><tr>";
    		$first = true;
    		$prep = $bdd->prepare($sql);
    		$prep->execute();
    		foreach ($prep->fetch() as $ligne) {	
    			echo "ligne=";var_dump($ligne);echo "<br/>";
    			if ($first) {
    				echo "<tr>";
    				foreach ($ligne as $key => $value) {
    					echo '<th>' . $key . '</th>';
    				}
    				echo "</tr>";
    				$first = FALSE;
    			}
    			echo "<tr>";
    			foreach ($ligne as $value) {
    				echo '<td>' . $value . '&nbsp;</td>';
    			}
    			echo "</tr>";
    		}
    		echo "</table >";
    		//efface la variable (pour se déconnecter)
    		$bdd = NULL;
    	}
    	catch(PDOException $e) {
        echo 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    	}
    }
    et le fetch n'est pas exécuté vu que le var_dump juste après n'est pas affiché...

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Le message d'erreur indique une erreur de syntaxe dans ta requête aux alentours de "show tables". Et comme tu nous montre tout sauf la requête, que veux tu qu'on te réponde ?

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Mais si je la donne, vu que c'est justement show tables...

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Faut croire que t'as quand même réussi à faire une erreur dans une requête aussi simple...

  12. #12
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    C'est ce que ça laisse supposer sauf que chez Free où j'ai laissé les fonctions _mySQL, ça fonctionne (alors que chez Evxonline, la connexion échoue ; je donc dois passer en pdo)

  13. #13
    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
    Par défaut
    Tu n'aurais pas fait un mélange entre le foreach sur query() et un fetch() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach ($bdd->query($sql) as $ligne) {	
    			echo "ligne=";var_dump($ligne);echo "<br/>";
    Ton prepare() ne sert à rien puisque tu n'as pas de paramètres.

    Pour ton problème de SHOW TABLES, est-ce que tu as affiché ta requête complète pour voir ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Comme le prepare ne sert à rien et pour éviter toute confusion, j'ai fait ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = $bdd->query($sql);
    while ($ligne=$req->fetch()) {
    ...

    Par contre, juste avant, je fais un echo : echo "sql=".$sql."<br/>";et apparemment, un retour à la ligne est rajouté :
    sql=
    show tables
    ...et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <textarea name="requete" rows="4" cols="55"><?php echo $sql; ?></textarea>
    ...
    <?php
    if (isset($_POST['requete']))
    	$sql = stripslashes($_POST['requete']);
    Le fautif semble donc ce retour à la ligne, mais d'où vient-il et comment le supprimer ?

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Quand tu auras résolu ton pb de connexion/requête il te resteras à corriger ton code car en l'état tu ne pourras lire qu'une ligne...

    Faudrait que ça ressemble à un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    //...
    $prep = $connect->prepare($sql);
    $prep->execute();
     
    $html = null;
    $first = true;
     
    while($ligne = $prep->fetch())
    { 
    	if ($first == true)
    	{
    		// S'il y a au moins une ligne on fait une table
    		$html .= '<table>';
    		$html .= "\n".'<tr>';
    		foreach ($ligne as $key => $value) $html .= '<th>'.$key.'</th>';
    		$html .= '</tr>';
    		$first = false;
    	}
     
    	$html .= "\n".'<tr>';
    	foreach ($ligne as $value) $html .= '<td>'.$value.'</td>';
    	$html .= '</tr>';
    }
    // S'il y a eu au moins une ligne on ferme la table
    if ($first == false) $html .= "\n".'</table>';
     
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>titre</title>
    </head>
     
    <body>
    <?= $html?>
    </body>
    </html>
    EDIT : J'ai utilisé prepare pour reprendre ton code. Même si utiliser des requêtes préparées ne sert à rien dans certains cas, je te conseille néanmoins de toujours utiliser des requêtes préparées afin de bien maîtriser au moins une façon de faire (la plus généraliste), le temps de ne plus être débutant.

  16. #16
    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
    Par défaut
    Je ne pense pas que ce soit un retour à la ligne seul car cela ne gênerait pas la requête.

    Peut être des choses dans des balises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "sql=".htmlentities($sql)."<br/>";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    Bien vu Sabotage et merci à ABCIWEB dont j'ai pris en compte le code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $bdd = new MyPdo();	
    $prep = $bdd->prepare($sql);
    $prep->execute();				
     
    $html = null;
    $first = true;
     
    while($ligne = $prep->fetch())
    { 
          if ($first == true)
    	{
                   // S'il y a au moins une ligne on fait une table
                   $html .= '<table>';
                   $html .= "\n".'<tr>';
                   foreach ($ligne as $key => $value) $html .= '<th>'.$key.'</th>';
                   $html .= '</tr>';
                   $first = false;
    	}
     
    $html .= "\n".'<tr>';
    foreach ($ligne as $value) $html .= '<td>'.$value.'</td>';
    $html .= '</tr>';
    }
    // S'il y a eu au moins une ligne on ferme la table
    if ($first == false) $html .= "\n".'</table>';
     
    //efface la variable (pour se déconnecter)
    $bdd = NULL;
    echo $html;
    et si je fais ce que m'indique Sabotage, ça donne :
    sql=<p>show tables</p>
    donc c'est tinymce qui rajoute ces balises (avant, ça tournait sans cet éditeur) ; est-ce que pour s'en débarrasser, je ne peux faire qu'un traitement de chaîne de caractères ?

  18. #18
    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
    Par défaut
    Pourquoi utiliser tinymce pour faire saisir une requête ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Eventuellement tu pourrais essayer strip_tags : $sql = strip_tags($sql);

    Mais pas garanti que cela fonctionne à tous les coups. Le plus simple serait de suivre le conseil de sabotage et ne pas utiliser tinymce dans ce cas (évidemment puisque tinymce est prévu pour formater du texte...).

    D'un autre coté, permettre d'exécuter des requêtes depuis un formulaire c'est vraiment dangereux. T'as intérêt que cette page soit blindée et accessible uniquement à des personnes de confiance ET compétentes sinon ta base peut être complétement détruite.

    Enfin bon au final tu vois bien que le message d'erreur de php était bon

  20. #20
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 492
    Billets dans le blog
    1
    Par défaut
    J'ai testé strip_tags et ça marche
    Sinon c'est vrai que tinymce sert pas à grand chose, mais à moi, si car dans mes requêtes, y en a une que j'ai voulu utiliser et qui est un select et j'affiche des phrases générées avec tinymce et donc pour afficher correctement les smileys, j'avais besoin de tinymce...
    Et sinon, c'est sûr que mon appli basée sur un formulaire est dangereuse (DROP DATABASE), mais y a que moi qui en connais les URLs (une par hébergeur).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. instruction non exécutée
    Par illegalsene dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/05/2006, 14h42
  2. Non exécution d'une méthode repaint()
    Par Flophx dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/05/2006, 18h04
  3. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  4. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

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