php在stmt prepare和execute语句之后获取结果

时间:2014-07-15 23:23:26

标签: php mysql sql

我正在尝试在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";
}

任何帮助都将受到高度赞赏!

2 个答案:

答案 0 :(得分:2)

请避免使用&#34;选择*&#34;。 你会遇到这个问题。

  • mysqli仅在您为所有列执行bind_result时才有效。
  • 如果更改数据库,则必须编辑所有bind_result部分。
  • 性能较差。
  • 您无法查看哪些列绑定到哪些变量而无需查看数据库架构

相反,请使用

$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";
}