[RESOLU] Lien ID

Lien ID [RESOLU] - PHP - Programmation

Marsh Posté le 03-06-2013 à 16:32:02    

Bonjour,  
N'étant un spécialiste de PHP, je m'exerce à apprendre....et là je butte.  
J'ai une première page liste.php où s'affichent différents membres sous forme de tableau.  
Ces membres sont issus d'une base de données qui est affichée par une requête SQL.
Jusque là ça marche..  
 
J'ai fait un lien sur l'ID pour que l'on puisse en cliquent sur l'ID ouvrir la fiche.php du membre.  
En cliquant sur le ID la page fiche.php s'ouvre...
 
LIEN DE MA PAGE liste.php
<a href="fiche.php?id=<?php echo ($donnees['id']); ?></a></span></th>  
 
 
Donc, si j'ai bien compris j'ai bien récupérer le bon id...et ma page liste.php s'affichant "http://monsite.fr/fiche.php?id=11"
 
Dans ma page fiche.php le bon ( id ) s'affiche dans mon tableau mais pas les autres données...  
 
Donc là, je cale...car je vois pas d'où peut provenir l'erreur...le GET est appelé et s'affiche... pour le reste se sont des echo de la base de données.  
Encore merci de m'aider et surtout à comprendre...  
 
REQUETE  
 
$requete = 'SELECT * FROM base WHERE id=' $bdd->quote( $_GET['id']);  
$reponse = $bdd->query($requete);  
if ($reponse === false) {  
echo 'Erreur sur la requête ' . $requete;  
echo '<br />';  
var_dump($bdd->errorInfo());  
} else {  
while ($donnees = $reponse->fetch()) {  
}  
?>  
<table width="580" border="0">  
<th scope width="30" class="Style500"><?php echo ($_GET['id']); ?></span></th>  
<th scope width="80" class="Style500"><?php echo date ("d/m/Y",strtotime($donnees['date'])); ?></span></th>  
<th scope width="150" class="Style500"><?php echo htmlentities ($donnees['nom']); ?></span></th>  
<th scope width="150" class="Style500"><?php echo htmlentities ($donnees['prenom']); ?></span></th>  
<th scope width="90" class="Style500"><?php echo htmlentities ($donnees['section']); ?></span></th>  
<th scope width="80" class="Style500"><?php echo date ("d/m/Y",strtotime($donnees['daten'])); ?></span></th>  
</tr>  
</table>  
<?php  
}  
$reponse->closeCursor(); // Termine le traitement de la requête  
?>
 
Je suppose qu'il y a un problème dans ma requête de ma page fiche.php, mais je n'arrive pas trouver...  :pt1cable:  
Merci pour votre aide.


Message édité par hogz le 26-06-2013 à 20:14:17
Reply

Marsh Posté le 03-06-2013 à 16:32:02   

Reply

Marsh Posté le 04-06-2013 à 13:47:39    

Code :
  1. $requete = 'SELECT * FROM base WHERE id=' $bdd->quote( $_GET['id']);


 
il ne manquerai pas un "." pour faire la concaténation entre le string 'Select...' et $bdd->quote ?
 
Tu peux aussi tester si $reponse contient au moins 1 ligne, et dans le cas contraire afficher que l'id est incorrect


Message édité par x1fr le 04-06-2013 à 13:48:43

---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 04-06-2013 à 17:20:49    

De plus si  "$bdd->quote( $_GET['id'])"  met entre quote ton ID qui doit etre un numérique c'est pas bon.
 


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 04-06-2013 à 19:57:01    

La fonction quote de PDO accepte un second paramètre permettant de définir le type de données. Cependant, mettre entre quote un entier n'est pas très problématique, MySQL va caster la valeur pour qu'elle puisse être interprétée correctement, je n'ai jamais eu de souci avec cette méthode.


Message édité par xaeon le 04-06-2013 à 19:57:12
Reply

Marsh Posté le 05-06-2013 à 20:45:46    

J'ai changé mais toujours même problème affichage du tableau sans le contenu sauf l'ID car il est amené par le GET
$requete = 'SELECT * FROM base WHERE id=' .$bdd->quote( $_GET['id']);
 
J'ai rajouté un point avant $bdd

Reply

Marsh Posté le 06-06-2013 à 08:47:35    

Dans les lignes de ton tableau, tu as des balises </span>, mais aucune balise ouvrante.
 
Ton tableau est également mal construit!
 
Le problème ne vient pas de là, mais ça ne fera pas de mal de corriger :p
 
Le problème vient de la ligne après while (je n'avais pas vu la première fois) :

Code :
  1. while ($donnees = $reponse->fetch()) {
  2. }


 
Il faut supprimer le  } car il rend le fetch inutile!


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 06-06-2013 à 17:28:21    

Merci pour ta réponse, mais si j'enlève
}
une erreur
Parse error: syntax error, unexpected $end in /htdocs/***/***/fiche.php on line 363
Ligne 363 est la dernière de mes lignes après
</body>
</html>

Reply

Marsh Posté le 06-06-2013 à 18:24:47    

Le

Code :
  1. while ($donnees = $reponse->fetch()) {
  2. }


"Consomme" l'ensemble de la requête. Donc php "sort" du while avec $donnees==null.
 
Sinon  

Citation :


Il faut supprimer le  } car il rend le fetch inutile!


est faux, au mieux il faut le déplacer dans le bloc php de fin (celui qui fait la clôture du curseur), ce qui explique le message d'erreur d'ailleurs.
Mais la boucle, ça n'est pas trop dans l'esprit du code qui doit n'avoir qu'un résultat pas N.
De plus il faut absoluement prendre l'habitude des prepare/bind/execute : ça évite le sql injection.  
 
Il faut mieux donc :
 

Code :
  1. $requete = $bdd->prepare('SELECT * FROM base WHERE id=?');
  2. $requete->bindValue(1,$_GET['id'],PDO::PARAM_INT); 
  3. $reponse = $requete->execute(); 
  4. if ($reponse === false) { 
  5.      echo 'Erreur sur la requête ' . $requete; 
  6.      echo '<br />'; 
  7.      var_dump($bdd->errorInfo()); 
  8. }
  9. else{
  10.     if($donnees = $reponse->fetch()) {  //Récupère la première ligne  
  11. ?> 
  12. <table width="580" border="0"> 
  13. <th scope width="30" class="Style500"><?php echo ($_GET['id']); ?></span></th> 
  14. <th scope width="80" class="Style500"><?php echo date ("d/m/Y",strtotime($donnees['date'])); ?></span></th> 
  15. <th scope width="150" class="Style500"><?php echo htmlentities ($donnees['nom']); ?></span></th> 
  16. <th scope width="150" class="Style500"><?php echo htmlentities ($donnees['prenom']); ?></span></th> 
  17. <th scope width="90" class="Style500"><?php echo htmlentities ($donnees['section']); ?></span></th> 
  18. <th scope width="80" class="Style500"><?php echo date ("d/m/Y",strtotime($donnees['daten'])); ?></span></th> 
  19. </tr> 
  20. </table> 
  21. <?php
  22.     }
  23.     else{
  24.          echo $_GET['id'] . ' not found!!!';
  25.     }
  26.     $reponse->closeCursor(); // Termine le traitement de la requête   
  27. }
  28. ?>


Message édité par dreameddeath le 06-06-2013 à 18:25:58
Reply

Marsh Posté le 06-06-2013 à 18:59:00    

Merci pour ton coup de main...
 
Après vérification----Affichage
Fatal error: Call to a member function fetch() on a non-object in /htdocs/****/***/fiche.php on line 337
 
Donc------ligne 337
}
 else{
     if($donnees = $reponse->fetch()) {  //Recupere la première ligne  
 ?>


Message édité par hogz le 07-06-2013 à 08:26:20
Reply

Marsh Posté le 07-06-2013 à 11:05:24    


$requete = $bdd->prepare('SELECT * FROM base WHERE id=?');
$requete->bindValue(1,$_GET['id'],PDO::PARAM_INT);  
$reponse = $requete->execute();  
 
$htmlreponse=$_GET['id'] . ' not found!!!';
foreach ($reponse as $donnees)
{
$htmlreponse='<table width="580" border="0"> ';
$htmlreponse=$htmlreponse.'<th scope width="30" class="Style500">'.$_GET['id']).'</span></th> ';
$htmlreponse=$htmlreponse.'<th scope width="80" class="Style500">'. date ("d/m/Y",strtotime($donnees['date'])).'</span></th> ';
$htmlreponse=$htmlreponse.'<th scope width="150" class="Style500">'. htmlentities ($donnees['nom']).'</span></th> ';
$htmlreponse=$htmlreponse.'<th scope width="150" class="Style500">'. htmlentities ($donnees['prenom']).'</span></th> ';
$htmlreponse=$htmlreponse.'<th scope width="90" class="Style500">'. htmlentities ($donnees['section']).'</span></th> ';
$htmlreponse=$htmlreponse.'<th scope width="80" class="Style500">'. date ("d/m/Y",strtotime($donnees['daten'])).'</span></th> ';
$htmlreponse=$htmlreponse.'</tr> ';
$htmlreponse=$htmlreponse.'</table> ';
}
}
echo $htmlreponse;
 
 
 
bon le mieux c'est qd meme de séparer ton code de l'affichage (smarty ou twig sont tes amis)


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 07-06-2013 à 11:05:24   

Reply

Marsh Posté le 07-06-2013 à 14:11:16    

Merci pour ton aide...
 
ça modifie ma logique, mais bon je suis là pour appendre... :pt1cable:  
Mais une erreur ligne Parse error: syntax error, unexpected ')' in /htdocs/***/***/fiche.php on line 337
Toujours la même chose.
J'écrit avec TEXTMATE ce qui me permet de voir les petites erreurs et il
n'y a pas de problème visuel sur ton code...
Ligne 337
$htmlreponse=$htmlreponse.'<th scope width="80" class="Style500">'. date ("d/m/Y",strtotime ($donnees['date']).'</span></th> ';
Je vois pas le problème de syntax....


Message édité par hogz le 07-06-2013 à 14:14:51
Reply

Marsh Posté le 07-06-2013 à 15:05:15    

'.$_GET['id']).'<
 
ligne du dessus


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 07-06-2013 à 16:57:39    

Ok vu....  :)  
 
Modifié==
 
// Si tout va bien, on peut continuer
$requete = $bdd->prepare('SELECT * FROM base WHERE id=?');
$requete->bindValue(1,$_GET['id'],PDO::PARAM_INT);
$reponse = $requete->execute();
 
$htmlreponse='.$_GET['id'].'<not found!!!';
foreach ($reponse as $donnees)
{  
 
Mais il m'indique une erreur de T_STRING
Parse error: syntax error, unexpected T_STRING in /htdocs/***/***/fiche.php
 
J'ai controlé ';' et ',' mais bon...pas succès

Reply

Marsh Posté le 10-06-2013 à 14:00:25    

htmlreponse='.$_GET['id']
 
 
htmlreponse=$_GET['id']


Message édité par KLeMiX le 10-06-2013 à 14:00:35

---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 10-06-2013 à 18:27:27    

Oupps pardon !  
dans mon code :

Code :
  1. if($donnees = $reponse->fetch()) {


 
doit être remplacé par
 

Code :
  1. if($donnees = $requete->fetch()) {


 
Et j'abonde totalement  

Citation :

bon le mieux c'est qd meme de séparer ton code de l'affichage (smarty ou twig sont tes amis)


Message édité par dreameddeath le 10-06-2013 à 18:28:43
Reply

Marsh Posté le 14-06-2013 à 09:44:20    

Merci pour vos réponses...
Je me suis absenté quelques jours, mais je reprends le problème...J'ai testé le changement de code de dreameddeath.
Voici la réponse:
 
not found!!!
Fatal error: Call to a member function closeCursor() on a non-object in /htdocs/public/***/fiche.php on line 353
 
Donc:
    }
        else{
             echo $_GET['id'] . ' not found!!!';
        }
        $reponse->closeCursor(); // Termine le traitement de la requête    
    }
    ?>

Reply

Marsh Posté le 14-06-2013 à 09:58:26    

Bon ok, mon code a encore un soucis, mais c'est le même problème que précédemment $reponse doit être remplacé par $requete...
 
Sinon, il va falloir apprendre à analyser ce genre d'erreur : vu que PHP est un langage non typé, c'est à l'exécution que les problèmes se posent et il n'y a pas de vérification à la compilation.
 
Dans ce cas 3 possibilités :
- nom de la methode fausse (inexistante ou mal orthographiée)
- l'objet n'est pas du type espéré (ici un boolean au lieu d'un PDOStatement) et ce de manière structurelle (au sens jamais)
- une exception mal gérée revoie un "null" dans la variable
 
Les cas 2 et 3 sont les plus durs à analyser car ça peut dépendre de :
- le contexte (bdd indispo, ...)
- du chemin pour parvenir au bout de code
 
Bon là c'est facile car dans tous les cas le code est faux :)
 
Mais faut pas poster sans chercher un minimum à comprendre l'erreur et de tenter trouver sa cause : c'est ça qui fait progresser...

Reply

Marsh Posté le 14-06-2013 à 11:05:10    

Effectivement, je vais vais revoir tout cela.
Merci pour l'aide.

Reply

Marsh Posté le 14-06-2013 à 11:40:32    

Après avoir refait ma requête j'ai introduit <?php $id=$_GET['id'];?>
au dessus de la connexion au serveur et ça marche....


Message édité par hogz le 22-06-2013 à 17:10:40
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed