Можно ли написать это как тернарный оператор?
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>'; }
Да. Если вы действительно хотите использовать тройной, это возможно следующим образом:
$catId ? $clauses[] = "`category`=$catId" : null;
Здесь присваивание происходит в истинной части тернаря вместо назначения результата тройной.
Использование троичного типа является бессмысленным, хотя, потому что вы не хотите ничего делать, если переменная пуста, поэтому ложная часть трояна не имеет значения. Более короткая версия, которая должна иметь в основном тот же эффект:
$catId && $clauses[] = "`category`=$catId";
Лично я думаю, что способ, которым у вас уже есть, более читабельный и дружелюбный для всех, кто должен работать над этим позже, будучи менее странным и взломанным, но это возможно.
Конечно, вы можете сделать это с помощью тройного оператора, как предложил @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>'; }
Это выглядит хорошо:
$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