У меня есть следующий код:
<?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
как массив