PHP、AJAX、MySQL 的复选框过滤以及 AND/OR 之间的切换

Posted

技术标签:

【中文标题】PHP、AJAX、MySQL 的复选框过滤以及 AND/OR 之间的切换【英文标题】:PHP, AJAX, checkbox filtering for MySQL, and switching between AND/OR 【发布时间】:2014-12-21 21:04:02 【问题描述】:

我正在尝试使用复选框来过滤搜索结果。在SELECT 查询中,ANDOR 都需要使用,具体取决于选中的复选框数量和哪些复选框。这是 html

        <table>
            <tr>
                <th>Filter Results</th>
            </tr>
            <tr>
                <td>By chipset manufacturer:</td>
                <td><input name="by_amd" id="amdF" type="checkbox" value="1" />AMD</td>
                <td><input name="by_ati" id="atiF" type="checkbox" value="2" />ATI</td>
                <td><input name="by_nvid" id="nvidiaF" type="checkbox" value="3" />nVidia</td>
            </tr>
            <tr>
                <td>By year released:</td>
                <td><input name="by_2014" id="2014F" type="checkbox" value="2014" />2014</td>
                <td><input name="by_2013" id="2013F" type="checkbox" value="2013" />2013</td>
                <td><input name="by_2012" id="2012F" type="checkbox" value="2012" />2012</td>
                <td><input name="by_2011" id="2011F" type="checkbox" value="2011" />2011</td>
            </tr>
        </table>

还有 php

// create base SELECT query
        $select = 'SELECT GPUProductName, GPUChip, GPUReleaseDate, GPUBus, GPUMemory, GPUClock, GPUMemClock, GPUAddStats'; 
        $from = ' FROM GPU'; 
        $where = ' WHERE TRUE'; 
        // create search filters
        $opts = isset($_POST['filterOpts']) ? $_POST['filterOpts'] : array('');
        // By chipset manufacturer
        if (in_array("by_amd", $opts))
          $where .= " AND CMid = 1";
        

        if (in_array("by_ati", $opts))
          $where .= " AND CMid = 2";
        

        if (in_array("by_nvid", $opts))
          $where .= " AND CMid = 3";
        
        // by release year
        if (in_array("by_2014", $opts))
          $where .= " AND YEAR(GPUReleaseDate)='2014'";
        
        // build complete SELECT query
        $query = $select . $from . $where;
        return $query;

如果您选择“by ATI”和“by AMD”,则 SELECT 语句应分别为 WHERE CMid = 2 OR CMid = 1。如果您随后添加“到 2014 年”,则 SELECT 语句应为 WHERE YEAR(GPUReleaseYear) = 2014 AND CMid = 2 OR CMid = 1。基本上,从同一类别(可以这么说)中挑选的过滤器应该用 OR 连接,从不同类别中挑选的过滤器应该用 AND 连接。在 PHP 中,我如何根据从相同和/或不同类别中选中的复选框来创建正确的 SELECT 语句?

【问题讨论】:

只是所有 AND 在 cmid 到 OR 它应该按预期工作。 WHERE TRUE OR cond1 OR cond2 OR cond3 AND year .. 都需要正确。 它没有,因为语句读取WHERE TRUE OR CMid = 1 OR CMid = 2。这意味着无论使用什么过滤器,它都会从表中提取所有内容。 OR 语句应放在括号内,例如; WHERE (CMid=1 OR CMid=2) AND (YEAR(GPUReleaseYear)=2014 OR YEAR(GPUReleaseYear)=2012) 【参考方案1】:
$query = 'SELECT GPUProductName, GPUChip, GPUReleaseDate, GPUBus, GPUMemory, GPUClock, GPUMemClock, GPUAddStats FROM GPU WHERE '; 

$manufacturers=array();
if(isset($_POST['by_amd']) $manufacturers[]="CMid=1";
if(isset($_POST['by_ati']) $manufacturers[]="CMid=2";
if(isset($_POST['by_nvid']) $manufacturers[]="CMid=3";
$query.='('.implode(' OR ',$manufacturers).')';

$query.=' AND ';

$years=array();
if(isset($_POST['by_2014']) $years[]="YEAR(GPUReleaseDate)=2014";
if(isset($_POST['by_2013']) $years[]="YEAR(GPUReleaseDate)=2013";
if(isset($_POST['by_2012']) $years[]="YEAR(GPUReleaseDate)=2012";
if(isset($_POST['by_2011']) $years[]="YEAR(GPUReleaseDate)=2011";
$query.='('.implode(' OR ',$years).')';

return $query;

【讨论】:

当然,您必须确保(例如使用 javascript)在一组制造商/年中至少选中一个复选框。 是的,我的 jQuery 和 AJAX 工作得很好,这是我遇到问题的 PHP。谢谢! 另外,我应该清理这些输入吗?我知道它们是用于复选框的,并且没有数据被插入到数据库中,但只是为了安全起见? 不,没有消毒复选框!如果设置了复选框,则发送值“开”,如果未设置复选框 - 则不发送任何内容(多次出现问题)。所以检查 isset($_POST['checkboxname']) 就足够了。 我也是这么想的。为了采取额外的预防措施,我创建了一个新的 DB 用户,它无论如何都只有 SELECT 权限。我只需要尽量减少 XSS 攻击和 SQL 注入。谢谢!

以上是关于PHP、AJAX、MySQL 的复选框过滤以及 AND/OR 之间的切换的主要内容,如果未能解决你的问题,请参考以下文章

php过滤mysql多个复选框

复选框状态更改时如何更新mysql字段?使用 jquery (ajax)、php 和 mysql

尝试使用复选框将评论定义为私有或不私有。使用 AJAX 发布到 PHP MySQL

PHP MySQL & AJAX 搜索过滤器时间延迟

使用 AJAX 将复选框值 1 如果选中,如果不是 0 传递给 PHP

Laravel 复选框过滤器 ajax