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

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

<?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 вне функции (поэтому он глобальный), а затем указываю, что он является глобальным внутри функции. Что-то не так, но я не уверен, что это такое?

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

Ответы [ 4 ]

3 голосов
/ 22 марта 2012

Согласно комментариям, $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...
}

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

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

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

0 голосов
/ 22 марта 2012

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

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

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

0 голосов
/ 22 марта 2012

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

// $ products = array ();

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

0 голосов
/ 22 марта 2012

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

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