如何用数组值编写php三值运算符

如何用数组值编写php三值运算符,php,mysql,sql,Php,Mysql,Sql,可以把它写成三元运算符吗 if($catId){ $clauses[] ='`category` = '.$catId; } 当我尝试以下操作时,仍然会得到一个添加到数组中的值 $clauses[] = ($catId)?'`category` = '.$catId:null; 作为参考,我在构建带有where子句的sql查询时使用了它 $where = null; $clauses = array(); if($manId){ $clauses[] ='`man` = '.

可以把它写成三元运算符吗

if($catId){
    $clauses[] ='`category` = '.$catId;
}
当我尝试以下操作时,仍然会得到一个添加到数组中的值

$clauses[] = ($catId)?'`category` = '.$catId:null;
作为参考,我在构建带有where子句的sql查询时使用了它

$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>';
}
$where=null;
$子句=数组();
如果($manId){
$子句[]=''man`='.$manId;
}
如果($catId){
$子句[]='`category`='.$catId;
}
如果(计入($条款)){
$where=内爆(“&&”,$子句);
$where='where'.$where;
}
$sql=“从`products`$中选择*,其中订单按`isfeatured`、`sortvalue`”;
$result=mysqli\u查询($con,$sql);
while($row=mysqli\u fetch\u数组($result)){
打印$row['name']。
; }
这看起来不错:

$clauses[] = ($catId)?'`category` = '.$catId:null;
如果$catId不为false(阅读PHP中的强制类型),数组中的新元素将是一个值等于'
类别的字符串。$catId,否则为null,但始终在此处向数组添加新元素。因此,您的其余代码将无法工作。特别是这一部分:

if(count($clauses)){
$where = implode (' && ',$clauses);
$where = 'WHERE '.$where;
}
因为您将得到如下示例:其中
类别
=1,并且按

排序,这看起来很好:

$clauses[] = ($catId)?'`category` = '.$catId:null;
如果$catId不为false(阅读PHP中的强制类型),数组中的新元素将是一个值等于'
类别的字符串。$catId,否则为null,但始终在此处向数组添加新元素。因此,您的其余代码将无法工作。特别是这一部分:

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

因为您将得到这样的示例:其中
类别
=1,并且订单依据是。如果您真的想使用三元,可以这样:

$catId ? $clauses[] = "`category`=$catId" : null;
这里赋值发生在三元数的真部分,而不是赋值三元数的结果

但是,使用三元是没有意义的,因为如果变量为空,您不想做任何事情,因此三元的false部分是无关的。应具有基本相同效果的较短版本为:

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

就我个人而言,我认为你已经拥有的方式更具可读性,并且对那些以后必须在这方面工作的人更友好,因为它不那么怪异和刻薄,但这是可能的。

是的。如果您真的想使用三元,可以这样:

$catId ? $clauses[] = "`category`=$catId" : null;
这里赋值发生在三元数的真部分,而不是赋值三元数的结果

但是,使用三元是没有意义的,因为如果变量为空,您不想做任何事情,因此三元的false部分是无关的。应具有基本相同效果的较短版本为:

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

就我个人而言,我认为你已经拥有的方式更具可读性,并且对任何以后必须处理这个问题的人来说更友好,因为它不那么怪异和刻薄,但这是可能的。

当然,你可以按照@Dontpanic的建议使用三元运算符来完成这项工作。但您应该更加了解SQL注入,因此我建议您使用prepared语句,而不是自己替换值,如下所示:

$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>';
}
$where=null;
///一般查询
$sql=“从`products`中选择*1=1”
$params=array();
如果($manId){
$sql.=“和`man`=?”;
$params[]=$manId;
}
如果($catId){
$sql.=“和`类别`=?”
$params[]=$catId;
}
///添加ORDERBY子句
$sql.=“按`isfeatured`、`sortvalue``排序”;
///准备查询
$stmt=mysqli\u prepare($con,$sql);
foreach($params作为$param){
///绑定整数参数
$stmt->bind_param(“i”,$param);
}
///执行该语句
$stmt->execute();
///取得成果
$result=$stmt->get_result();
///处理结果
而($row=$result->fetch_assoc()){
打印$row['name']。
; }
当然,您可以按照@Dontpanic的建议使用三元运算符来实现这一点。但您应该更加了解SQL注入,因此我建议您使用prepared语句,而不是自己替换值,如下所示:

$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>';
}
$where=null;
///一般查询
$sql=“从`products`中选择*1=1”
$params=array();
如果($manId){
$sql.=“和`man`=?”;
$params[]=$manId;
}
如果($catId){
$sql.=“和`类别`=?”
$params[]=$catId;
}
///添加ORDERBY子句
$sql.=“按`isfeatured`、`sortvalue``排序”;
///准备查询
$stmt=mysqli\u prepare($con,$sql);
foreach($params作为$param){
///绑定整数参数
$stmt->bind_param(“i”,$param);
}
///执行该语句
$stmt->execute();
///取得成果
$result=$stmt->get_result();
///处理结果
而($row=$result->fetch_assoc()){
打印$row['name']。
; }
我会坚持原来的语法,为什么要更改它呢?在您的情况下,
array\u filter
可能会有帮助。。类似于
$clauses=array_filter($clauses,function($v){return!is_null($v);})在所有三元运算符之后。丑陋的样式代码:
$clauses=array\u merge($clauses,$catId?array('`category`='.$catId):array())
我会坚持原来的语法,为什么要更改它呢?在你的情况下,可能是
array\u filter
会有帮助。。类似于
$clauses=array_filter($clauses,function($v){return!is_null($v);})
在所有三元运算符之后。丑陋样式代码:
$clauses=array\u merge($clauses,$catId?array(“`category`=”。$catId):array())
字符串中没有空值。。。它将是
,其中“category`=1,orderby…
。。它的语法错误:)当然,我写得很快,犯了一个明显的错误,但结论是一样的。字符串中不会有NULL。。。它将是
,其中“category`=1,orderby…
。。它的语法错误:)当然,我写得很快,犯了一个明显的错误,但结论是一样的。这很好,最终我达到了目的(使用准备好的语句)。然而,我喜欢使用内爆而不是1==1,尽管1==1方法没有太大的错误,就像不必使用u