php - 在另一个字符串中的某个单词之前插入字符串

标签 php mysql

我正在组合 MySQL 查询,以便用户可以选择多个下拉列表并根据这些下拉列表进行过滤。正如我使用 $echo 查询检查的那样,这按预期工作。但是,除了第一个单词之外,我需要在每次出现单词“WHERE”之前插入“AND”。目前,如果我选择多个下拉列表,我的查询将如下所示:

SELECT a.MembershipID,
       a.FirstName,
       a.Surname,
       t.RaceID,
       t.Time,
       r.RaceID,
       r.RaceName,
       r.Distance,
       r.ClubYear
FROM Athlete AS a
INNER JOIN Time AS t ON a.MembershipID=t.MembershipID
INNER JOIN Race AS r ON t.RaceID=r.RaceID
WHERE r.RaceName= 'Parkrun' WHERE r.Distance= '5 kilometres'
ORDER BY a.Surname

正如您在第 4 行看到的,有两个没有 AND 的 WHERE 查询。如何在第二个 WHERE 之前插入 AND?除了第一个位置之外,我如何为每个后续位置执行此操作?我考虑过使用爆炸来创建子字符串,插入 AND,然后将它们重新连接在一起,但这似乎有点过头了。有什么帮助吗? 谢谢。

编辑:添加生成上述内容的 PHP 代码:

$query = "SELECT a.MembershipID, a.FirstName, a.Surname, t.RaceID, t.Time, r.RaceID, r.RaceName, r.Distance, r.ClubYear
                            FROM Athlete AS a 
                            INNER JOIN Time AS t  
                                ON a.MembershipID=t.MembershipID
                            INNER JOIN Race AS r
                                ON t.RaceID=r.RaceID";
            if ($_POST['raceName']!= null) {
                $raceName = mysqli_real_escape_string($mysqli, $_POST["raceName"]);
                $filter = " WHERE r.RaceName= '$raceName'";
                $query .= $filter;
            } 
            if ($_POST['athlete']!= null) {
                $athlete = mysqli_real_escape_string($mysqli, $_POST["athlete"]);
                $firstWord = explode(' ',trim($athlete));
                $firstName = $firstWord[0];
                $lastWord = explode(' ', $athlete);
                $surname = array_pop($lastWord);
                $filter = " WHERE a.FirstName= '$firstName' AND a.Surname = '$surname'";
                $query .= $filter;
            } 
            if ($_POST['distance']!= null) {
                $distance = mysqli_real_escape_string($mysqli, $_POST["distance"]);
                $filter = " WHERE r.Distance= '$distance'";
                $query .= $filter;
            } 
            if ($_POST['clubYear']!= null) {
                $clubYear = mysqli_real_escape_string($mysqli, $_POST["clubYear"]);
                $filter = " WHERE r.ClubYear= '$clubYear'";
                $query .= $filter;
            }

            $fullquery = $query . " ORDER BY a.Surname";

最佳答案

一个简单的解决方案是首先添加一个始终为 true 的语句,例如 1=1,这样您就不必检查它是否是第一个语句,然后通过附加来继续构建查询相应地和CONDITION_N

$query = "SELECT a.MembershipID, a.FirstName, a.Surname, t.RaceID, t.Time, r.RaceID, r.RaceName, r.Distance, r.ClubYear
                            FROM Athlete AS a 
                            INNER JOIN Time AS t  
                                ON a.MembershipID=t.MembershipID
                            INNER JOIN Race AS r
                                ON t.RaceID=r.RaceID";

$query .= " WHERE 1 = 1 ";
if ($_POST['raceName']!= null) {
    $raceName = mysqli_real_escape_string($mysqli, $_POST["raceName"]);
    $filter = " AND r.RaceName= '$raceName'";
    $query .= $filter;
} 

说明:

  1. 如果没有或您的 if 条件为 true,则您的查询将是您最初的查询 WHERE 1=1 所遵循的任何内容,这与没有它完全相同第一名
  2. 如果您的任何条件为真,则为:

    INITIAL_QUERY WHERE 1=1 AND CONDITION_N

  3. 如果多个条件成立,则为:

    INITIAL_QUERY WHERE 1=1 AND CONDITION_N AND CONDITION_N+1

这使您的 PHP 代码更干净、更快,因为您不必检查它是否是第一个条件来决定是使用 WHERE 还是 AND当附加到您的 select 语句时

关于php - 在另一个字符串中的某个单词之前插入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562126/

相关文章:

javascript - 使用ajax分配外部变量

php - 如何在 PHP 中按字母顺序比较 2 个字符串?

mysql - 未定义 PlatformTransactionManager 类型的合格 bean,仅当它不在内存中时才会发生错误

Mysql - 存储过程不使用查询缓存

php - SQL语句冲突

php - Magento 添加到购物车/客户登录在复制到新域后隐藏

php - 有没有等同于php的curl_getinfo的python库?

php - 如果不匹配,Mysql Count 返回零

mysql - 更改mysql中的表单元格数据

php - Laravel 自动删除过去日期的表记录