【问题标题】:Advanced Search with PHP, AJAX and MYSQL使用 PHP、AJAX 和 MYSQL 进行高级搜索
【发布时间】:2017-06-02 14:09:05
【问题描述】:

我正在创建一个高级搜索,用户可以在其中选择(html 选择)一个类别(使用GROUP BYHAVING 过滤结果),然后他们可以输入输入以使用LIKE 查找结果在数据库中有多个列。

我没有收到任何错误,但是没有返回正确的数据 select(html) 返回不相关的结果并且输入没有返回任何内容,因此,我很确定问题出在 Candidate_search.php 中的 SQL 查询

HTML:

<form action="" class="serach_form" method="post">
    <select id="" name="cv_category" class="cv_category">
        <option value="category1">category 1 </option>
        <option value="category2">category 2</option>
    </select>
    <input type="search" class="search_input" placeholder="Search" />
</form>

AJAX:

$('.serach_form').change(function() {
    var $search_input = $('.search_input').val();
    var $cv_category = $('.cv_category').val();
    var url = "candidate_search.php";
    $.ajax({
        //create an ajax request to load_page.php
        type: "POST", 
        url: url, 
        data:{
            search_input: $search_input, cv_category: $cv_category
        },  
        dataType: "html",   //expect html to be returned                
        success: function(date) {
            $('#search_data').html(date);
        }
    })
});

PHP: (candidate_search.php)

<?php 
include 'db_connect.php';
$search_input = $_POST['search_input'];
$cv_category = $_POST['cv_category'];
if(isset($search_input) || (isset($cv_category))){
    $sql = $dbh->prepare("SELECT * FROM candidates_table WHERE full_name LIKE :search_input AND phone_number LIKE :search_input AND email_address LIKE :search_input AND id LIKE :search_input GROUP BY cv_category HAVING :cv_category");
    $sql->bindValue(':search_input', '%' . $search_input . '%', PDO::PARAM_STR);
    $sql->bindValue(':cv_category', '%' . $cv_category . '%', PDO::PARAM_STR);
    if($sql->execute()) {
        $sql->setFetchMode(PDO::FETCH_ASSOC);
    }
    while($row = $sql->fetch()) { 
        // Do something ..... //
    } // End of whileloop //
} // end of isset // ?>

【问题讨论】:

  • 嗨,鲍勃,因为您使用的是 ajax,您是否正在回显输出?
  • @NishantNair 抱歉,我刚刚看到您的评论,我正在将数据返回到关于 AJAX 成功功能的 div 中。在 while 循环中,我有 html 结构,并且在其中我在 php 中回显数据。

标签: php mysql ajax select


【解决方案1】:

搜索查询应始终使用OR 运算符,如下所示:

$sql = $dbh->prepare("SELECT * FROM candidates_table WHERE full_name LIKE :search_input OR phone_number LIKE :search_input OR email_address LIKE :search_input OR id LIKE :search_input GROUP BY cv_category HAVING :cv_category");

【讨论】:

  • 这条sql语句不保存使用。 SQL注入很容易完成
  • @NishantNair 我没有添加任何 SQL 注入保护,我只是在正确地进行查询。
  • @Pathik Vejani 我之前尝试过OR,但结果相同。
  • @bob 只需在 mysql 中尝试该查询,看看是否是您想要的结果?您还需要回显输出。
  • @Pathik Vejani 我现在试过了,以防万一。和相同的结果。
【解决方案2】:

首先可以尝试调试步骤:

首先使用 var_dump(name_of_variable) 进行调试;死();

从浏览器接收值,如果没问题,你的请求

  • 尝试直接在MySQL中执行看看结果
  • 调试您的 PDO 准备和绑定值
  • 并且您的请求应使用 OR 而非 AND 之类的条件

    • SELECT * FROM candidates_table WHERE full_name LIKE :search_input OR phone_number LIKE :search_input OR email_address LIKE :search_input OR id LIKE :search_input GROUP BY cv_category HAVING :cv_category

不要忘记返回 JSON 或 XML 而不是数组(抛出错误)。

希望对你有帮助!

【讨论】:

    【解决方案3】:

    我假设full_namephone_number 是文本字段? 当你可以做等于时,你为什么使用like

    SELECT * FROM candidates_table WHERE full_name = :search_input OR phone_number = :search_input OR email_address = :search_input OR id = :search_input GROUP BY cv_category HAVING :cv_category"
    

    还有你为什么使用HAVING? HAVING 子句用于对总和或平均值等聚合查询进行过滤。我不认为你想要那个。

    如果您只想在搜索词与数据库中的值完全相等时获取值,那么我建议您使用= 而不是like

    查看 javascript,我可以看到您希望在每次表单更改时不断查找。您还想进行部分文本匹配。在这种情况下,您应该使用通配符来匹配该值。在搜索词前后使用%。如果搜索字符串是数据库中值的子字符串,它将返回结果。

    另外,我会用 and 操作替换 have 查询。请检查以下代码:

    这里是查询:

    我会使用这个查询而不是你正在使用的那个。

    "SELECT * FROM candidates_table WHERE (full_name like '%:search_input%' OR phone_number = '%:search_input%' OR email_address = '%:search_input%' OR id = '%:search_input%') AND cv_category = :cv_category"
    

    PS:我还建议您探索 MySQL 以外的其他数据源。 MySQL 中的like 查询很慢。

    ----编辑----

    <?php 
    include 'db_connect.php';
    $search_input = $_POST['search_input'];
    $cv_category = $_POST['cv_category'];
    if(isset($search_input) || (isset($cv_category))){
        $sql = $dbh->prepare("SELECT * FROM candidates_table WHERE (full_name like '%:full_name%' OR phone_number = '%:phone_number%' OR email_address = '%:email_address%' OR id = '%:id%') AND cv_category = :cv_category"
    );
        $sql->bindValue(':full_name', '%' . $search_input . '%', PDO::PARAM_STR);
        $sql->bindValue(':phone_number', '%' . $search_input . '%', PDO::PARAM_STR);
        $sql->bindValue(':email_address', '%' . $search_input . '%', PDO::PARAM_STR);
        $sql->bindValue(':id', '%' . $search_input . '%', PDO::PARAM_STR);
        $sql->bindValue(':cv_category', '%' . $cv_category . '%', PDO::PARAM_STR);
        if($sql->execute()) {
            $sql->setFetchMode(PDO::FETCH_ASSOC);
        }
        while($row = $sql->fetch()) { 
            // Do something ..... //
        } // End of whileloop //
    } // end of isset // ?>
    

    【讨论】:

    • 我在绑定值时正在做%,谈论绑定值我会有多少,技术上我只有两个变量,但我不止一次使用一个。但是mysql不喜欢两个。我得到`无效的参数号`错误
    • 为什么要用同名绑定呢?
    • search_input 正在遍历多个列以查找匹配项。
    • 检查编辑。所有参数都绑定到同一个变量。
    • 我仍然收到Invalid parameter number: number of bound variables does not match number of tokens的相同错误消息
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多