我在学习模式下,对PHP非常陌生,所以我正在使用一个代码示例。请原谅我在这里使用了“global”,但我想理解PHP变量作用域。
以下是我的Globals.php:
这是connectToDb.php文件:
这是addDbRecords.php文件:
这是index.php文件:
这里出现了问题。当我在addDbRecords.php文件中调用doAddDeleteRecord($db_server)时,mysql_query(.., $db_server, ...)中的$db_server无效——它是null——这是错误信息:
“Warning: mysql_query() expects parameter 2 to be resource, null given in C:\xampp\htdocs\addDbRecords.php on line 29”
因此,我尝试在doAddDeleteRecord()中使用'global'声明(如上所述)——但没有任何改变。mysql_query(...)仍然会因为$db_server的值为NULL而失败。
我知道mysql_connect(....)有效,因为其他代码成功地从我的数据库中取出了所有记录(使用SELECT),并且现有记录在浏览器中正确显示。
因此,在我看来,$db_server被声明为'global'应该意味着$db_server的作用域是这样的,一旦在所有文件中的文件范围内调用mysql_connect(...),$db_server将成为与我的数据库建立的有效连接。
我只想学习有关php作用域的知识,而不是OOAD或其他任何东西(目前)。为什么这里$db_server()为空?
以下是我的Globals.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)时,mysql_query(.., $db_server, ...)中的$db_server无效——它是null——这是错误信息:
“Warning: mysql_query() expects parameter 2 to be resource, null given in C:\xampp\htdocs\addDbRecords.php on line 29”
因此,我尝试在doAddDeleteRecord()中使用'global'声明(如上所述)——但没有任何改变。mysql_query(...)仍然会因为$db_server的值为NULL而失败。
我知道mysql_connect(....)有效,因为其他代码成功地从我的数据库中取出了所有记录(使用SELECT),并且现有记录在浏览器中正确显示。
因此,在我看来,$db_server被声明为'global'应该意味着$db_server的作用域是这样的,一旦在所有文件中的文件范围内调用mysql_connect(...),$db_server将成为与我的数据库建立的有效连接。
我只想学习有关php作用域的知识,而不是OOAD或其他任何东西(目前)。为什么这里$db_server()为空?
myglobals.php
脚本只被加载了 一次,而 OP 可能希望它被多次包含。 (然而,一般的不建议使用并没有意义。) - marioinclude[_once]
之外,其他都正确。OP是在每个文件的顶部包含它,无论如何切割,仍需要使用global
修饰符才能在函数内使用这些变量。 - Chris Eberleglobal
。因为你总是从全局作用域引用变量。 - Lightness Races in Orbit