使用array_push时出错 - “第一个参数应该是一个数组”

时间:2012-03-22 17:59:47

标签: php mysql

我有以下代码:

<?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 个答案:

答案 0 :(得分:3)

根据评论,$products由包含在函数中的包含文件初始化。这将其范围定义为函数,而不是全局。因此,在调用include之前,您需要使用global $products;

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定义了它,您可能会失去这样做的灵活性......

答案 1 :(得分:0)

您尚未将全局变量初始化为数组。对于PHP,该变量只是null,这不是一个阵列。

答案 2 :(得分:0)

确保在使用变量之前初始化变量。像你这样的代码会导致副作用(如果有数据库结果则工作正常;如果是空的则失败)。

另一点: 为什么不返回结果而不是使用全局运算符?这是非常糟糕的风格。

下一个: 创建SQL语句时:转义变量!

答案 3 :(得分:0)

取消注释此部分

  

// $ products = array();

$products初始化为数组