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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <?php
function selectFruits($dbh,$calories,$couleur){
//J'ai toujours besoin de savoir si la requête retourne au moins un tuple
$sql0='SELECT count(id)
FROM fruit
WHERE calories < :calories
AND couleur = :couleur';
//requête préparée dès le comptage
$sth = $dbh->prepare($sql0, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));//suis pas sûre que c ce qu'il faut mettre ds le 2nd paramètre ici
if($sth->execute(array(':calories' => $calories, ':couleur' => $couleur))){
$res = $dbh->query($sql0);
if ($res->fetchColumn() > 0) {
$res=NULL;
$sql = 'SELECT nom, couleur, calories
FROM fruit
WHERE calories < :calories AND couleur = :couleur';
//ici peut-on se passer des bind_param qui seraient redondants ?
/*$stmt=$dbh->prepare($sql);
$stmt->bindParam(':calories', $calories);
$stmt->bindParam(':couleur', $couleur);
if($stmt->execute(array(':calories' => $calories, ':couleur' => $couleur))){
*/
$data=array();
$stmt = $dbh->prepare($sql));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
array_push($data,$row);
}
return $data;
}
else{
return 0;
}
}
else{
return false;//en espérant que le bloc try & catch gère le msg d'erreur sql
}
}
//peut-on mettre ainsi un bloc try & catch dans la page appelante, et se passer du bloc dans les méthodes ?
//avec la portabilité des variables, ici externalisées de la fonction, j'ai des gros doutes...
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data=selectFruits($dbh,130,'jaune');
$dbh = null;
if(is_array($data)){
echo '<pre>';
print_r($data);
echo '</pre>';
}
elseif($data==0){
echo 'Aucun fruit avec ces critères';
}
}
catch (PDOException $e) {
echo $e->getMessage() . "<br/>";
}
?> |
Partager