Я ищу более быстрый и понятный способ написания этих операторов if в PHP.

if($type == "deals") {
    if($city == "blank" && $category == "blank") {
        $arr = $mysqli->query("SELECT id, hide FROM deals");
    }
    if($city !== "blank" && $category == "blank") {
        $arr = $mysqli->query("SELECT id, hide FROM deals WHERE city=".$city."");
    }
    if($city == "blank" && $category !== "blank") {
        $arr = $mysqli->query("SELECT id, hide FROM deals WHERE category=".$category."");
    }
    if(!$city == "blank" && $category !== "blank") {
        $arr = $mysqli->query("SELECT id, hide FROM deals WHERE city=".$city." AND category=".$category."");
    }
} else { ... same thing with different querys ... }

Предложения о лучших альтернативах приветствуются!

Благодарность

0
ChristopherStrydom 3 Май 2014 в 16:46

3 ответа

Лучший ответ

Есть изящный способ добиться того же, который обеспечивает защиту от SQL-инъекций и требует меньше кода!

$stmt = $mysqli->prepare("SELECT id, hide FROM deals WHERE id>? AND (city=? OR 1=?) AND (category=? OR 1=?)");
$cityIsBlank = ($city == "blank");
$categoryIsBlank = ($city == "blank");
$stmt->bindParam("isisi", $last_id, $city, $cityIsBlank, $category, $categoryIsBlank));
$stmt->execute();

Если какой-либо параметр имеет значение «blank», тогда 1=1 принимает значение true, и оптимизатор базы данных в основном не будет включать предложение where в поиск.

Подробнее об использовании подготовленных операторов и получении значений можно узнать здесь .

1
jackfrankland 8 Май 2014 в 20:16

Я не трогаю php годами. Но в псевдокоде:

$whereParam = array();
$sql = array();

$sql[] = "SELECT id, hide FROM deals";

if($city !== "blank") $whereParam[] = "city=".$city;
if($category !== "blank") $whereParam [] = "category=".$category;

$where = implode(' AND ', $whereParm);

if($where !== '') $sql[] = $where;

$arr = $mysqli->query(implode(' WHERE ', $sql));

Улучшение зависит от вашего другого кода.

ИЗМЕНИТЬ : я очень хочу взглянуть на ORMS

3
Community 23 Май 2017 в 11:50

Попробуйте создать запрос динамически.

$sql = "SELECT id, hide FROM deals";
$wheres = array("city" => $city, "category" => $category);

if (count($wheres) > 0) {
    $sql .= " WHERE " . implode(" AND ", $wheres);
} 

$arr = $mysqli->query($sql);

Убедитесь, что вы правильно экранируете свои переменные, чтобы избежать инъекций SQL. Вы можете использовать это:

$city = $mysqli->real_escape_string($city);

Для каждой из переменных.

0
Filip Haglund 3 Май 2014 в 12:56