Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 527

Enregistré le: 30 Juil 2014

Message le Ven Mar 24, 2017 17:41

Bonjour,

Je poursuis mes pérégrinations en PDO, en guise de remise à niveau par trop tardive, avec votre aide.
Ici, j'essaie de passer un tableau en paramètre d'une requête SELECT.

Le code s'exécute donc classiquement en deux étapes :

1) Premièrement, on filtre le tableau à réception de la variable $_POST[]
Code: Tout sélectionner
if(!empty($_POST['id_tuple']))
{
$id_tuple = array_map(function ($val)
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $_POST['id_tuple']);
;}


2) Puis on utilise ce tableau comme paramètre de la requête SELECT.
Code: Tout sélectionner
$stmt = $dbh->prepare("SELECT nom, prenom FROM auteur WHERE id = ?");
if ($stmt->execute(array($id_tuple))) {
  while ($recherche= $stmt->fetch()) {
 $nom=$recherche->nom;
$prenom=$recherche->prenom;
echo' '.$nom.' '.$prenom.' <br>'
 ; }   

A l'affichage sur la page, le résultat produit par mon code ressemble à l'antarctique. C'est beau, très blanc, mais un peu froid.

Nonobstant l'exotisme certain de ma requête, je me dis que la première partie du code présente le problème de ne pas récupérer un tableau à partir de la variable $_POST[] réceptionnée et filtrée. Me trompe-je ?

Merci d'avance pour vos réponses !
Haut
10 Réponses
Messages: 140

Enregistré le: 17 Oct 2009

Message le Sam Mar 25, 2017 11:04

Je ne connais pas PDO mais tu devrais faire une requête du type "WHERE id IN ()" plutôt que "WHERE id = "
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Sam Mar 25, 2017 15:28

Salut Niap,

Bah j'essaie différents trucs avec ta soluce qui paraît la bonne au vue de mes quelques recherches sur le net. Mais ça n'affiche rien de plus.
Exemple :

Code: Tout sélectionner
$id_auteur=$_POST['id_auteur'];
 $sql = "
SELECT
nom,
prenom
FROM
auteur
WHERE id IN ('$id_auteur')
";
$stmt = $dbh->prepare ($sql);
$stmt->execute();
while($lettre= $stmt->fetch(PDO::FETCH_OBJ))
{
 $nom=$lettre->nom;
$prenom=$lettre->prenom;
echo' '.$nom.' '.$prenom.' <br>'
 ; }   


L'erreur ne parait pas se trouver dans la première partie du code (cf. premier message), puisque si j'enlève ces quelques lignes, ça ne change rien (ni affichage, ni message d'erreur).

Faire un select à partir d'un tableau ne doit tout de même pas être sorcier. Il s'agit d'afficher tous les auteurs d'un même livre, je ne vais pas faire x select unique de suite, c'est ridicule.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Sam Mar 25, 2017 15:32

Je vais essayer avec un foreach et un select simple.
J'reviens vous dire le résult'.

Suspense
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Sam Mar 25, 2017 15:38

Eh bah ça fonctionne, hein !

Mais bougez pas, je reviens bientôt avec une nouvelle question improbable. De quoi vous causer des nuits blanches.
Haut
Messages: 12288

Enregistré le: 23 Nov 2005

Message le Sam Mar 25, 2017 15:39

A l'affichage sur la page, le résultat produit par mon code ressemble à l'antarctique. C'est beau, très blanc, mais un peu froid.


Faudrait peut-être activer l'affichage des messages d'erreurs aussi. http://php.net/manual/fr/function.error-reporting.php
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Sam Mar 25, 2017 15:51

J'ai activé cette fonction dès le début de ce nouveau projet. Mais je te remercie pour le lien, UsagiYojimbo.

Tiens, puisque tu es là, tu pourras peut-être nous expliquer ce petit point de détail qui m'intrigue :
Ca c'est le bout de code du premier message. Je récupère un tableau et je le filtre. Rien d'extraordinaire.
Code: Tout sélectionner
if(!empty($_POST['id']))
{
$id = array_map(function ($val)
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $_POST['id]);
;}


Ce que je ne pige, c'est que pour envoyer un tableau, j'ai dû écrire name="id[]" dans les attributs du champ select text.

Mais comment se fait-il qu'à réception de ce tableau par $_POST[], je puisse le récupérer dans une variable $id et non pas $id[] ? Comment PHP sait-il qu'il a toujours affaire à un tableau ?
Haut
Messages: 140

Enregistré le: 17 Oct 2009

Message le Sam Mar 25, 2017 18:10

Alorsladaccord a écrit:
Code: Tout sélectionner
 $sql = "
SELECT
nom,
prenom
FROM
auteur
WHERE id IN ('$id_auteur')
";

Si id_auteur est un array ça ne peut pas fonctionner, il faut utiliser implode().
Code: Tout sélectionner
 $sql = "
SELECT
nom,
prenom
FROM
auteur
WHERE id IN ('".implode(',', $id_auteur)."')
";


Alorsladaccord a écrit:Faire un select à partir d'un tableau ne doit tout de même pas être sorcier. Il s'agit d'afficher tous les auteurs d'un même livre, je ne vais pas faire x select unique de suite, c'est ridicule.

Oui c'est ridicule et niveau optimisation on repassera :mrgreen:
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 27, 2017 17:09

Ouaip, j'ai tenté avec un implode, mais j'ai eu une erreur de code et finalement.

Et finalement si, je fais x selects de suite, à l'intérieur d'un foreach qui lit le tableau et ma foi, le résultat est bon.
Ca pose un problème selon vous ?

A part ça, si quelqu'un peut répondre à la question posée juste avant la dernière réponse de niap,je suis preneur.
Pourquoi donc un tableau de variable expédié via un input name="variable[]" se récupère-t'elle dans une variable $variable et non $variable[] ?
Haut
Messages: 8555

Enregistré le: 14 Mai 2003

Message le Lun Mar 27, 2017 21:37

http://stackoverflow.com/questions/15854017/what-rfc-defines-arrays-tr ... -over-http
Dans les autres langages de programmation c'est pareil, donc surement plus lié à HTTP qu'au langage.
Tu peux même faire: name="data[foo][bar][baz]"
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 28, 2017 13:39

C'est étrange, mais bon, la programmation informatique a ses raisons que la raison ignore...
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.