Page 1 sur 1
Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 11:52
par Wazaki
Bonjour, je tente de récupérer les données provenant d'un SELECT mais je fais face à 3 erreurs :
Warning: array_keys() expects parameter 1 to be array, boolean given in F:\EasyPHP-5.3.9\www\lapim\funcBDD.php on line 94
Warning: Invalid argument supplied for foreach() in F:\EasyPHP-5.3.9\www\lapim\funcBDD.php on line 98
Warning: Invalid argument supplied for foreach() in F:\EasyPHP-5.3.9\www\lapim\funcBDD.php on line 104
j'ai au départ pensé que cela venait de ma requête, mais lorsque je l'a fais directement en SQL, elle fonctionne parfaitement o.o
Voici mon code :
funcBDD.php :
function tabData($requete, $bd){
$tabData= Array();
$i=1;
$p=0;
$bdd = connectBD($bd);
$reponse = $bdd->query($requete);
$reponse -> setFetchMode(PDO::FETCH_ASSOC);
$ligne=$reponse->fetch();
$tableau=array_keys($ligne); //LIGNE 94
///Récupération sous forme de tableau d'une requête
//Récupération de la première ligne du tableau contenant les titres des colonnes
foreach($tableau as $value) { //LIGNE 98
$tabData[$p]=$value." : ";
$p=$p+2;
}
//Récupération des autres lignes de données
do{
foreach ($ligne as $val){ //LIGNE 104
$tabData[$i]=$val;
$i=$i+2;
}
}while($ligne=$reponse->fetch());
deconnectBD($bdd);
return $tabData;
}
inscrireDonneesFormulaire.php
include("funcBDD.php");
$bd='lapim';
$requete="SELECT Recommandations, PointAlerte, EcheancePrevue from lapim.dataPNMR WHERE idRisque =\" ".$_POST['titreRisque']." \" ";
$tabDataPNMR=tabData($requete, $bd);
Ici $_POST['titreRisque'] renvoie la valeur suivante : 14faa3211ab7402112.
Si quelqu'un a une idée, je suis preneur :p car ça commence à faire un bout de temps que je bloque sans pouvoir trouver d'où vient le problème
Merci par avance
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 13:40
par Mazarini
La première erreur signifie que ligne n'est pas un array.
C'est donc que $ligne=$reponse->fetch(); a retourné false.
Il faut ajouter un echo pour visualiser ta requete et un var_dump($ligne) pour voir ce que contient la première lecture. Il faudrait prévoir le cas ou la requete ne renvoie aucune ligne.
Pour ton erreur :$requete="SELECT Recommandations, PointAlerte, EcheancePrevue from lapim.dataPNMR WHERE idRisque =\" ".$_POST['titreRisque']." \" ";
il faudrai supprimer les blancs dans la chaine de caractère avant et après les \" :
$requete="SELECT Recommandations, PointAlerte, EcheancePrevue from lapim.dataPNMR WHERE idRisque =\"".$_POST['titreRisque']."\" ";
En faite tu recherches " X " et non pas "X" dans ta requete
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 14:40
par Invité
Tout d'abord, merci de ta réponse.
Je test en même temps que je répond à ton message :
- Visualisation de la requête :
SELECT Recommandations, PointAlerte, EcheancePrevue from lapim.dataPNMR WHERE idRisque =" 14faa5a79e671e1112 "
Donc oui comme tu l'a effectivement remarqué je cherche " X " dans ma BDD, il y a une raison à cela.. les entrées sur la BDD sont en effet de ce type " X ", si le problème provient d'ici je vais le changer immédiatement.
-le var_dump renvoie un boolean false
*suprime les lignes de sa BDD et fais en sorte qu'elles soit rentré en "X" *
*rentre une ligne*
*test le select du type "X" *
*test....*
Bon ça ne marche toujours pas, les même erreurs...
résumons...
1.le var_dump a retourné false donc il n'arrive pas à lire le tableau.. ce qui peut être logique étant donné qu'il dit que ce n'en est pas un...
2. les autres erreurs ne proviennent du fait que la requête soit appelées par "X" ou " X " étant donén que le changement n'a rien fait (je pense d'ailleurs que si la première est résolu les autres suivront...)
ma question est donc la suivante : "Comment faire pour que $tableau soit bien reconnu comme un tableau? "
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 15:44
par wazaki
Désolé du double-post..
Enfaite il y a toujours un problème concernant l'affichage en " X " :
même avec cette écriture : =\"".$_POST['titreRisque']."\" ";
l'affichage de titre risque se fait toujours avec des espaces : =" 24faa7206ed0971112 "
c'est à ni rien comprendre
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 15:52
par Mazarini
En fait, j'avais trouvé bizarre la condition : WHERE idRisque =" 14faa5a79e671e1112 "
C'est pour ca que je t'avais proposé de mettre WHERE idRisque ="14faa5a79e671e1112"
Mais si la clé est effectivement " 14faa5a79e671e1112 ", alors ma remarque n'est pas valable.
A priori, si la première lecture avec fetch ne fait pas d'erreur, c'est que la requete est correct. Mais contrairement à ce que tu dis elle ne retourne aucune ligne.
Est tu sur de ne pas avoir mis des blancs en début et/ou en fin lors de la saisie dans ton formulaire ?
Est tu sur que la colonne est assez grande et que le dernier blanc n'est pas tronqué (20 caractères) ?
As tu bien fait un test avec phpmyadmin en copiant la requete affichée par le script ?
Ajoute echo strlen($_POST['titreRisque']); pour vérifier que c'est bien 18.
Eventuellement remplace les " par des ' dans la requete
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 15:58
par wazaki
aïe! triple-post "me tappez pas, me tappez pas!"
le problème venait donc du formulaire d'avant provoquant cette espace.
J'arrive enfin à récupérer des données du type $tabDataPNMR[0,1,2,3,4,5... et à partir du 6 ben il me dit 'fuck you' Undefined offset 6...]
Je continue à chercher..
ps : aux modérateurs et aux haïsseurs des double-triple posteur : la prochaine fois je me crée un compte pour pouvoir éditer mes messages, promis juré!
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 16:09
par wazaki
Me voila inscrit (encore toutes mes escuses pour les posts à répétitions...)
En ce qui concerne ta remarque au niveau des "" tu as bien fait de le remarquer : même si ça ne changeait rien c'était affreux et pas du tout professionel.
Cependant la question ne se pose plus car maintenant la BDD a des entrées du type "X"
Donc oui une erreur provenait bel et bien de lors de la saisie du formulaire
Pour ce qui est de la place il y en a étant donné que c'est codé sur un VARCHAR(25) et le " echo strlen($_POST['titreRisque']); " m'a bien renvoyé 18
Donc voila les erreurs ont maintenant disparus pour en faire apparaître de nouvelles, je sens que je vais aimer le métier de développeur hahaha
Si tu as une solution ou bien une idée pour les valeurs ne voulant pas s'inscire dans le tableau... j'achète!
EDIT : oui j'ai copié la requête renvoyé par le echo $requete; dans phpmyadmin et ça a fonctionné du tonnerre.
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 16:21
par Mazarini
A ta décharge, tu cherches sans attendre que l'on te fournisse une solution toute faite.
Je ne vois pas le code ou ca plante.
A priori tu as 3 colonnes, donc ca remplit 0,2,4 (avec les noms de colonne suivi de : )
Puis tu mets les valeurs dans 1,3,5 et 7,9,11 ... suivant le nombre d'enregistrements
un var_dump($tabDataPNMR); te permettra de vérifier le contenu
Pour info, il est possible de faire :
foreach($ligne as $colonne=>$valeur) {...}
Ca permet d'avoir le nom de la colonne et sa valeur. Mais j'ai du mal à voir ce que tu veux faire meme si je comprends à peu près le script.
Re: Récupérer données d'un SELECT échoue
Posté : 09 mai 2012, 16:30
par wazaki
Non, je ne cherche pas une solution toute faite. A vrai dire ça fait un mois que je suis sur une appli PHP, mes délais sont courts et dans ma précipitation je loupe des détails provoquant des erreurs que je devrait normalement pouvoir résoudre seul. J'aime développer en PHP mais j'aime aussi prendre mon temps...
La preuve c'est que cette histoire de tableau est en fin de compte très con :
-espaces en trop dans la saisie du formulaire ( ce n'est même pas une erreur de php mais html)
-et oublie de la colonne risque dans le select afin de pouvoir aller jusqu'à tabDataPNMR[7]
Merci de ta patience et de ton aide.
Sujet Résolu.
Re: Récupérer données d'un SELECT échoue
Posté : 10 mai 2012, 09:02
par Mazarini
Essayes de mettre une quote et une double quote dans la zone de saisie...
(cf fonction mysql_real_escape_string() ou équivalente)