За последние 24 часа нас посетили 17843 программиста и 1682 робота. Сейчас ищут 862 программиста ...

Ошибка: Invalid argument supplied for foreach()

Тема в разделе "PHP и базы данных", создана пользователем aleksb, 16 май 2011.

  1. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Помогите понять в чем ошибка:
    "Invalid argument supplied for foreach()"

    Вот код:

    PHP:
    1. <?php
    2. while ($row = mysql_fetch_array ($result))
    3.  
    4. {
    5.     $tmp = '';
    6.    
    7.    
    8.     foreach($row2[$row['invoice']] as $row3){
    9.     {
    10.     $tmp = $row3['FIELD_1'];
    11.         }
    12. }
    13.  
    14.  
    15.     echo '<tr><td>' . $row['invoice'] . '</td><td>' . $tmp . '</td></tr>';
    16.  
    17. }
    18. ?>
    Данные подставляются правильно, но сверху вот такая строка.
     
  2. Павел Хрушков

    Павел Хрушков Активный пользователь

    С нами с:
    12 май 2011
    Сообщения:
    34
    Симпатии:
    0
    Попробуцте так:
    PHP:
    1.  
    2. foreach($row2[$row]['invoice'] as $row3){
    3.  
     
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    aleksb

    откуда взялась переменная $row2 ?
     
  4. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    $row2 отсюда:

    PHP:
    1.  
    2. <?php
    3. $result2 = mysql_query ("
    4. SELECT
    5.  sales.invoice,
    6.  SUM(sales.zakupka) AS FIELD_1,
    7.  SUM(sales.prodaga) AS FIELD_2,
    8.  sales.`date`
    9. FROM
    10.  sales
    11. WHERE
    12.  sales.pay <> 2
    13. GROUP BY
    14.  sales.invoice,
    15.  sales.`date`
    16. ",$db);
    17.  
    18. {
    19.  
    20. while ($val=mysql_fetch_assoc($result2))
    21.  
    22. {
    23.     $row2[$val['invoice']][] = $val;
    24. }
    25.  
    26.  
    27. }
    28.  
    29. ?>
     
  5. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    print_r($row2);die();

    И посмотри что за массив ты создал
     
  6. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    проверил, получается нужный массив. НО, если в базе нет данных для суммирования которое выполняется в условии запроса, то выскакивает эта ошибка. Если есть, пропадает. Только что проверял.
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    if (!empty($row2))
    {
    foreach($row2[$row['invoice']] as $row3){
    {
    $tmp = $row3['FIELD_1'];
    }
    }
     
  8. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Пробовал, все равно ошибка остается..
     
  9. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    поменяй
    if (!empty($row2))
    на
    if (is_array($row2))
     
  10. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Тоже самое. Ничего не произошло, ошибка на месте.
     
  11. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Не может быть. Покажи код, который получился
     
  12. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Это полный код.

    PHP:
    1. <?php
    2. $db = mysql_connect ("localhost","","");
    3. mysql_select_db ("auto-auto", $db) or die(mysql_error());
    4. $set_names = mysql_query("SET NAMES utf8", $db) or die(mysql_error());
    5. ?>
    6. <?php
    7. $result = mysql_query ("
    8. SELECT
    9. *
    10. FROM
    11.  sales
    12.  GROUP BY
    13.  sales.invoice
    14.  ",$db);
    15. ?>
    16. <?php
    17. $result2 = mysql_query ("
    18. SELECT
    19.  sales.invoice,
    20.  SUM(sales.zakupka) AS FIELD_1,
    21.  SUM(sales.prodaga) AS FIELD_2,
    22.  sales.`date`
    23. FROM
    24.  sales
    25. WHERE
    26.  sales.pay <> 2
    27. GROUP BY
    28.  sales.invoice,
    29.  sales.`date`
    30. ",$db);
    31.  
    32. {
    33.  
    34. while ($val=mysql_fetch_assoc($result2))
    35.  
    36. {
    37.     $row2[$val['invoice']][] = $val;
    38. }
    39.  
    40.  
    41. }
    42.  
    43.  
    44.  
    45. //echo '<pre>';
    46. //print_r($row2);die();
    47. //echo '</pre>';
    48.  
    49. ?>
    50. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    51. <html xmlns="http://www.w3.org/1999/xhtml">
    52. <head>
    53. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    54. <title>Test</title>
    55. <link rel="stylesheet" type="text/css" href="style.css"/>
    56. </head>
    57.  
    58. <body>
    59.  
    60. <table border="1" style="width:200px">
    61. <tr>
    62. <th>Индекс</th>
    63. <th>Значение</th>
    64. </tr>
    65. <?php
    66. while ($row = mysql_fetch_array ($result))
    67. {
    68.  
    69.  
    70.     $tmp = '';
    71.      
    72.    if (is_array($row2))
    73.    foreach($row2[$row['invoice']] as $row3)
    74.     {
    75. {
    76.     $tmp = $row3['FIELD_1'];
    77. }
    78. }
    79.  
    80.  
    81.     echo '<tr align="center"><td>' . $row['invoice'] . '</td><td>' . $tmp . '</td></tr>';
    82.  
    83. }
    84.  
    85. ?>
    86.  
    87. </table>
    88.  
    89.  
    90. </body>
    91. </html>
    Ошибка выскакивает только в том случае, когда нечего сумировать тоесть условие несоответствует второму запросу.
    Как бы сделать так чтобы вместо этого значением был просто 0. А то сейчас пустая ячейка + ошибка сверху. Заранее благодарен.
     
  13. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    c какой целью тут

    $row2[$val['invoice']][] = $val;

    двумерный массив делаешь? может ты имел в виду
    вообще какой-то аццкий код. в таком случае условие должно выглядеть

    if (is_array(row2[$row['invoice']]))
     
  14. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Отлично!!! Все сработало. Я тебе обязан. Спасибо огромное.

    P.S. Маленький вопросик, как все таки сделать так что бы вместо пустого значения был просто ноль? (Извини за назойливость)
     
  15. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    ну попробуй
    echo '<tr align="center"><td>' . $row['invoice'] . '</td><td>' . $tmp . '</td></tr>';
    заменить на
    echo '<tr align="center"><td>' . ($row['invoice']?$row['invoice']:'0') . '</td><td>' .($tmp?$tmp:'0') . '</td></tr>';

    а вообще, мой совет, переписать все, потому что код, мягко говоря, далек от совершенства.
     
  16. aleksb

    aleksb Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    28
    Симпатии:
    0
    Все получилось, спасибо еще раз огромное. Это было очень важно для меня. Спасибо.
     
  17. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    пожалуйста