2013-04-06 3 views
0

Я пытаюсь использовать подготовленные команды mysqli с запросом оператора LIKE и подстановочными операторами. После того, как отладка будет разбрызгиваться выражениями echo по всему коду, я вижу, что оператор while while не выполняется. Вы видите, что я здесь делаю неправильно?mysqli_fetch_array(), подготовленный оператор и оператор LIKE

Это мой первый вопрос на этом форуме, поэтому я приношу свои извинения, если это не очень хороший вопрос; Я потратил 6 часов, пытаясь заставить подготовленный раздел инструкций моего кода работать, и я не могу найти нити, затрагивающие мой вопрос, которые не полностью перевернуты над моей головой (например, How can I put the results of a MySQLi prepared statement into an associative array?). Двумя ближайшими мной были:

Using wildcards in prepared statement - MySQLi и Combine PHP prepared statments with 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

Я использовал MySQLi раньше, но превращение его в массивы было довольно сложной задачей. Если вы только начинаете программу, я предлагаю изучить PDO, поскольку он делает массивы и извлекает информацию намного проще, чем MySQLi. MySQLi_STMT просто ... Неполный, похоже, что он был оставлен на полпути. – Rujikin

+0

«Я вижу, что мой оператор while не выполняет» - любые сообщения об ошибках? – sectus

+0

Да, это не очень хороший вопрос. Просто * смотреть * код не путь. Код должен быть * run * вместо этого. И вы должны разделить свои цели, делая не все сразу. Сначала отсортируйте содержимое с помощью подготовленных инструкций, а затем перейдите к LIKE или к какому-либо другому конкретному запросу. И да - если вы не хотите тратить свое время, [** переходите к PDO **] (http://stackoverflow.com/tags/pdo/info), пока не опоздаете –

ответ

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 

Я надеюсь, что вы правильно продезинфицировать переменную $ заказа. Лучше всего было бы, по-видимому, чтобы добавить его через заполнитель, поэтому вам потребуется библиотека, которая позволяет, 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 вызовов вы используя на данный момент

+0

'get_result' придирчив, где ему нравится работать. Благодарим вас за хороший ответ, по сравнению с другими. – Jon

-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))

Edit:

 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>"; 
     } 
+0

['mysqli_stmt_fetch'] (http://www.php.net/manual/en/mysqli-stmt.fetch.php) не имеет возврата значение, основанное на привязанных параметрах. Пожалуйста, прочитайте ссылку. – Jon

+0

@Jon Я отредактировал свой ответ – Amir

0

@ Ваш общий смысл. Вы видите, что нет необходимости в allenbell_nc для «... просто избавиться от всего этого беспорядка и использовать PDO», как вы поняли. Просто потому, что вы получили ошибочное представление о расширении mysqli с подготовленными заявлениями, это не значит, что другие должны покончить с этим при малейшем намеке на неприятности, а не на выполнение глубоких, но болезненных исследований. В конце концов, вот что такое stackoverflow, не так ли? хорошо изученные ответы.

@allenbell_nc - Чтобы ответить на ваш вопрос, я не думаю, что ваша проблема связана с использованием Wild-карточек и прочего. Проблема заключается в вашей строке кода, где вы пытаетесь использовать mysqli_fetch_array(). Это, скорее всего, вызовет ошибку, жалуясь на параметр 1 ($ result), потому что mysqli_stmt_store_result() используется в тех случаях, когда вы хотите позже найти количество строк, возвращаемых из запроса, поэтому оно возвращает логическое значение (true или false) и NOT a результат набор.

ВМЕСТО, используйте mysqli_stmt_bind_result() после выполнения вызова затем вызвать mysqli_stmt_fetch() в состоянии в то время, прежде чем, наконец, используя array_push() в то время как состояние тела, которое поможет вам сохранить и впоследствии эхо из содержимого вашего массива ассоциативных.

Быстрый пример (идея при условии, г-н Карсон 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']; 
    } 
    } 

...

Надежда, что помогает, GOODLUCK к вам - в первый раз Аскер, так как это также мой первый раз ответ - на ваш проект.

+0

Это просто неприемлемый подход. это полезно для глупого примера, но непригодного для использования в реальной жизни. что, если вам не нужно одиночное $ user_id, а строка из 10 столбцов? что, если вы создаете метод абстракции и ** не знаете, какие значения были вообще возвращены? ** –

+0

то же самое с привязкой к произвольному количеству переменных. mysqli не является «ошибочным». это просто непригодно –

+0

@ user1676047 - спасибо за предложение! Я дам ему попробовать. –