【问题标题】:PHP OOP MySQL ProgrammingPHP OOP MySQL 编程
【发布时间】:2012-02-01 03:23:45
【问题描述】:

我是 PHP 编程的初学者,想请教一个小问题。请看下面的代码:


PHP 代码

<?php
class Account
{
  public function register()
  {
    $db_link = mysql_connect("localhost","root","");  // Create Connection
    if (!$db_link)  // Check connection
    {
      die(mysql_error());
    }

    mysql_close($db_link); // Close Connection
  }

  public function login()
  {
    $con = mysql_connect("localhost","root","")  // create connection
    if (!$con)  // create connection
    {
      die(mysql_error());
    }
    mysql_close($con); //close connection
  }

}
?>

我的问题是,如果为每个对象的方法创建单独的数据库链接是最好的方法吗?有没有更好或替代的方法来做到这一点?希望我已经解释得够清楚了。


以下是否正确?

$x = new Account("localhost", "root", "");

-x 会有自己的连接...然后在完成后关闭?

【问题讨论】:

  • 只需在整个程序的开头和结尾使用mysql_connect()mysql_close()。无需在每个方法中都实例化连接。
  • @ldiqual:您的评论可能是一个答案!
  • @idiqual 你根本不应该鼓励使用mysql_,尤其是对于刚接触该语言并开始一个新项目的人。
  • 如果你想在你的__construct 中保持db 到Accounting 类,并在对象被销毁时实现__destruct 方法来销毁连接。
  • 使用单例模式。示例stackoverflow.com/questions/8685896/…

标签: php mysql sql oop


【解决方案1】:

我不建议以这种方式创建数据库连接。创建一个连接并将其注入到使用它的对象中。您不需要为每个对象创建一个新连接。

代码示例:

$connection = new mysqli('localhost', 'user', 'password');

$Account = new Account($connection);

需要将Account 更改为:

class Account {

    protected $connection;

    public function __construct(mysqli $connection) {
        $this->connection = $connection;
    }

    public function register() {
        // use $this->connection for db
    }

    public function login() {
        // use $this->connection for db
    }

}

我还建议您查看php.net docs about choosing a MySQL API。如果您真的想在 PHP 和 MySQL 中使用 OOP,则需要切换到 mysqliPDO,因为您使用的 API 并不真正支持 OOP 接口。

【讨论】:

  • 你忘记关闭连接了。
  • @GabrielSantos 不,我不是故意关闭它。如果有另一个对象需要使用该连接怎么办?然后我们必须再次打开连接。创建连接对象的代码应该负责关闭连接。
【解决方案2】:

我建议:

public function __construct(mysqli $connection) {
    $this->connection = $connection;
    if(!$this->$connection) {
        die(mysql_error());
    }
}

public function __destruct() {
    mysql_close($this->$connection);
}

【讨论】:

  • 我不确定是否推荐在这种(或任何 OO)情况下使用 die。
  • @cbuckley 仅供参考。
  • 我唯一担心的是,对于初学者 PHP 程序员、OOP 或其他人来说,这可能是一个不好的例子。
  • 不,不是。 die 与 OOP 无关。
  • 异常处理是 OOP 的一个组成部分。 die() 立即产生致命错误。见stackoverflow.com/questions/3845494/php-oop-exceptions-or-die
【解决方案3】:

您可以使用如下代码:

$db_link = mysql_connect("localhost","root","");  // Create Connection
if (!$db_link)  // Check connection 
{
  die(mysql_error());
}
mysql_select_db("db_name");
$q=mysql_query("SELECET * FROM table_name LIMIT 1");

其他查询会在这里

mysql_close($db_link); // Close Connection

在每个页面上创建单个连接就足够了。多个连接或与 sql server 断开连接并再次登录可能会导致性能下降。

【讨论】:

    【解决方案4】:

    您可以使用静态成员,所有对象将共享一个数据库连接。

    另请参阅 PHP - a DB abstraction layer use static class vs singleton object?

    【讨论】:

    • 我都不会使用(静态类或单例)。
    • 对单身人士投反对票。没有理由使用静态将数据库连接引入全局范围
    • @CharlesSprayberry 再次同意。
    【解决方案5】:

    如果您想缩小它并使其更整洁/更易于管理,您可以将 mysql 连接代码放入它自己的方法中并像这样调用它:

    <?php
    class Account
    {
      private $connection;
    
      private function connect()
      {
        $this->$connection = mysql_connect("localhost","root","");  // Create Connection
      }
    
      public function register()
      {
        $this->connect();
        if (!$this->$connection)  // Check connection
        {
          die(mysql_error());
        }
    
        mysql_close($this->$connection); // Close Connection
      }
    
      public function login()
      {
        $this->connect();
        if (!$this->$connection)  // create connection
        {
          die(mysql_error());
        }
        mysql_close($this->$connection); //close connection
      }
    
    }
    ?>
    

    【讨论】:

    • 投了反对票,因为最终每次调用函数时您仍在创建数据库连接。
    • @CharlesSprayberry 同意你的看法。
    • @CharlesSprayberry 我误解了原来的问题
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2011-07-18
    相关资源
    最近更新 更多