Php 变量范围问题

Php 变量范围问题,php,mysql,scope,Php,Mysql,Scope,我的问题是,我在常规脚本代码和一个函数中使用了变量$db。它的目的是成为MySQL连接使用的变量。我需要在函数中向数据库写入一些数据。在我的脚本中,我不能假设现有的db连接将被打开,所以我打开一个新的db连接并在函数退出之前关闭它。自从这样做之后,我在脚本运行后收到一个错误,说MySQL引用不好/不存在 我唯一可以将其固定到的是在我的核心代码中,我使用变量$db作为数据库连接的变量名。我还在函数中使用相同的变量。我没有想到这会是一个问题,因为我没有在函数中的$db前面使用global。这意味着我

我的问题是,我在常规脚本代码和一个函数中使用了变量$db。它的目的是成为MySQL连接使用的变量。我需要在函数中向数据库写入一些数据。在我的脚本中,我不能假设现有的db连接将被打开,所以我打开一个新的db连接并在函数退出之前关闭它。自从这样做之后,我在脚本运行后收到一个错误,说MySQL引用不好/不存在

我唯一可以将其固定到的是在我的核心代码中,我使用变量$db作为数据库连接的变量名。我还在函数中使用相同的变量。我没有想到这会是一个问题,因为我没有在函数中的$db前面使用global。这意味着我函数中的$db I引用在函数私有范围内,但它似乎正在关闭公共$db的连接

有什么想法吗

我的代码片段是:

database.php

db_connect()
{
 // open mysql db connection and return it;
}

db_close( &$db )
{
 // close the passed by reference db connection
}
api_verify( $keyid, $userid, $key )
{
  // open a new db connection
  $db = db_connect();

  // check for errors. if any errors are found note them in the db

  // close the db
  db_close($db);
}
include api.php;
include database.php;

// open a connection to the db
$db = db_connect();

// pull a list of things to process from the db and move through them one at a time
  // call api_verify() on each key before working through it's data.

db_close($db)
api.php

db_connect()
{
 // open mysql db connection and return it;
}

db_close( &$db )
{
 // close the passed by reference db connection
}
api_verify( $keyid, $userid, $key )
{
  // open a new db connection
  $db = db_connect();

  // check for errors. if any errors are found note them in the db

  // close the db
  db_close($db);
}
include api.php;
include database.php;

// open a connection to the db
$db = db_connect();

// pull a list of things to process from the db and move through them one at a time
  // call api_verify() on each key before working through it's data.

db_close($db)
main.php

db_connect()
{
 // open mysql db connection and return it;
}

db_close( &$db )
{
 // close the passed by reference db connection
}
api_verify( $keyid, $userid, $key )
{
  // open a new db connection
  $db = db_connect();

  // check for errors. if any errors are found note them in the db

  // close the db
  db_close($db);
}
include api.php;
include database.php;

// open a connection to the db
$db = db_connect();

// pull a list of things to process from the db and move through them one at a time
  // call api_verify() on each key before working through it's data.

db_close($db)

我假设发生的情况是连接取消,因为已经存在连接,然后关闭结束当前连接。

我建议A)在文件的开头启动一个连接,并且只知道它总是在那里(我所做的);或者B)检查是否设置了$db变量,如果没有,则创建连接,并始终在文件末尾结束连接。

我假设发生的情况是连接取消,因为已经存在连接,然后关闭结束当前连接。

我建议A)在文件的开头启动一个连接,并且只知道它总是在那里(我所做的);或B)检查是否设置了$db变量,如果未设置,则创建连接,并始终在文件末尾结束连接。

我假定您正在调用db\u connect的每个位置使用相同的用户名/密码打开到相同数据库的连接。执行此操作时,除非您的db_connect明确指定您正在创建一个新链接,否则它将返回一个已打开的链接。如果随后使用db_close()关闭该链接,它还将关闭另一个连接,因为该链接是相同的。如果您使用mysql\u connect连接到数据库,则需要一个名为new link的参数

新链接 如果使用相同的参数对mysql_connect()进行第二次调用,则不会建立新链接,而是返回已打开链接的链接标识符。new_link参数修改此行为,并使mysql_connect()始终打开新链接,即使以前使用相同的参数调用过mysql_connect()。在SQL安全模式下,忽略此参数


我不确定这是否是你面临的问题。希望能有所帮助。

我假设您正在使用相同的用户名/密码在每个称为db\u connect的位置打开到同一数据库的连接。执行此操作时,除非您的db_connect明确指定您正在创建一个新链接,否则它将返回一个已打开的链接。如果随后使用db_close()关闭该链接,它还将关闭另一个连接,因为该链接是相同的。如果您使用mysql\u connect连接到数据库,则需要一个名为new link的参数

新链接 如果使用相同的参数对mysql_connect()进行第二次调用,则不会建立新链接,而是返回已打开链接的链接标识符。new_link参数修改此行为,并使mysql_connect()始终打开新链接,即使以前使用相同的参数调用过mysql_connect()。在SQL安全模式下,忽略此参数


我不确定这是否是你面临的问题。希望有帮助。

要管理数据库连接,您可以创建一个类而不是一对函数。如果您说“MySQL reference”,确切的错误是指“MySQL资源”,那么您使用的是过时的MySQL扩展,应该切换到更现代的扩展,例如PDO

classdbconnection{
受保护的静态$\u连接=数组(),
静态连接($dsn){
if(!isset(self:$\u连接[$dsn])){
$credentials=self::getCredentials();
/*创建连接。例如:*/
试一试{
self::$_connections[$dsn][0]=新PDO($dsn,$credentials['username'],$credentials['password']);
}捕获(PDO异常$exc){
//从呼叫跟踪中删除带有密码的帧以防止泄漏。
抛出新的PDOException($exc->getMessage(),$exc->getCode());
}
/*结束创建连接示例*/
self::$_连接[$dsn][0]->dsn=$dsn;
}
++self::$_连接[$dsn]['count'];
返回self::$_连接[$dsn][0];
}
静态关闭($db){
if(isset(self::$_connections[$db->dsn])){
if(--(self::$_连接[$db->dsn]['count'])<1){
取消设置(self:$_连接[$db->dsn]);
}
}
}
静态getCredentials(){
/*凭证可以存储在配置文件或脚本中,也可以使用此方法或您自己设计的其他方法*/
}
}

请注意,这并不完全是OOP(是的,但仅在技术意义上)。上述情况不适合进行单元测试。如果您想要一种更加面向对象的方法(这将更适合于单元测试),可以扩展或包装PDO。使用还可以帮助解决上述问题。

要管理数据库连接,可以创建一个类而不是一对函数。如果您说“MySQL reference”,确切的错误是指“MySQL资源”,那么您使用的是过时的MySQL扩展,应该切换到更现代的扩展,例如PDO

classdbconnection{
受保护的静态$\u连接=