2016-05-19 3 views
-2

Ошибка, которую я получаю: Предупреждение: неверный аргумент, предоставленный foreach(), я прочитал соответствующий пост для случая foreach, но я до сих пор не знаю, как его исправить. Могу ли я узнать, что вызвать это предупреждение и как его исправить?ошибка в php - foreach

Вот мой код,

mysql_connect("localhost","psm","psm") or die("could not connect"); 
mysql_select_db("planner") or die ("could not find db!"); 

$output = ''; 
//collect 
if(isset($_POST['search'])) 
{ 
    $searchq =$_POST['search']; 
    $searchq = preg_replace("#[^0-9a-z]#i","",$searchq); 
    $query = mysql_query("select c.*,u.username from login_user u left join calendar c on c.user_id = u.user_id where u.matrix LIKE '{$searchq}'") or die ("could not search"); 
    $count = mysql_num_rows($query); 
    if ($count == 0){ 
    $output = 'There are no search result!'; 
    } else { 
    while($row = mysql_fetch_array($query)){ 
     $searchq = []; 
     $searchq[] = $row; 
     } 
} 
} 
    foreach($searchq as $u) { 
?> 
     <div class="well" align="left" width="65%" > 
     <fieldset> 
     <table> 
      <tr><th>Matrix No: 
      <?php echo $query['matrix']; ?> 
      <?php foreach($query as $c){ 
        if($c['user_id'] == $u['user_id']){ 
         if($c['cate'] == 0){ 
          echo "<p style='background: red;'>Course Name : "; 
         }else{ 
          echo "<p>Title : "; 
         } 
      ?> 
        <?php echo $c['title']; ?></p> 
        <p>Description :<?php echo $c['description'];?></p> 
        <p>Location : <?php echo $c['location'];?></p> 
        <p>Start Time : <?php echo date('Y-m-d',$c['starttime']);?></p> 
        <p>End Time : <?php if($c['endtime'] != 0)echo date('Y-m-d',$c['endtime']);?></p> 
      <?php }}?> 
     </th></tr> 
     </table> 
     </div> 

<?php  
    } 
?> 
+4

Во-первых, вы не определяете '$ searchq', если (то, что я ожидаю есть) форма не отправляется. Во-вторых, если он был отправлен, но нет строк, '$ searchq' является строкой вместо массива. В-третьих, вы обходите результаты, но вы получите только один результат, когда вы перезагружаете '$ searchq' в пустой массив на каждой итерации. –

+0

Я не совсем уверен ... о том, что нет ни одной строки. Может ли это быть более конкретным? – Alice

+0

I.e. 'if ($ count == 0) {' если это возвращает true. –

ответ

0

Хорошо, у вас есть много проблем здесь.

Во-первых, не используйте функции mysql_, поскольку они устарели с PHP 5.5 и удалены в 7.0. Используйте вместо этого функции mysqli_ или PDO.

Во-вторых, если у вас ничего нет в $_POST['search'], то $searchq никогда не инициализируется, и у вас нет ничего для вашего цикла foreach.

Вторая половина, если вы передаете $_POST['search'], но результаты не найдены, у вас есть $searchq как строка, поэтому, когда он попадает в цикл foreach, это не то, что может использовать foreach. (Честно говоря, ваши переменные не должны делать двойную работу, как, что, где у вас есть $searchq в виде строки в preg_replace, а затем использовать его как массив, если есть результаты поиска.)

В-третьих, при использовании mysqli_query() (как вам нужно), это требует двух параметров. Это называется использованием

$results = mysqli_query($connection, $statement); 

В-четвертых, вы переинициализация $searchq в каждом проходе через цикл.

Итак, вы, возможно, не получаете никаких результатов, поэтому цикл while может никогда ничего не делать, и поэтому $searchq не является массивом, который можно перебирать с помощью foreach.

Что вам нужно сделать, это инициализировать $searchq перед вашим запросом, поэтому у вас есть пустой массив, так что, когда вы переходите к своему foreach, у вас есть хотя бы пустой массив.

В основном, выше вашего Еогеасп, вы должны иметь

if(!empty($searchq) && is_array($searchq)) 
{ 
    foreach(...) 
} 

или переместить Еогеасп внутри еще инструкции после цикла.

+1

Ваша вторая часть неверна. –

+0

Исправлено. mysqli_query требует два параметра. –

+2

Вы исправили его для mysqli, но OP не использует mysqli (даже если они должны), поэтому все равно не прав imo. –