Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP数组编写PDO搜索查询_Php_Mysql_Arrays_Pdo - Fatal编程技术网

从PHP数组编写PDO搜索查询

从PHP数组编写PDO搜索查询,php,mysql,arrays,pdo,Php,Mysql,Arrays,Pdo,我正在使用PHP7和到MySQL数据库的PDO连接构建一个应用程序 应用程序的一部分包含一个搜索表单,允许用户通过3个不同的字段搜索培训课程:课程类别、课程名称和日期 表单上的元素类型为: 课程类别-下拉列表,带有数字(整数)ID 课程名称-文本输入 日期-日期选择器(使用HTML5type=“Date”参数在浏览器中获取日历) 这些字段可以结合使用,也可以单独使用。这意味着用户可以搜索,例如,仅通过(1)、或(2&3)或全部(1&2&3)进行搜索 我编写了PHP来获取POST数据,现在它位于一

我正在使用PHP7和到MySQL数据库的PDO连接构建一个应用程序

应用程序的一部分包含一个搜索表单,允许用户通过3个不同的字段搜索培训课程:课程类别、课程名称和日期

表单上的元素类型为:

  • 课程类别-下拉列表,带有数字(整数)ID
  • 课程名称-文本输入
  • 日期-日期选择器(使用HTML5
    type=“Date”
    参数在浏览器中获取日历)
  • 这些字段可以结合使用,也可以单独使用。这意味着用户可以搜索,例如,仅通过(1)、或(2&3)或全部(1&2&3)进行搜索

    我编写了PHP来获取POST数据,现在它位于一个数组中-例如:

    $search_data = [
        'category' => 3,
        'name' => 'Hazard training',
        'date' => ''
    ]
    
    我想在PDO查询中使用它,但我不知道编写它的最佳方式是什么,因为(1)和(3)将是一个
    =
    查询条件,而(2)是一个类似
    。我的解决方案是循环搜索词,然后尝试构造一个查询,例如

    $sql = ' WHERE ';
    foreach ($search_data as $key => $value) {
        if ($key == 'category') {
            $sql .= ' category = ' . $value;
        }
        if ($key == 'course_name') {
            $sql .= ' course_name LIKE % ' . $value ' % ';
        }
        if ($key == 'date') {
            $sql .= ' date = ' . $value;
        }
    }
    
    问题是它无法工作,因为必须在PDO中绑定参数。它也不起作用,因为我找不到一种方法来获取每个查询之间的
    (如果有前面的语句)

    我现在很迷茫,不确定写这篇文章的最佳方式是什么

    任何帮助都将不胜感激


    编辑:我意识到对名称进行硬编码,例如,
    ($key=='course\u name')
    并不理想,但这只是因为不同的查询条件(
    =
    )。我假设人们可以将
    $search\u data
    多维化,以确定它是哪种类型的查询,但这超出了我最初的问题,可能也超出了另一篇文章的范围。

    这里有一个简单的解决方案:

    $sql = 'SELECT ..... FROM ... WHERE 1 ';
    $where = '';
    $pdoData = [];
    
    foreach ($search_data as $key => $value) {
        if(!$value) continue; // skip empty values
    
        if ($key === 'category') {
            $pdoData[':category'] = $value;
            $where .= ' AND category = :category ';
        }
        if ($key === 'course_name') {
            $pdoData[':course_name'] = '%'.$value.'%';
            $where .= ' AND course_name LIKE (:course_name) ';
        }
        if ($key === 'date') {
            $pdoData[':date'] = $value;
            $where .= ' AND date = :date ';
        }
    }
    
    $sql = $sql.$where;
    
    $stmt = $this->ci->db->prepare($sql);
    $stmt->execute($pdoData);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    您有一个存储绑定数据的
    $pdoDate
    数组。

    这里有一个简单的解决方案:

    $sql = 'SELECT ..... FROM ... WHERE 1 ';
    $where = '';
    $pdoData = [];
    
    foreach ($search_data as $key => $value) {
        if(!$value) continue; // skip empty values
    
        if ($key === 'category') {
            $pdoData[':category'] = $value;
            $where .= ' AND category = :category ';
        }
        if ($key === 'course_name') {
            $pdoData[':course_name'] = '%'.$value.'%';
            $where .= ' AND course_name LIKE (:course_name) ';
        }
        if ($key === 'date') {
            $pdoData[':date'] = $value;
            $where .= ' AND date = :date ';
        }
    }
    
    $sql = $sql.$where;
    
    $stmt = $this->ci->db->prepare($sql);
    $stmt->execute($pdoData);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    你有
    $pdoDate
    数组来保存绑定的数据。

    我喜欢
    其中的1
    ,这使得构造更容易。我会将
    课程名称部分更改为:
    $pdoData[':课程名称]='%$值“%”
    我认为
    LIKE%:course_name%
    不会按预期工作…如果($key==='category'&&&&!empty($value))我做了一些改进,您还需要在输入中转义任何
    %
    ,否则,这将更改搜索(您将无法搜索该字符,但会得到一个奇怪的搜索结果,因为任何额外的
    %
    都将被视为搜索模式的一部分)。我喜欢
    中的1
    ,这使得构造更容易。我会将
    课程名称
    部分更改为:
    $pdoData[':课程名称']='%'.$value.'%';
    我不认为
    像%:course_name%
    会像预期的那样工作…如果($key=='category'&&!empty($value)),请使用not empty如果($key==='category'&!empty($value)),我没有什么改进,您还需要在输入中转义任何
    %
    ,否则,这将改变搜索(您将无法搜索该字符,而是会得到一个奇怪的搜索结果,因为任何额外的
    %
    都将被视为搜索模式的一部分)。