如何使用来自 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">
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 试点