使用SQL的多重排序使用PHP和表单选择查询

使用SQL的多重排序使用PHP和表单选择查询,php,sql,Php,Sql,我使用带有6个标准的html表单,在变量中使用lat的convert标准,如下所示: 案例1-所有标准都是默认的 $core=null$mhz=零$ram=null$cam=null$mAh=null$screen=null 正确的sql查询如下: $sql=“按性能cpu核心描述、性能cpu描述、性能rami描述限制$start、$LIMIT从$tbl\U名称顺序中选择*” 案例2-仅设置了一个标准 $core=null$mhz=“性能cpu=1400”$ram=null$cam=null$m

我使用带有6个标准的html表单,在变量中使用lat的convert标准,如下所示:

案例1-所有标准都是默认的
$core=null$mhz=零$ram=null$cam=null$mAh=null$screen=null

正确的sql查询如下:
$sql=“按性能cpu核心描述、性能cpu描述、性能rami描述限制$start、$LIMIT从$tbl\U名称顺序中选择*”

案例2-仅设置了一个标准
$core=null$mhz=“性能cpu=1400”$ram=null$cam=null$mAh=null$screen=null

正确的查询如下:
$sql=“从$tbl\U名称中选择*,其中$mhzz按性能cpu\U核心描述、性能cpu描述、性能rami描述限制$start、$LIMIT排序”

案例3-问题在于所有或多个标准的制定:
$core=2$mhz=“性能cpu=1400”$ram=“performanta_rami=1024”$cam=“摄像机镜头=3.2”$mAh=“baterie_mAh=2250”$screen=“densitate=441”

我知道我需要使“
WHERE
”在任何变量设置时都是动态的和可见的,而且我还需要一个“
”也像:

$sql=“从$tbl\U名称中选择*其中$core和$mhzz按性能cpu\U core DESC、性能cpu DESC、性能rami DESC LIMIT$start、$LIMIT排序”
这让我有一周的压力,没有帮助我无法前进


提前感谢

免责声明:这是一段糟糕的代码,有一百万种更好的方法可以做到这一点,但这是最简单的解释

$parameters = array();
if(!empty($core)){
$parameters['core'] = $core;
}
if(!empty($mhz)){
$parameters['mhz'] = $mhz;
}
if(!empty($ram)){
$parameters['ram'] = $ram;
}
if(!empty($cam)){
$parameters['cam'] = $cam;
}
if(!empty($mAh)){
$parameters['mAh'] = $mAh;
}
if(!empty($screen)){
$parameters['screen'] = $screen;
}

$sql = "SELECT * FROM $tbl_name WHERE 1=1 ";
foreach($parameters as $k=>$v){
 $sql .= " AND ".$k."='".$v."'";
}
$sql .=  " ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";

// All of those parameters should be sanitized to prevent SQL injection.
// mysql_* is deprecated, use mysqli_* or PDO.

格式很好的问题。。干得好

我很可能误解了这个问题,但是我认为您在问如何动态构造查询。 也许你没有意识到你在使用字符串

例如


我希望这能让您找到正确的方向。

从查询的开头开始,为使命令更易于生成,请添加一个“始终为真”的WHERE条件:

$sql = "SELECT * FROM $tbl_name WHERE 1=1";
然后检查变量并根据需要添加WHERE条件(and之前的空格非常重要):

然后附加ORDER BY和LIMIT,就完成了(ORDER BY之前的空格非常重要):

此外,正如Mahmut指出的,您不能在
中使用$mhz
,您必须在
中使用列名=$mhz

请确保首先从MySQL命令行或工作台尝试查询。这将帮助您理解语法,包括哪些列需要单引号,哪些列不需要单引号

这不是组装查询的理想方法,但它会起作用,而且看起来您刚刚开始使用PHP/MySQL,因此无需一次抛出太多内容。

您可以使用并构建
where
子句

$parameters = array();
if(!empty($core)){
    $parameters[] = "core = '$core'";
}
if(!empty($mhz)){
    $parameters[] = "mhz = '$mhz'";
}
if(!empty($ram)){
    $parameters[] = "ran = '$ram'";
}
if(!empty($cam)){
    $parameters[] = "cam = '$cam'";
}
if(!empty($mAh)){
    $parameters[] = "mAh = '$mAh'";
}
if(!empty($screen)){
    $parameters[] = "screen = $screen";
}

if (empty($parameters)) {
   $whereclause = "";
} else {
   $whereclause = "WHERE " . join(' AND ', $parameters);
}

$sql = "SELECT * FROM $tbl_name $whereclause ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";
$conditions = array_filter(array($core, $mhz, $ram, $cam, $mAh, $screen));
$clause = implode(' and ', $conditions);
这会将所有非空元素保持为
$conditions
,然后将它们与
连接起来。然后可以将其用作

'... where ' . $clause . '...'

我必须做截图。这个问题是艺术:)+1很好的问题,+我也问:你敢坚持一个标准是有效的吗?如果你不使用特殊的框架。在本部分
中,$mhzz
不设置比较值。为了更好地理解动态查询创建,请阅读以下文本。请至少使用mysql_real_escape_string(不要忘记传递当前链接)来转义查询中任何不受信任的值解析错误:语法错误,意外“;”,第49I行的E:\server\htdocs\performanta.php中应为“]”,修复了
if(empty($parameters))
中缺少的括号,是否修复了它?分析错误:语法错误,意外'{在E:\server\htdocs\performanta.php的第44行,我刚刚检查了一下,我的代码中没有语法错误。它一定在脚本的其他地方。如果你使用一个好的IDE,它应该可以帮助你找到它。如何放置$sql?比如
$sql=“按performanta\u cpu\u core DESC、performanta\u cpu DESC、performanta\u rami DESC LIMIT$start、$LIMIT”;
或其他方式从$tbl\u名称顺序中选择*号”;
或?在后面追加它。我已更新响应以反映更改。分析错误:语法错误,意外“;”,在E:\server\htdocs\performanta.php的第26行上应为“]”这是第
$parameters['core']=$core;
我键入了所有括号,我已将我的回答更新为正确。
$parameters = array();
if(!empty($core)){
    $parameters[] = "core = '$core'";
}
if(!empty($mhz)){
    $parameters[] = "mhz = '$mhz'";
}
if(!empty($ram)){
    $parameters[] = "ran = '$ram'";
}
if(!empty($cam)){
    $parameters[] = "cam = '$cam'";
}
if(!empty($mAh)){
    $parameters[] = "mAh = '$mAh'";
}
if(!empty($screen)){
    $parameters[] = "screen = $screen";
}

if (empty($parameters)) {
   $whereclause = "";
} else {
   $whereclause = "WHERE " . join(' AND ', $parameters);
}

$sql = "SELECT * FROM $tbl_name $whereclause ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";
$conditions = array_filter(array($core, $mhz, $ram, $cam, $mAh, $screen));
$clause = implode(' and ', $conditions);
'... where ' . $clause . '...'