使用SQL的多重排序使用PHP和表单选择查询
我使用带有6个标准的html表单,在变量中使用lat的convert标准,如下所示: 案例1-所有标准都是默认的使用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
$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 . '...'