1

我有一个 PHP 数据库连接,在访问时可以完美运行,例如:

$con = mysqli_connect("localhost","username","password","database");  
$result = mysqli_query($con, $query);  

我还可以通过将其作为参数传递来在函数中访问它:

function test($con, $args) {
    $query10 = "select name from table where id = '$args[0]'";
    $result10 = mysqli_query($con, $query10);
}

test($con, array('value1','value2'));

但是,当我尝试从另一个函数调用的函数访问连接时:

mainFunction() {
    test($con, array('value1','value2'));
} 

我得到“faultCode0faultStringWarning:mysqli_query() 期望参数 1 为 mysqli,给定 null”。
将变量传递给 mainFunction 然后传递给第二个函数是可行的,但它会创建带有太多参数的非常不可读的代码,因为这同样适用于所有其他变量。

所以我尝试使用全局变量,但由于某种原因它们不起作用。跑步

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
} 

Sum();
echo $b;  

返回 2,这让我怀疑 PHP 配置有问题,因为根据 PHP 文档(http://php.net/manual/en/language.variables.scope.php)它应该返回 3。

如何让全局变量工作或者是否有另一种方法可以从嵌套函数访问变量而无需多次传递它们?

PHP 版本是 5.3.10-1ubuntu3.8 并且还安装了 Zend 框架。如果您需要任何其他信息,请告诉我。

4

2 回答 2

1

我不知道为什么您的全局变量测试不起作用,也许文件中还有其他代码您没有向我们展示,但无论如何全局变量通常被认为是一个坏主意。

结构化编程的本质是您可以在不依赖全局副作用的情况下分离出不同的任务和关注点。经常使用的全局变量很难调试,并且很难用不同的实现替换,因为您的所有函数都希望能够随时凭空取出变量。

传递表示要使用的数据库连接的对象是依赖注入的一种简单形式,并且可以更轻松地执行单元测试等操作。

还有其他获取数据库连接的方法,它们不像依赖注入那样彻底,但比全局变量更容易更改。例如,您可以定义一个函数 get_db_connection,它保存一个“静态值”,并在每次调用时返回相同的连接。或者对类中的静态变量和方法执行相同的操作。

于 2013-10-17T11:09:33.937 回答
0

我的第一个建议是您需要将数组变量连接到您的字符串中

$query10 = "select name from table where id = '" . $args[0] . "'";

它更易于阅读,您可以将此语法与字符串键一起使用,例如$args['myvar'].

您的问题的最佳解决方案是将数据直接传递给您的函数并让您的函数获得return这些值。全球化你的变量可能在直接意义上起作用,但是你很容易忘记你在做什么,因为你已经破坏了你的变量的范围。

function Sum($a, $b) {
    return $a + $b;
}
$b = Sum($a, $b);
于 2013-10-17T10:46:35.077 回答