我有以下代码:
<?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数组(所以它是全局的),然后将它指定为函数内的全局函数。有些东西不对,但我不确定那是什么?
感谢您的建议。
答案 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
初始化为数组