【发布时间】:2011-09-12 17:11:44
【问题描述】:
我在这里处于学习模式,对 PHP 非常陌生,所以我正在使用代码示例。 请原谅我在这里使用“全局”,但我想了解 php 变量范围。
这是 myGlobals.php:
<?php
global $db_server;
// other code not shown
?>
这里是 connectToDb.php:
<?php
require_once 'myGlobals.php';
// no declared functions in this file, all inline code
$db_server = mysql_connect(.....);
mysql_select_db( "theDatabase", $db_server);
?>
这里是 addDbRecords.php:
<?php
require_once 'myGlobals.php';
// other inline code.....
doAddDeleteRecord($db_server);
function doAddDeleteRecord($db_server)
{
//global $db_server;
if( !mysql_query($query, $db_server))
{
// handle the error...
}
}
?>
这里是 index.php:
<?php
require_once 'myGlobals.php';
require_once 'connectToDb.php';
require_once 'addDbRecords.php';
// this is simplified, just trying to show that everything in inline code
?>
这就是问题所在。当我在文件 addDbRecords.php 中调用 doAddDeleteRecord($db_server) 时
上面,$db_server 无效——它为空——当我调用 mysql_query(.., $db_server, ...) 时——这是错误消息:
“警告:mysql_query() 期望 参数 2 为资源,给定 null 在 C:\xampp\htdocs\addDbRecords.php 上 第 29 行“
所以我尝试在doAddDeleteRecord()(上面注释掉)中使用“全局”声明——没有变化。mysql_query(...) 仍然失败,$db_server 的值为 NULL。
我知道mysql_connect(....) 有效,因为其他代码成功地将我的所有记录从我的数据库中提取出来(使用 SELECT)并且现有记录在浏览器中正确显示。
所以在我看来,$db_server 被声明为“全局”这一事实应该意味着 $db_server 的范围是这样的@ 将是与我的数据库的有效连接。
我只是想了解 php 作用域,而不是 OOAD 或其他任何东西(目前)。为什么$db_server() 在这里为空?
【问题讨论】:
-
永远不要使用require_once。使用要求
-
@yes123:为什么?大多数答案here 似乎声称这是一个神话。
-
如果你仍然使用旧的mysql_接口函数,你不必传递连接句柄。如果只打开一个,则隐式使用。 (除非你传递一个空值。)
-
@require_once:这可能确实是这里出现问题的原因,因为
myglobals.php脚本实际上只是加载了一次,而 OP 可能打算将它包含在其中多次。 (不过,普遍的反对毫无意义。) -
@mario:除了 OP 没有在函数内部使用
include[_once]。 OP 将它包含在每个文件的顶部,无论你如何剪切它仍然需要使用global修饰符才能在函数中使用这些变量。