gpt4 book ai didi

php - PHP/MySQL 动态创建 WHERE 子句

转载 作者:行者123 更新时间:2023-11-29 06:11:09 25 4
gpt4 key购买 nike

我正在动态生成 MySQL 查询的 WHERE 部分。到目前为止,我的下面的代码运行得很好

请注意: _GET 字符串在我的代码中的其他地方都经过验证,但为了将此代码保持在这个问题的合理长度,我已将它们直接放在下面。对于任何想要做与我正在做的事情类似的事情并使用我的代码作为基础的人,请务必验证您的字符串以避免 mysql 注入(inject)。

  /* Loop through each column in the table */

for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
/* check if the column has been marked as searchable and that the param sent from the client contains data */
if ( $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
if ( $sWhere == "" )
{
$sWhere = "WHERE ";
}
else
{
$sWhere .= " AND ";
}



/* RANGE FILTER CODE - This part is not important to this question but included for completenes */

$columnFilterValue = mysql_real_escape_string($_GET['sSearch_' . $i]);
// check for values range
$rangeSeparator = "~";
if (!empty($rangeSeparator) && strstr($columnFilterValue, $rangeSeparator)) {
// get min and max

$columnFilterRangeMatches = explode('~', $columnFilterValue);

// get filter
if (empty($columnFilterRangeMatches[0]) && empty($columnFilterRangeMatches[1]))
$sWhere .= " 0 = 0 ";
else if (!empty($columnFilterRangeMatches[0]) && !empty($columnFilterRangeMatches[1]))
$sWhere .= $aColumns[$i] . " BETWEEN '" . $columnFilterRangeMatches[0] . "' and '" . $columnFilterRangeMatches[1] . "' ";
else if (empty($columnFilterRangeMatches[0]) && !empty($columnFilterRangeMatches[1]))
$sWhere .= $aColumns[$i] . " < '" . $columnFilterRangeMatches[1] . "' ";
else if (!empty($columnFilterRangeMatches[0]) && empty($columnFilterRangeMatches[1]))
$sWhere .= $aColumns[$i] . " > '" . $columnFilterRangeMatches[0] . "' ";
} else {



/* Begin building WHERE clause */


$sWhere = "WHERE (";

$aORs = array();

for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
$value = $_GET['sSearch_'.$i];

array_push($aORs, $aColumns[$i]." IN ($value)");


}
}
$sWhere .= implode(" OR ",$aORs);

$sWhere .= ')';
}
}
}

现在这段代码的作用是,它接受从客户端发送的逗号分隔值的字符串,并基于这些字符串构建 WHERE 类。

  • $aColumns 是一个包含表中列的数组

示例:-

如果参数...

  • sSearch_1 包含值 1、3、5、6
  • sSearch_2 包含值 1,2,3
  • sSearch_4 的值为 4、5、6
  • sSearch 6 包含值 7,8,9

然后此代码将生成以下 WHERE 子句:

 WHERE genre_id IN (1,3,5,6) OR instruments IN (1,2,3) OR emotions IN (4,5,6) OR ratings IN (7,8,9)

这工作得很好,但是我想通过发送另一个包含正确顺序的 OR 和 AND 列表的字符串来使 OR 或 AND 动态化。

例如,如果 $_GET['filtertype'] = 像这样的字符串:-

OR,OR,AND

然后它应该返回而不是上面的:

WHERE genre_id IN (1,3,5,6) OR instruments IN (1,2,3) OR emotions IN (4,5,6) OR ratings IN (7,8,9)

正如您在上面的代码中看到的,我目前正在通过 implode 函数将 OR 注入(inject)到我的数组中。 (下面重复相关部分代码)

  $sWhere = "WHERE (";

$aORs = array();

for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
$value = $_GET['sSearch_'.$i];

array_push($aORs, $aColumns[$i]." IN ($value)");


}
}
$sWhere .= implode(" OR ",$aORs);

$sWhere .= ')';

如何修改它以根据正确的循环顺序添加正确的 AND 或 OR?

最佳答案

我不会创建一个 where 字符串,而是首先创建一个包含 where 部分的数组。

$whereParts = array();
foreach($aColumns as $i => $column)
{
<logic goes here>
$whereParts[] = 'genre_id IN (1,3,5,6)'; // sample :)
}

$where = 'WHERE ' . implode(' OR ', $whereParts); // note the spaces around OR

然后很容易将' OR '替换为' AND '

允许用户为所有 where 部分在 AND 和 OR 之间进行选择很容易,但如果您想为每个单独的项目执行此操作,则不然。这也是一个逻辑问题。当用户指定a OR b AND c时,他想要(a OR b) AND c还是a OR (b AND c)

关于php - PHP/MySQL 动态创建 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9044497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com