14

每次我学习一些关于 php 的新东西时,我都不得不重写我的代码(比如 mysql 连接不能在会话中作为句柄传递)。

你如何在你的项目中实现mysql连接?很多人提出了“连接池”,但是在阅读了手册之后我仍然迷路了。就像:“连接池是 mysql_pconnect!” - 我:“而且……?这在现实中有什么不同?你能在会话中传递一个 mysql_pconnect 吗?为什么这个看起来很神秘的光环??”

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

function query1($query)
{
    $db = new mysql(HOST,USER,PASS,DBNAME);
    $result = $db->query($query);
    $db->close();
    return $result;
} 

这似乎是查询数据库的一种浪费且效率低下的方式(特别是因为您需要一个 mysql 句柄来处理诸如 mysql_real_escape_string 之类的函数)。这样做的正确形式是什么?有人可以帮帮我吗?

谢谢你,我真的很感激一个诚实的答案。

4

2 回答 2

17

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

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_connect。


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

Global $db;

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

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

哦,没有人提到您不必传递参数。只需连接

mysql_connect();

然后, mysql_query 将只使用最后一个连接,无论范围是什么。

mysql_connect();

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

根据评论:

我认为你应该使用 mysql_pconnect() 而不是 mysql_connect(),因为 mysql_connect() 不使用连接池。– 夜间编码器

您可能要考虑是否使用mysql_connectmysql_pconnect。但是,您仍然应该每个脚本只连接一次。

于 2010-01-24T22:31:43.043 回答
0

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

这是您要求的示例:

// 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() 函数,则使用它。

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

class DB
{
  public static $adoConn;
}

// ...

DB::$adoConn->ExecuteNonQuery(...);
于 2010-01-24T22:33:40.620 回答