0

LIKE ステートメントのクエリとワイルドカード演算子を使用して、mysqli の準備済みステートメントを使用しようとしています。デバッグ後、コード全体に echo ステートメントを振りかけると、while ステートメントが実行されていないことがわかります。ここで私が間違っていることがわかりますか?

このフォーラムで質問するのはこれが初めてなので、これが適切な質問でない場合は申し訳ありません。コードのプリペアドステートメント セクションを機能させるために 6 時間を費やしましたが、私の質問に対処するスレッドが見つかりません。連想配列へのステートメント? )。私が見つけた最も近い2つは次のとおりです。

準備済みステートメントでのワイルドカードの使用 - 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 に答える
-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 に答える