Ошибки при использовании array_push – «Первый аргумент должен быть массивом»

У меня есть следующий код:

<?php function foo($bar) { global $products; //$products = array(); $query = 'SELECT p_name FROM 0_products WHERE p_category IN (' . $bar . ')'; $results = mysql_query($query); while($row = mysql_fetch_array($results, MYSQL_ASSOC)) { array_push($products, $row); echo 'name pushed, '; } } require('mysql_ipb_connect.php'); // connect to ipb mysql database $products = array(); foo(5); ?> 

Когда я запускаю его, я получаю следующий вывод:

 Warning: array_push() [function.array-push]: First argument should be an array in /home/rgcpanel/public_html/category/category.php on line 14 name pushed, Warning: array_push() [function.array-push]: First argument should be an array in /home/rgcpanel/public_html/category/category.php on line 14 name pushed, Warning: array_push() [function.array-push]: First argument should be an array in /home/rgcpanel/public_html/category/category.php on line 14 name pushed, 

Если я раскомментирую «$ products = array ();» то выход будет правильным:

 name pushed, name pushed, name pushed, 

Почему это происходит? Я объявляю массив $ products вне функции (так что это глобальный), а затем указываю, что он является глобальным внутри функции. Что-то не так, но я не уверен, что это?

Спасибо за ваш совет.

По комментариям $products был инициализирован включенным файлом, который был включен внутри функции. Это определяет сферу действия этой функции, а не глобально. Таким образом, вам нужно будет использовать global $products; перед вызовом include.

 function func_that_defined_products() { global $products; include('file_that_defines_products.php'); } // Now when called globally later, it will be at the correct scope. function foo($bar) { global $products; $query = 'SELECT p_name FROM 0_products WHERE p_category IN (' . $bar . ')'; // etc... } в function func_that_defined_products() { global $products; include('file_that_defines_products.php'); } // Now when called globally later, it will be at the correct scope. function foo($bar) { global $products; $query = 'SELECT p_name FROM 0_products WHERE p_category IN (' . $bar . ')'; // etc... } 

В любом случае, я считаю, что более читаемым является использование $GLOBALS['products'] вместо global ключевого слова. И, как всегда, везде, где это возможно, предпочтительной практикой является передача переменной в функцию, а не доступ к ней по всему миру.

 // If you can, do it this way function foo($bar, $products) { // $products was a param, and so global is unnecessary } 

Однако в вашем случае, если CMS определяет это, вы можете потерять гибкость, чтобы сделать это таким образом …

Вы не инициализировали глобальную переменную как массив. Для PHP эта переменная имеет значение null, что не является массивом.

Перед их использованием убедитесь, что вы инициализируете переменные. Код, похожий на ваш, приведет к побочным эффектам (работает нормально, если есть результат базы данных, если не будет пустым).

Другой вопрос: почему бы вам не вернуть результат вместо глобального оператора? Это действительно плохой стиль.

Следующий: При создании операторов SQL: избегайте переменные!

Раскомментировать эту часть

// $ products = array ();

Инициализировать $products как массив