2 votes

PHP : déclaration préparée, déclaration IF : aide nécessaire

J'ai le code suivant :

$sql = "SELECT name, address, city FROM tableA, tableB WHERE tableA.id = tableB.id";

if (isset($price) ) {
    $sql = $sql . ' AND price = :price ';
}
if (isset($sqft) ) {
    $sql = $sql . ' AND sqft >= :sqft ';
}
if (isset($bedrooms) ) {
    $sql = $sql . ' AND bedrooms >= :bedrooms ';
}

$stmt = $dbh->prepare($sql);

if (isset($price) ) {
    $stmt->bindParam(':price', $price);
}
if (isset($sqft) ) {
    $stmt->bindParam(':price', $price);
}
if (isset($bedrooms) ) {
    $stmt->bindParam(':bedrooms', $bedrooms);
}

$stmt->execute();
$result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);

Ce que je remarque, ce sont les multiples instructions IF redondantes que j'ai.

Question : existe-t-il un moyen de nettoyer mon code afin de ne pas avoir ces multiples instructions IF pour les déclarations préparées ?

2voto

Bill Karwin Points 204877

Cette question est très similaire à celle posée par un utilisateur a demandé moi récemment le forum pour mon livre SQL Antipatterns. Je lui ai donné une réponse similaire à celle-ci :

$sql = "SELECT name, address, city FROM tableA JOIN tableB ON tableA.id = tableB.id";

$params = array();
$where = array();

if (isset($price) ) {
    $where[] = '(price = :price)';
    $params[':price'] = $price;
}
if (isset($sqft) ) {
    $where[] = '(sqft >= :sqft)';
    $params[':sqft'] = $sqft;
}
if (isset($bedrooms) ) {
    $where[] = '(bedrooms >= :bedrooms)';
    $params[':bedrooms'] = $bedrooms;
}

if ($where) {
  $sql .= ' WHERE ' . implode(' AND ', $where);
}

$stmt = $dbh->prepare($sql);

$stmt->execute($params);
$result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);

1voto

jini Points 3092

Au lieu de if else, il suffit d'utiliser l'opérateur ternaire de PHP

     if (isset($_POST['statusID']))
{
  $statusID = $_POST['statusID'];
}
else
{
  $statusID = 1;

}

au lieu de cela, vous pouvez le faire :

 $statusID =  (isset($_POST['statusID'])) ? $_POST['statusID'] : 1;

Le format de l'opérateur ternaire est le suivant : $variable = condition ? if true : if false

L'avantage de cette méthode est que vous réduisez vos instructions if/else à une seule ligne et que si le compilateur vous donne des erreurs, vous pouvez toujours revenir à cette ligne au lieu de trois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X