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

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

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

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

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

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

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

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

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

Ответ 2

Конечно, вы можете сделать это с помощью тройного оператора, как предлагал @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>';
}

Ответ 3

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

$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