Как написать троичный оператор php со значением массива

0

Можно ли записать это как тернарный оператор?

if($catId){
    $clauses[] ='`category` = '.$catId;
}

Когда я пытаюсь выполнить следующее, я все равно получаю добавленную стоимость в массив

$clauses[] = ($catId)?'`category` = '.$catId:null;

Для справки, я использую это при построении SQL-запроса с предложением where

$where = null;
$clauses = array();
if($manId){
    $clauses[] ='`man` = '.$manId;
}
if($catId){
    $clauses[] ='`category` = '.$catId;
}
if(count($clauses)){
    $where = implode (' && ',$clauses);
    $where = 'WHERE '.$where;
}

$sql = "SELECT * FROM `products` $where ORDER BY `isfeatured`,`sortvalue`";
$result = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($result)){
    print $row['name'].'<br>';
}
  • 1
    я бы придерживался оригинального синтаксиса, зачем его менять?
  • 0
    в вашем случае может array_filter .. что-то вроде $clauses = array_filter($clauses, function($v){return !is_null($v);}); после всех троичных операторов.
Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

Да. Если вы действительно хотите использовать тройной, это возможно следующим образом:

$catId ? $clauses[] = "`category`=$catId" : null;

Здесь присваивание происходит в истинной части тройки вместо назначения результата тройного.

Использование троичного типа является бессмысленным, хотя, потому что вы не хотите ничего делать, если переменная пуста, поэтому ложная часть троичного значения не имеет значения. Более короткая версия, которая должна иметь в основном тот же эффект:

$catId && $clauses[] = "`category`=$catId";

Лично я думаю, что способ, которым у вас уже есть, более читабельный и дружелюбный для всех, кто должен работать над этим позже, будучи менее странным и взломанным, но это возможно.

1

Конечно, вы можете сделать это с помощью тройного оператора, как предлагал @Dontpanic. Но вы должны лучше знать SQL-инъекцию, поэтому я бы рекомендовал использовать подготовленный оператор вместо подстановочных значений самостоятельно, как показано ниже:

$where = null;

/// Generic query
$sql = "SELECT * FROM `products` WHERE 1 = 1"

$params = array();

if($manId){
    $sql .= " AND `man`= ?";
    $params[] = $manId;
}

if($catId){
    $sql .= " AND `category` = ?"
    $params[] = $catId;
}

/// Adding ORDER BY clause
$sql .=  " ORDER BY `isfeatured`,`sortvalue`";

/// Prepare query
$stmt = mysqli_prepare ($con, $sql);

foreach($params as $param) {
    /// Binding integer parameters
    $stmt->bind_param("i", $param);
}

/// Execute the statement
$stmt->execute();

/// Get results
$result = $stmt->get_result();

/// Process the results
while($row = $result->fetch_assoc()){
    print $row['name'].'<br>';
}
  • 0
    Это очень хорошо, в конечном счете, куда я направлялся (используя подготовленные заявления). Однако мне понравилось использование implode, а не 1 == 1, хотя в методе 1 == 1 не так уж много неправильного, совсем как отсутствие необходимости использовать это бессмысленное утверждение.
0

Это выглядит отлично:

$clauses[] = ($catId)?'`category` = '.$catId:null;

Если $catId не является ложным (читайте о типах литья в PHP), новый элемент в массиве будет строкой со значением, равным 'category ='. $catId, иначе null, но вы всегда добавляли новый элемент в массив в этом месте. Таким образом, ваш остальной код не будет работать. Особенно эта деталь:

if(count($clauses)){
$where = implode (' && ',$clauses);
$where = 'WHERE '.$where;
}

Потому что вы получите, например, что-то вроде этого: WHERE category= 1 AND ORDER BY

  • 1
    В строке не будет NULL ... это будет просто where `category`=1 and order by ... ... это синтаксическая ошибка :)
  • 0
    Конечно, я написал это быстро и сделал грубую ошибку, но вывод тот же.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню