如何在php中高效地连接到mysql,而无需重新连接每个查询

如何在php中高效地连接到mysql,而无需重新连接每个查询,php,mysql,connection-pooling,connect,Php,Mysql,Connection Pooling,Connect,每次学习php的新知识(比如mysql连接不能作为句柄在会话中传递),我都不得不重写代码,对此我感到非常厌烦 如何在项目中实现mysql连接?很多人都提出了“连接池”,但读完手册后我还是迷路了。这就像:“连接池就是mysql\u pconnect!”-我:“还有…?这在现实中有什么不同?你能在一个会话中传递一个mysql\u pconnect吗?为什么这看起来很神秘??” 让我解释一下我的情况。我有一个名为“query1”的函数: 这似乎是一种浪费和低效的db查询方式(尤其是,因为mysql\u

每次学习php的新知识(比如mysql连接不能作为句柄在会话中传递),我都不得不重写代码,对此我感到非常厌烦

如何在项目中实现mysql连接?很多人都提出了“连接池”,但读完手册后我还是迷路了。这就像:“连接池就是mysql\u pconnect!”-我:“还有…?这在现实中有什么不同?你能在一个会话中传递一个mysql\u pconnect吗?为什么这看起来很神秘??”

让我解释一下我的情况。我有一个名为“query1”的函数:

这似乎是一种浪费和低效的db查询方式(尤其是,因为mysql\u real\u escape\u string等函数需要mysql句柄)。做这件事的正确形式是什么?有人能帮我吗


谢谢你,我真的非常感谢你诚实的回答。

通常,一旦页面加载,连接就会发生。阿卡

class Database{
    public function connect()
    {
         $this->connection = mysql_connect();
    }

    // This will be called at the end of the script.
    public function __destruct()
    {
        mysql_close($this->connection);
    }

    public function function query($query)
    {
        return mysql_query($query, $this->connection);
    }
}
$database = new Database;
$database->connect();

$database->query("INSERT INTO TABLE (`Name`) VALUES('Chacha')");
基本上,您在页面的开头打开连接,在页面的结尾关闭连接。然后,您可以在页面中进行各种查询,而不必对连接做任何操作

您甚至可以按照Erik的建议在构造函数中进行mysql\u连接


要使用上述全局变量(不建议使用,因为它会创建全局状态),您可以执行以下操作

Global $db;

$db = new Database;
// ... do startup stuff

function doSomething()
{
    Global $db;
    $db->query("Do Something");
}

哦,没有人提到你不需要传递一个参数。只需连接

mysql_connect();
然后,不管作用域是什么,mysql\u查询都只使用最后一个连接

mysql_connect();

function doSomething()
{
    mysql_query("Do something");
}

根据评论:

我认为您应该使用mysql\u pconnect()而不是mysql\u connect(),因为mysql\u connect()不使用连接池夜编码器


您可能想考虑是否使用<代码> MySQL连接> <代码>或<代码> MySqLypLink < /代码>。但是,每个脚本只应连接一次。

您不需要在每个函数中都连接到数据库。您需要在脚本开始运行时连接到数据库,并将连接对象保存为全局状态。在任何函数中,都可以使用该连接对象查询数据库。每次执行脚本时都会重新创建连接对象,但速度非常快,因为在场景后面使用了特殊的连接池,所以连接将立即完成(几微秒的时间,因为实际上连接甚至没有断开,所以它保存在连接池中)

以下是您要求的示例:

// this code should be executed on every page/script load:
$adoConn = ADONewConnection(...);
$adoConn->PConnect(...);

// ...

//And then in any place you can just write:
global $adoConn;
$adoConn->ExecuteNonQuery("INSERT INTO test SET Value = 'Hello, world!'");
至于你的问题“我如何实现连接池”。你没有。它由后台服务器维护,如果您(或使用PHP的PHP库)使用mysql_pconnect()函数,则可以使用它

注:如果您害怕将$adoConn作为全局变量(我不是),那么您可以创建一个具有静态属性的类:

class DB
{
  public static $adoConn;
}

// ...

DB::$adoConn->ExecuteNonQuery(...);

但将$db句柄传递给我在每个页面上使用的每个函数是很可笑的(这是一项极其艰巨和多余的任务)。无论如何,谢谢。我对OO编程不太了解,但为什么不直接连接构造函数呢?似乎在“新建数据库”之后添加第二步是不必要的。在Erik中添加了该步骤。我还没有创建完整的类,因为我甚至没有传递用户信息。只是提供一个解决方案。@Chacha102我想我不是。必须有更好的方法来完成这项无处不在的任务。我的意思是,是否所有1000000名PHP程序员都以这种方式连接到mysql?恕我直言,我真的很怀疑。@Gal,没有人提到mysql\u query只使用了到mysql的最后一个连接。只需在脚本开头使用
mysql\u connect
,然后在整个脚本中使用
mysql\u query
。谢谢,但您能提供一些代码给我吗?你提到了全球国家。这是不是像define(“db”,$db)?如何使用此方法实现连接池?基本上,您必须在每个函数中定义
$db
,并在其中定义
$db
。我将把它添加到我的答案中。这需要打开全局变量吗?这不是安全漏洞吗?全局变量不能打开或关闭。这是PHP的一个特性,实际上并非如此
register_globals
是完全不同的东西。register globals令人讨厌,但Chacha的建议与register globals无关。“自己创建全局变量”在PHP中有一席之地-RG指的是根据表单输入名称自动创建的全局变量,它可能会破坏您创建的变量,并做一些您意想不到的坏事。@Gal阅读我的最新更新。它提供了一个不需要变量的解决方案。
class DB
{
  public static $adoConn;
}

// ...

DB::$adoConn->ExecuteNonQuery(...);