我正在尝试在SQL中进行搜索查询,使用AJAX将div标记更改为搜索结果。但是,我无法使用stmt binding params(为了安全性)运行查询。通过打印变量我发现所有部分都在工作,但我认为params没有正确搜索,或者get_result使用不正确。我说的原因是,当在while循环中打印时,输出总是"()"。顺便说一下,它所从的表格超过20列
请参阅以下代码:
<?php
$q = $_GET['q'];
$con = mysqli_connect('localhost','user','password','my_db');
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$stmt=$con->prepare("SELECT * FROM Contacts WHERE firstGroup=? OR secondGroup=? OR thirdGroup=?");
$stmt->bind_param("sss", $q, $q, $q);
if($stmt->execute()){
$stmt->bind_result($name, $code);
while ($stmt->fetch()) {
printf ("%s (%s)\n", $name, $code);
}
}else{
echo "Didn't work";
}
任何帮助都将受到高度赞赏!
答案 0 :(得分:2)
请避免使用&#34;选择*&#34;。 你会遇到这个问题。
相反,请使用
$stmt=$con->prepare("SELECT `name`,`code` FROM Contacts WHERE firstGroup=? OR secondGroup=? OR thirdGroup=?");
这个问题应该解决。 如果您希望更改选定的列更容易,请参阅php.net上的this comment以获取使用数组并为每个元素调用bind_result。 然后,您可以轻松地将查询更改为
$colums=Array("name","code","firstGroup");
$stmt=$con->prepare("SELECT `".implode("`,`",$columns)."` FROM Contacts WHERE firstGroup=? OR secondGroup=? OR thirdGroup=?");
配置所选列非常容易,同时避免上述问题(在这种情况下,添加&#34; firstGroup&#34;)。
答案 1 :(得分:1)
在tillz的推荐下,我在DBMS中尝试了几个命令。我最终发现正确的SQL运算符实际上是“LIKE”运算符。
下面给出了正确的PHP代码:
<?php
$q = $_GET['q'];
$con = mysqli_connect('localhost','user','password','my_db');
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$stmt=$con->prepare("SELECT * FROM Contacts WHERE firstGroup LIKE ? OR secondGroup LIKE ? OR thirdGroup LIKE ?");
$stmt->bind_param("sss", $q, $q, $q);
if($stmt->execute()){
$stmt->bind_result($name, $code);
while ($stmt->fetch()) {
printf ("%s (%s)\n", $name, $code);
}
}else{
echo "Didn't work";
}