我试图使用与LIKE语句查询和通配符运营商mysqli的预处理语句。 调试可以洒在整个代码echo语句后,我可以看到我的while语句不执行。 你能看到我在做什么错在这里?
这是我第一次问的这个论坛,所以我道歉,如果这是不是一个好问题; 我花了6小时,试图让我的代码编写的语句部分工作,我无法找到任何线程解决我的问题不完全走在我的头上(例如, 我怎样才能把库MySQLi的结果准备声明为关联数组? )。 这两个最接近的,我发现是:
使用事先准备好的声明通配符-库MySQLi并结合PHP编写statments与LIKE 。
这里是我的代码的相关摘录:
//set up and execute queries
$titleQuery = "SELECT keyframeurl, videoid, title, creationyear, sound, color,
duration, genre FROM openvideo WHERE title LIKE CONCAT ('%', ?, '%')
ORDER BY $order";
if($stmt = mysqli_prepare($db, $titleQuery)){
//bind parameters
mysqli_stmt_bind_param($stmt, 's', $trimmedTitleSearch);
//execute query
mysqli_stmt_execute($stmt);
//bind results
mysqli_stmt_bind_result($stmt, $keyframeurl, $videoid, $title, $year, $sound,
$color, $duration, $genre);
//store result so num rows can be counted
$result = mysqli_stmt_store_result($stmt);
//fetch results
while ($row = mysqli_fetch_array($result, MYSQL_ASSOC)) {
echo "<tr>";
echo "<td><a href=\"".$row['keyframeurl']."\">".$row['videoid']."</a></td>";
echo "<td>" . $row['title'] . "</td>";
echo "<td>" . $row['year'] . "</td>";
echo "<td>" . $row['sound'] . "</td>";
echo "<td>" . $row['color'] . "</td>";
echo "<td>" . $row['duration'] . "</td>";
echo "<td>" . $row['genre'] . "</td>";
echo "</tr>";
}
}
else {
// Error
printf("Prepared Statement Error: %s\n", $db->error);
}
感谢您的任何意见!
你是混合2款获取的结果。 无论是用丑陋的方式bind_result(以及使用让您的数据fetch()
的话),或者尝试使用get_result()
-这样,你就可以使用fetch_array()
但不保证)。
不管怎么说,刚刚摆脱所有的烂摊子,并使用PDO。
$titleQuery = "SELECT keyframeurl, videoid, title, creationyear, sound, color,
duration, genre FROM openvideo WHERE title LIKE CONCAT ('%', ?, '%')
ORDER BY $order";
$stmt = $pdo->prepare($titleQuery);
$stmt->execute(array($trimmedTitleSearch));
$data = $stmt->fetchAll();
foreach ($data as $row ) {
// the rest is the same as yours
我希望你正确地过滤你的$ order变量。 最好的办法是显然它通过占位补充,所以,你需要一个库,允许它, SafeMysql例如:
$sql = "SELECT * FROM openvideo WHERE title LIKE CONCAT ?s ORDER BY ?n";
$data = $db->getAll($sql,"%$trimmedTitleSearch%", $order);
foreach ($data as $row ) {
// the rest is the same as yours
需要注意的代码量,并与生API的是负载比较呼叫您正在使用的那一刻
@Your常识 - 你看有没有必要allenbell_nc为“......刚刚摆脱所有的烂摊子,并使用PDO”像你这样的推断。 仅仅因为你已经得到了mysqli扩展与预处理语句的错误印象并不意味着其他人应该在的麻烦丝毫废除它,而不是进行深入而痛苦的研究。 毕竟,这是计算器左右,不是吗? 比较好的解答..
@allenbell_nc - 要回答你的问题,我不认为你的问题与你使用的外卡之类的东西做的。 问题就出在你的代码行试图利用mysqli_fetch_array()
这很可能会引发错误抱怨参数1($结果),因为mysqli_stmt_store_result()
在为以后要找到从查询返回的行数的情况下被使用,因此,它返回boolean值(true或false)和不是一个结果集。
相反,使用mysqli_stmt_bind_result()
的调用执行后,然后调用mysqli_stmt_fetch()
在while条件,最后使用前array_push()
的同时,身体条件,这将有助于您存储和随后回声出关联数组的内容。
一个简单的例子 (IDEA卡森McDonald先生@提供[http://www.ioncannon.net/programming/889/php-mysqli-and-multiple-prepared-statements/][1]):
...
$注释=阵列();
$comment_stmt->bind_param('i', $post_id);
if ($comment_stmt->execute())
{
$comment_stmt->bind_result($user_id);
while ($comment_stmt->fetch())
{
array_push($comments, array('user_id' => $user_id));
//Now you can go ahead and make use of $comments however you want, whether as stored in an $_SESSION array variable or just to echo it out! As Demonstrated Below:
$_SESSION = $comments;
echo $_SESSION['user_id'];
}
}
...
希望帮助,古德勒克给你 - 第一次提问者,因为这也是我第一次的答案 - 你的项目。
echo "<td>" . $row['color'] . "</td>";
echo "<td>" . $row['duration'] . "</td>";
echo "<td>" . $row['genre'] . "</td>";
echo "</tr>"; while ($row = mysqli_fetch_array($stmt, MYSQL_ASSOC))
或者, while ($row = mysqli_stmt_fetch($stmt))
编辑:
mysqli_stmt_bind_result($stmt, $keyframeurl, $videoid, $title, $year, $sound,
$color, $duration, $genre);
//store result so num rows can be counted
$result = mysqli_stmt_store_result($stmt);
//fetch results
while (mysqli_stmt_fetch($stmt)) {
echo "<tr>";
echo "<td><a href=\"".$keyframeurl."\">".$videoid."</a></td>";
echo "<td>" . $title . "</td>";
echo "<td>" . $year . "</td>";
echo "<td>" . $sound . "</td>";
echo "<td>" . $color . "</td>";
echo "<td>" . $duration . "</td>";
echo "<td>" . $genre. "</td>";
echo "</tr>";
}