如何使用来自 Ajax 变量的 PHP PDO 处理许多 WHERE 子句

Posted

技术标签:

【中文标题】如何使用来自 Ajax 变量的 PHP PDO 处理许多 WHERE 子句【英文标题】:How to handle many WHERE clause with PHP PDO that comes from Ajax variable 【发布时间】:2016-11-28 18:26:01 【问题描述】:

我在使用 PDO php 处理多 WHERE 子句时遇到问题。我的 Ajax 代码发送两个变量,一个用于实时搜索的输入文本,一个用于下拉菜单。这是我的代码。

Ajax 代码:index.php

<p style="text-align: center">Enter your search here: <input type="text" id="search" name="search" placeholder="Enter your search here">&nbsp;&nbsp;
Select education level: <select id="edulevel">
<option value="PHD">PHD</option>
<option value="MASTER">MASTER</option>
<option value="DEGREE">DEGREE</option></select></p>    
<div id="contentBox" class="login, reminder" style="margin:0px auto; width:95%; overflow-y: auto; height:304px;">


<div id="result" class="login"></div>
<script type="text/javascript">

    /*
    setInterval(function()
        //alert('Refreshing database');
        $("#result").load("res.php", "update=true").fadeIn("slow").text("Refreshing Database");
    , 10000);
    */


    function update() 
        $.ajax(
            url: 'userres.php',
            dataType: 'text',
            success: function(data) 
                if (parseInt(data) == 0) 
                    $("#result").css( color: "red" ).text("offline");
                 else 
                    $("#result").css( color: "green" ).text("online");
                
            
        );    // properly end the ajax() invocation
    


    function ajaxSearchUpdater()
        $("#result").show();
        var x = $("#search").val();
        var y = $("#edulevel").val();
        $.ajax(
            type:'POST',
            url:'userres.php',
            data:'q='+x+'&e='+y,
            cache:false,
            success:function(data)
                $("#result").html(data)
            
        );
    

    $(document).ready(function(e) 
        ajaxSearchUpdater();               // fires on document.ready
        $("#search").keyup(function() 
            ajaxSearchUpdater();           // your function call
        );
        $("#edulevel").click(function() 
            ajaxSearchUpdater();           // your function call
        );
    );
</script>

对于我的php和数据库代码:userres.php

//print_r($_GET);
$q=$_POST['q'];
if(isset($_POST['e']))
    $e=$_POST['e'];
    echo $q;
    echo $e;



$query="SELECT *
            FROM viewlibrary
            WHERE 
                studentname LIKE :q OR
                matricno LIKE :q OR
                title LIKE :q OR
                education_level LIKE :q OR
                programme LIKE :q OR
                serialno LIKE :q OR
                education_level = :e
            ORDER BY studentname ASC";

$stmt = $db->prepare($query); 
$stmt->bindValue(':q','%'.$q.'%');
$stmt->bindValue(':e',$e, PDO::PARAM_STR);
$stmt->execute();

$a = 0; 

if($stmt->rowCount() > 0)
    $r=$stmt->fetchAll();
    echo "<table class='tablesorter' id='myTable' style='width:97%; table-border: 1'>";
        echo "<thead>";
        echo "<tr>";
        echo "<th>No.</th>";
        echo "<th>No.Matric</th>";
        echo "<th>Name</th>";
        echo "<th>Programme</th>";
        echo "<th>Title</th>";
        echo "<th>Education Level</th>";
        echo "<th>Serial Number</th>";
        echo "<th>Availability</th>";
        echo "</tr>";
        echo "</thead>";
        echo "<tbody>";

    foreach($r as $row)

            echo "<tr align='center'><td>". ($a+1) ."</td><td>". $row['matricno'] ."</td><td>". $row['studentname'] ."</td><td>". $row['programme'] ."</td><td>". $row['title'] ."</td><td>". $row['education_level'] ."</td><td>". $row['serialno'] ."</td><td>". $row['bavailable'] ."</td></tr>";
            $a++;
            //echo $row['education_level'];
    
    echo "</tbody>";
    echo "</table>";

else
    echo "<p align='center'>Nothing to show you :( I am really sorry for this T_T </p>";



?>

这里的问题是我想让我的表格显示仅具有合适教育水平的数据列表,即“学位”、“硕士”、“博士”,这取决于用户的下拉选择。我确实回显了来自 ajax 的变量,它显示了我点击的内容,但我似乎无法找到处理这些查询的方法。大多数 WHERE 条件用于实时搜索,我想知道如何为下拉列表设置条件。

【问题讨论】:

你不能多次使用同一个占位符!! @Saty 嗯,占位符是什么意思?你指的是html占位符吗? :q:e 是占位符。您是否考虑过使用全文搜索? dev.mysql.com/doc/refman/5.7/en/fulltext-search.html 哦,我不知道 :( 那么我想如何使用我的下拉变量进行查询? @chris85 我以前没听说过,也不知道怎么用。 【参考方案1】:

我认为您应该按照用户选择的教育级别进行搜索。

SELECT *
FROM viewlibrary
WHERE 
    education_level = :e AND 
    (studentname LIKE :q1 OR
    matricno LIKE :q2 OR
    title LIKE :q3 OR
    education_level LIKE :q4 OR
    programme LIKE :q5 OR
    serialno LIKE :q6)
ORDER BY studentname ASC

也不要尝试在单个 SQL 语句中两次使用相同的命名参数,例如

<?php 
$sql = 'SELECT * FROM some_table WHERE  some_value > :value OR some_value < :value'; 
$stmt = $dbh->prepare($sql); 
$stmt->execute( array( ':value' => 3 ) ); 
?> 

这将不返回任何行且不返回错误——您必须使用每个参数一次且仅一次。由于可移植性问题,显然这是预期的行为(根据此错误报告:http://bugs.php.net/bug.php?id=33886)。

【讨论】:

以上是关于如何使用来自 Ajax 变量的 PHP PDO 处理许多 WHERE 子句的主要内容,如果未能解决你的问题,请参考以下文章

在第 256 个字符处截断数据 - PHP 与 HFSQL 数据库,使用 PDO ODBC 试点

pdo-php-javascript (ajax) 的简单引号转义问题

更新选择列表而不刷新 [PDO/PHP/AJAX]

AJAX/PDO 冲突 (PHP/MySQL)

如何在foreach循环中显示来自PDO的数据

在 PHP 中使用来自 AJAX 请求的 JSON 字符串 [关闭]