【问题标题】:Do I need a php mysql connection in each function that uses database?我是否需要在每个使用数据库的函数中建立一个 php mysql 连接?
【发布时间】:2012-04-18 11:47:25
【问题描述】:

我正在创建一个 php restful API,目前我在每个函数中都有数据库连接信息。

//Connect To Database
    $hostname=host;
    $username=username;
    $password=password;
    $dbname=dbname;

    mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.');
    mysql_select_db($dbname);
mysql_query($sqlApiAccess) or die('Error, insert query failed');

最好的方法是什么,每个 php 文件可以有一个数据库连接吗?还是我需要为每个使用数据库的函数执行此操作。

【问题讨论】:

  • 只是您认为需要更多的原因之一?
  • 顺便看看PDO库。它提供了一种很好的面向对象的方式来使用 DB(而不是 mysqlmysqli);它还允许准备好的语句(而mysql IIRC 不支持这些,将所有转义的东西留给开发人员)。
  • 我是 PHP 新手,不确定数据库连接的要求。我会看看 PDO 库

标签: php mysql


【解决方案1】:

为了避免每次都创建新的数据库连接,我们可以使用Singleton design pattern-

我们需要一个数据库类——来处理数据库连接——

Database.class.php

<?php
        class Database
        {
            // Store the single instance of Database
            private static $m_pInstance;

            private $db_host='localhost';
            private $db_user = 'root';
            private $db_pass = '';
            private $db_name = 'databasename';

            // Private constructor to limit object instantiation to within the class
            private function __construct() 
            {
                mysql_connect($this->db_host,$this->db_user,$this->db_pass);
                mysql_select_db($this->db_name);
            }

            // Getter method for creating/returning the single instance of this class
            public static function getInstance()
            {
                if (!self::$m_pInstance)
                {
                    self::$m_pInstance = new Database();
                }
                return self::$m_pInstance;
            }

            public function query($query)
            {
               return mysql_query($query);
            }

         }
?>

& 我们可以从其他文件中调用它-

other.php

<?php
       include 'singleton.php';
       $pDatabase = Database::getInstance();

       $result = $pDatabase->query('...');
?>

【讨论】:

  • 我一直在使用这种模式,但有时我会收到错误提示 Too many database connections..我应该在哪里关闭数据库连接。
【解决方案2】:

创建一个config.php并添加代码:

config.php:

$hostname = 'host';
$username = 'username';
$password = 'password';
$dbname   = 'dbname';

$conn = mysqli_connect($hostname, $username, $password) OR die('Unable to connect to database! Please try again later.');
mysqli_select_db($conn, $dbname);

然后在您希望使用 mysql 的任何文件中,添加以下内容:

script2.php

<?php
require_once 'config.php';

mysqli_query($sqlApiAccess) or die('Error, insert query failed');
?>

【讨论】:

  • 还有;来自专业人士的信息:P 一定要清理您的输入;)
  • 这很好用。我通过 htmlspecialchars 和 mysql_real_escape_string 运行我所有的 api 参数。这可能是过度杀戮,但我想保护我的数据库。
  • 不要担心 html_entities() 的输入,只需输出。并确保将 ENT_QUOTES 与实体/特殊字符一起使用;)
  • 所以你是说我不必担心他输入的htmlspecialchars?
  • @tehlulz 首先,您的config.php 在包含方面做了一些工作,应该避免这种情况(例如,将对mysql_connect 的调用从config.php 移出)。 config.php 这个名字不会告诉未来的维护者它实际上建立了一个连接。第二,依赖全球国家是有害的; mysql 支持使用句柄以及将句柄存储为全局状态。
【解决方案3】:

无需在每个函数中建立连接。您需要创建一个类似conn.php 的连接文件并进行连接查询。

<?php
mysql_connect("localhost", "admin", "1admin") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
?>

在你想连接数据库的任何其他文件中只写这一行

<?php include("conn.php");?> 

您可以在此文件上运行任何查询。

【讨论】:

    【解决方案4】:

    这样做:

    $db_connection= mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.');
    

    而且每次要查询时:

    mysql_query("my_query",$db_connection);
    

    注意,如果您在函数中连接到数据库,则需要全局$db_connection

    当你想关闭数据库连接时:

    mysql_close($db_connection);
    

    【讨论】:

      【解决方案5】:

      你为什么不把连接信息移到配置中,把对mysql_connect的调用移到某个工厂?

      例如

      class ConnectionFactory {
          public static MysqlConnection CreateConnection() {
              $connection = mysql_connect(Config::$host, Config::$port etc);
              mysql_select_db($connection, Config::$schema);
              return $connection;
          }
      }
      

      然后在你的代码中

      $connection = ConnectionFactory::CreateConnection();
      mysql_query($connection, $sqlApiAccess) or die('Error, insert query failed');
      

      【讨论】:

      • 对于只是询问是否需要在每个文件中放入相同代码的人来说,我认为拥有 ConnectionFactory 实在是太过分了,如果有的话,会让他更加摸不着头脑。
      • @tehlulz 也许吧。几年前我读过 Allen Carr 的停止 PHP 的简单方法,已经忘记了用 PHP 编写的软件有多糟糕。
      • 学习如何使用语言和编写完整的应用程序是有区别的:P
      猜你喜欢
      • 2021-11-02
      • 2023-03-22
      • 2015-10-01
      • 2022-01-10
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多