Page 1 sur 1

PDO requête préparée avec plusieurs clauses WHERE

Posté : 12 juil. 2012, 11:37
par angelus@diver
Bonjour,
J'ai deux requêtes pour afficher des données provenant de la même table mais où la clause WHERE est différente. Est-il possible d'utiliser la même requête ?
(J'ai lu le sujet similaire en cours mais je n'arrive pas à l'adapter à ma requête)
Requêtes actuelles qui fonctionnent mais je ne sais pas si cela est très "optimisé" :
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query1 = <<<EOQ
SELECT
livres.id,
livres.lien_img,
livres.titre,
livres.resume,
livres.parution,
auteurs.id,
auteurs.biographie,
auteurs.prenom_nom AS auteur,
editeurs.nom AS editeur,
editeurs.presentation
FROM livres
INNER JOIN auteurs
ON auteurs.id = livres.auteur_id
INNER JOIN editeurs
ON editeurs.id= livres.editeur_id
WHERE livres.id = :id
EOQ;
$req1 = $bdd->prepare($query1);
$req1->bindValue(':id', (int)$_GET['id'], PDO::PARAM_INT);

try { $req1->execute(array('id' => 1)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row1 = $req1->fetch();

try { $req1->execute(array('id' => 2)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row2 = $req1->fetch();

try { $req1->execute(array('id' => 5)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row3 = $req1->fetch();

try { $req1->execute(array('id' => 20)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row4 = $req1->fetch();

try { $req1->execute(array('id' => 22)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row5 = $req1->fetch();


// puis un peu plus loin



$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = <<<EOQ
SELECT
livres.id,	
livres.titre,
livres.sous_titre,
livres.lien_img,
livres.parution,
livres.pages,
livres.description, 		
illustrateurs.prenom_nom AS illustrateur,						
editeurs.nom AS editeur,
editeurs.id AS editeur_id,					
auteurs.prenom_nom AS auteur,
auteurs.id AS auteur_id,
collection.nom AS collection,
categorie.id AS categorie_id,
categorie.tranche_age,
genre.id AS genre_id,
genre.nom AS genre
FROM livres
INNER JOIN 	auteurs 
ON	auteurs.id = livres.auteur_id
LEFT JOIN illustrateurs 
ON	illustrateurs.id = livres.illustrateur_id
INNER JOIN editeurs 
ON	editeurs.id = livres.editeur_id	
INNER JOIN collection
ON collection.id = livres.collection_id	
INNER JOIN categorie
ON categorie.id = livres.categorie_id
INNER JOIN genre
ON genre.id = livres.genre_id
WHERE parution >= 2012-04-01
LIMIT :limit
OFFSET :offset
EOQ;
$req = $bdd->prepare($query);
$req->bindParam(':limit', $limit, PDO::PARAM_INT);
$req->bindParam(':offset', $offset, PDO::PARAM_INT);

try {
   $req->execute();
}
catch(PDOException $e) {
   die('Erreur MySQL : ' . $e->errorInfo[2]);
}
	
$res = $req->fetchAll(PDO::FETCH_ASSOC);
					
$content = '';

    foreach ($res as $row)
    {
		
        $content .= '
         <a href="test_livre_numerique.php?id='.$row['id'].'"><img src="img/cover_img/'.$row['lien_img'].'.png" alt="nouveauté" width="80" class="cover"></a>';
	}	
 }
En ajoutant deux clauses WHERE puis en exécutant la requête, quelque chose cloche !
Voilà le code :
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = <<<EOQ
SELECT
livres.id,	
livres.titre,
livres.sous_titre,
livres.lien_img,
livres.parution,
livres.pages,
livres.description, 		
illustrateurs.prenom_nom AS illustrateur,						
editeurs.nom AS editeur,
editeurs.id AS editeur_id,					
auteurs.prenom_nom AS auteur,
auteurs.id AS auteur_id,
collection.nom AS collection,
categorie.id AS categorie_id,
categorie.tranche_age,
genre.id AS genre_id,
genre.nom AS genre
FROM livres
INNER JOIN 	auteurs 
ON	auteurs.id = livres.auteur_id
LEFT JOIN illustrateurs 
ON	illustrateurs.id = livres.illustrateur_id
INNER JOIN editeurs 
ON	editeurs.id = livres.editeur_id	
INNER JOIN collection
ON collection.id = livres.collection_id	
INNER JOIN categorie
ON categorie.id = livres.categorie_id
INNER JOIN genre
ON genre.id = livres.genre_id
WHERE parution >= 2012-04-01 OR livres.id = :id
LIMIT :limit
OFFSET :offset
EOQ;
$req = $bdd->prepare($query);
$req->bindParam(':limit', $limit, PDO::PARAM_INT);
$req->bindParam(':offset', $offset, PDO::PARAM_INT);
$req->bindValue(':id', (int)$_GET['id'], PDO::PARAM_INT);

try { $req->execute(array('id' => 1)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row1 = $req->fetch();

try { $req->execute(array('id' => 2)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row2 = $req->fetch();

try { $req->execute(array('id' => 5)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row3 = $req->fetch();

try { $req->execute(array('id' => 20)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row4 = $req->fetch();

try { $req->execute(array('id' => 22)); } catch (PDOException $e) { die('Erreur MySQL : ' . $e->errorInfo[2]); }
$row5 = $req->fetch();


try {
   $req->execute();
}
catch(PDOException $e) {
   die('Erreur MySQL : ' . $e->errorInfo[2]);
}
	
$res = $req->fetchAll(PDO::FETCH_ASSOC);
					
$content = '';

    foreach ($res as $row)
    {
		
        $content .= '
         <a href="test_livre_numerique.php?id='.$row['id'].'"><img src="img/cover_img/'.$row['lien_img'].'.png" alt="nouveauté" width="80" class="cover"></a>';
	}	
 }

Re: PDO requête préparée avec plusieurs clauses WHERE

Posté : 12 juil. 2012, 13:11
par Mazarini
Eventuellement en ajoutant une variable typeRequete et en mettant ID ou DATE dedans :
... where (id = :id and 'ID' = :typeRequete) or (date_parurion = '2012-01-01' and 'date' = :typeRequete) 
Mais à priori, ce ne présente aucun intérêt de concaténer 2 requetes.