0

我正在尝试将 mysqli 准备好的语句与 LIKE 语句查询和通配符运算符一起使用。在调试完代码中的 echo 语句后,我可以看到我的 while 语句没有执行。你能看到我在这里做错了什么吗?

这是我第一次在这个论坛上提问,如果这不是一个好问题,我很抱歉;我花了 6 个小时试图让我的代码的准备好的语句部分工作,但我找不到任何线程来解决我的问题,这些问题并没有完全超出我的想象(例如,我怎样才能准备好 MySQLi 的结果声明成关联数组?)。我找到的最接近的两个是:

在准备好的语句中使用通配符 - MySQLi 和将PHP 准备好的语句与 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);
    }

感谢您的任何建议!

4

3 回答 3

1

您正在混合 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 调用负载进行比较

于 2013-04-06T04:02:35.627 回答
0

@您的常识-您会看到,allenbell_nc 没有必要像您推断的那样“……摆脱所有混乱并使用PDO”。仅仅因为您对带有准备好的语句的 mysqli 扩展有一个错误的印象,并不意味着其他人应该在稍有麻烦的情况下就取消它,而不是进行深入但痛苦的研究。毕竟,这就是 stackoverflow 的意义所在,不是吗?精心研究的答案..

@allenbell_nc - 要回答您的问题,我认为您的问题与您使用通配符之类的东西无关。问题在于您尝试使用 mysqli_fetch_array(). 这很可能会引发抱怨参数 1 ($result) 的错误,因为mysqli_stmt_store_result()用于稍后查找查询返回的行数的情况,因此它返回布尔值(true 或 false)而不是结果放。

INSTEAD,mysqli_stmt_bind_result()在执行调用之后使用,然后mysqli_stmt_fetch()在 while 条件中调用,最后array_push()在 while 条件主体中使用,这将帮助您存储并随后回显您的 ASSOCIATIVE 数组的内容。

一个简单的例子(Carson McDonald 先生提供的想法@[http://www.ioncannon.net/programming/889/php-mysqli-and-multiple-prepared-statements/][1]):

...
$comments = array();

  $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'];
    }
  }

...

希望对您有所帮助,祝您好运-第一次提问,因为这也是我的第一次回答-您的项目。

于 2013-04-15T08:48:24.900 回答
-1
            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>";   
        }
于 2013-04-06T03:52:27.613 回答