PHP, если постановка задачи - PullRequest
1 голос
/ 18 июня 2009

Для приведенного ниже кода я пытаюсь использовать оператор IF

если (mysql_num_rows ($ RESA)> 0)

чтобы избежать запуска цикла foreach, если $ entry не находится в столбце "site" в какой-либо таблице в моей базе данных. Однако, если $ entry не существует в столбце «site» в какой-либо таблице в моей базе данных, я получаю сообщение об ошибке «Внимание: неверный аргумент, предоставленный для foreach ()». Есть идеи, почему он это делает?

Заранее спасибо,

John

$result = mysql_query("SHOW TABLES FROM feather") 
or die(mysql_error()); 

while(list($table)= mysql_fetch_row($result))
{
  $sqlA = "SELECT COUNT(*) FROM `$table` WHERE `site` LIKE '$entry'";

  $resA = mysql_query($sqlA) or die("$sqlA:".mysql_error());
  list($isThere) = mysql_fetch_row($resA);
  $isThere = intval($isThere);
  if ($isThere)
  {
     $table_list[] = $table;
  }

}

if(mysql_num_rows($resA)>0){
foreach ($table_list as $table) { 
    $sql = "SELECT votes_up FROM `$table` WHERE `site` LIKE '$entry'"; 
    $sql1 = mysql_query($sql) or die("$sql:".mysql_error());
   while ($row = mysql_fetch_assoc($sql1)) {
       $votes[$table] = $row['votes_up'];
       $sum += $row['votes_up'];
   } 

}
}
else{
print "";
}

Ответы [ 2 ]

7 голосов
/ 18 июня 2009

Хорошая идея инициализировать переменные:

$table_list = array(); // <-- Initialize variable.
while (list($table) = mysql_fetch_row($result)) {
    /* ... */
    $table_list[] = $table;
    /* ... */
}

if (mysql_num_rows($resA) > 0) {
    foreach ($table_list as $table) { 
        /* ... */
    }
}

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

Причина, по которой записи не были добавлены в $table_list, заключается в том, что количество всех выбранных таблиц было равно нулю.

0 голосов
/ 18 июня 2009

Инициализация переменных хороша, хотя вы также можете просто проверить массив, прежде чем попадете в цикл foreach:

if (is_array($table_list))
foreach ($table_list as $table) {
  ...
}

Целесообразно проверить это перед любым циклом foreach, который может быть передан не в массиве. PHP строг в требовании массива в foreach (хотя во многих других местах он довольно слабый). Я всегда думал, что было бы лучше, если бы он рассматривал что-либо еще (например, строку) как пустой массив, следовательно, вообще не зацикливаясь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...