到目前为止,我有这两个数组:
$field_name[] = $selectedArr['field_name'];
$field_value[] = $selectedArr['field_value'];
其中一个数组包含字段名,而另一个包含字段值。现在,如果两个或多个字段名称数组值相同,那么SQL查询中的运算符应该是这两个或多个字段之间的OR(如果不是相同的AND)和其余字段之间的AND。
所以如果说:
$field_name[0]="Type";
$field_name[1]="Type";
$field_name[2]="Varietal";
和
$field_value[0]="Red";
$field_value[1]="White";
$field_value[2]="Chardonney";
如何通过循环或其他任何方式检查这一点,然后根据结果动态生成......如下所示:
$SQLQuery=("SELECT * FROM wines WHERE $field_name[0]=$field_value[0]
OR $field_name[1]=$field_value[1] AND $field_name[2]=$field_value[2]");
任何人都可以告诉我或指导我如何做到这一点? 提前谢谢你。
答案 0 :(得分:2)
$field_name[0]="Type";
$field_name[1]="Type";
$field_name[2]="Varietal";
$field_value[0]="Red";
$field_value[1]="White";
$field_value[2]="Chardonney";
$result_array = array();
foreach ($field_name as $k=>$v)
{
$result_array[$v][] = $v."='".$field_value[$k]."'";
}
foreach ($result_array as $k=>$v)
{
$result_array[$k] = "(".implode(" OR ", $result_array[$k]).")";
}
echo implode(" AND ", $result_array);
<强>更新强>
顺便说一下,如果你想结束FIELD IN('val1','val2'等)而不是FIELD ='Val1'OR FIELD ='Val2'你可以使用它:
$result_array = array();
foreach ($field_name as $k=>$v)
{
$result_array[$v][] = "'".$field_value[$k]."'";
}
foreach ($result_array as $k=>$v)
{
if (count($result_array[$k]) > 1) $result_array[$k] = "$k IN (".implode(" OR ", $result_array[$k]).")";
else $result_array[$k] = "$k = $v[0]";
}
echo implode(" AND ", $result_array);
答案 1 :(得分:1)
您可以使用array_count()
获取每个元素在数组中显示频率的列表。单打的计数为1
,重复的值将计为> 1
(例如2,3,4等)。
这样的事情可以解决这个问题,假设$ selectedArry包含所有字段/值对:
$data = array();
foreach($selectedArr as $sub) {
if (!isarray($data[$sub['field_name']])) {
$data[$sub['field_name']] = array();
}
$data[$sub['field_name']][] = $sub['field_value'];
}
$clauses = array()
foreach ($data as $key => $values) {
if (count($sub) == 1) {
$clauses[] = "($key = {$values[0]})";
} else {
$clauses[] = "($key IN (" . implode(',', $values) . "))";
}
$sql = "SELECT * FROM windows WHERE " . implode(' AND ', $clauses);
答案 2 :(得分:0)
假设数组长度相同,迭代其中一个,在兄弟数组上进行比较以查看值是否匹配。使用此逻辑在第三个数组$ field_operator上生成插槽,在每个通道上设置“AND”或“OR”。
然后再次循环遍历长度并连接数组以构造有效的SQL查询,如下所示:
$sql .= $field_name . ' = ' . $field_value . ' ' . $field_operator;
答案 3 :(得分:0)
首先,你查询逻辑是不正确的,
你最终会得到很多意想不到的记录
你可以使用像
这样的东西$arr = array();
foreach ($field_name as $key=>$name)
{
if (!isset($arr[$name]))
{
$arr[$name] = array();
}
$arr[$name][] = $field_value[$key];
}
$where = array();
foreach ($arr as $column=$val)
{
$where[] = "{$column} IN('".implode("',", $val).'")";
}
$sql = '.... where '.implode(' AND ', $where);
// the above example does not take care of sql injection
答案 4 :(得分:0)
通过更智能地构建数据阵列,您可以更轻松地生活。
$wine_selection['Type'][] = "Red";
$wine_selection['Type'][] = "White";
$wine_selection['Varietal'][] = "Chardonney";
$sql = "SELECT *
FROM wines
WHERE Type IN (".implode(',', $wine_selection['Type']).")
AND Varietal IN (".implode(',' $wine_seelction['Varietal']).")";