我有一种情况是查询依赖于用户输入。如果用户输入 toy,则查询会有一些 OR,如果用户输入 TV,则查询会略有不同。执行此操作的简单方法如下所示。但是,当我有很多不同的产品时,最好的方法是什么?我想创建一个包含所有产品的数组,并在查询中使用 if 条件,但是这是否可行或是否有更好的方法?欣赏。
<?php
if ($toy){
$sql = $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT product FROM dis WHERE cat IN (%s, %s, %s)
AND (val !=%s AND mark='price')
or (val !=%s AND mark='country')
or (val !=%s AND mark='shipping')
or (val !=%s AND mark='quality')
or (val !=%s AND mark='frequency')
or (val !=%s AND mark='duration')
",$a,$b,$c,$d,$e,$f));
}
if($tv){
$sql = $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT product FROM dis WHERE cat IN (%s, %s, %s)
AND (val !=%s AND mark='price')
or (val !=%s AND mark='country')
or (val !=%s AND mark='shipping')
",$a,$b,$c,$d,$e,$f));
}
/*I have a lot*/
?>
最佳答案
您可以将(产品类型及其参数之间的)映射存储在 PHP 代码或数据库表中。如果您将其存储在 PHP 中:
$mapping = Array(
'toy' => Array('country', 'shipping', 'quality', 'frequency', 'duration'),
'tv' => Array('country', 'shipping')
);
$query = 'SELECT DISTINCT product FROM dis WHERE cat IN (';
foreach($category as $k=>$v) $category[$k] = '"'.mysql_real_escape_string($v).'"';
$query .= implode(',', $category);
$query .= ') AND ((val !="'.mysql_real_escape_string($price).'" AND mark="price") ';
foreach($mapping[$kind] as $v)
$query .= ' or (val !="'.mysql_real_escape_string($parameter[$v]).'" AND mark="'.$v.'")';
$query .= ')';
$sql = $wpdb->get_results($query);
查看您的 SQL,我可以假设您有一个包含所有产品的大表 - 每个产品都用许多行表示,一行代表产品的每个参数。这是一个糟糕的设计! 您最好使用 2 个单独的表 - 一个只包含产品(每个产品只有 1 行),另一个表将包含产品参数(使用一对多关系) - 每个参数在不同的行上。
关于php - 我可以根据用户输入更改 mysql 查询,php 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38711779/