【问题标题】:PHP5 mysqli vs mysql config filesPHP5 mysqli vs mysql 配置文件
【发布时间】:2012-09-10 20:20:09
【问题描述】:

我知道这听起来确实很愚蠢,但我发现 mysqli 准备好的语句及其面向对象的方法很有吸引力,所以我计划将我过去的一些涂鸦从 mysql 转换为 mysqli。

这是……问题

在mysql中我曾经有一个配置文件,例如包含在每个需要数据库的文件中(即require('sys/dbconfig.php');

我不确定我是否需要在 mysqli 中这样做,或者像其他人所说的那样,在需要时打开连接,在不需要时关闭它(即在需要数据库的任何地方粘贴 $mysqli = new mysqli($host, $user, $pass, $database);交易。

【问题讨论】:

    标签: php mysql web-applications web


    【解决方案1】:

    我就是这样做的:

    config.php

    define("DB_HOST", "127.0.0.1");
    define("DB_NAME", "demo");
    define("DB_USER", "root");
    define("DB_PASS", "root");
    

    数据库.php

    // include database constants
    include_once("config.php");                   
    
    // create db connection
    $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);         
    

    现在你可以通过

    $result = $db->query("SELECT x FROM y;");            
    

    【讨论】:

    • 哦,好主意:P 这正是我的猜测,在配置中定义全局常量并在需要的任何地方打开/关闭连接:) 对吗?
    • 在这种情况下,我会在脚本/应用程序的开头创建 $db 并在需要时使用 $db。 php 每次都会使用相同的数据库连接($db 是一个连接)..(或者我误解了你的问题?)
    【解决方案2】:

    MySqlI 有 2 种风格:过程式面向对象

    当您使用 procedural 样式时,一切都与 mysqli_ 中的一样。 您指的是 面向对象 样式,并且配置不同..实际上更面向对象。这意味着您必须创建一个新的 mysqli 实例并使用它的方法来完成工作。

    注意:当使用 mysqli_ 与 mysql 相同的方式时,您将遇到与 SQL 注入相同的问题。您应该将 mysqli 与准备好的查询和参数绑定结合使用。

    【讨论】:

    • 那么我是像过去一样包含一个配置文件,还是在需要时打开连接并在不需要时关闭它?
    • 如果你想使用程序风格:是的。请参阅我关于 SQL 注入的警告!
    • 是的,我的意思是我期待preparedStatements ;) 我过去一直在疯狂使用mysql_real_escape_string,我觉得这很不方便。那么我怎么能用 mysqli 实现 OO 风格呢?在需要时打开连接并在完成时关闭它?放弃配置文件并将连接代码带到应用程序级别?
    【解决方案3】:

    Mysqli 在使用new mysqli(...) 实例化时打开连接(PDO 也是如此)。

    在 PHP 会话期间,您不需要打开/关闭与数据库的连接,因为 PHP 会话(对于普通网站/Web 应用程序)的持续时间少于 1 秒。

    在代码中多次强制执行等效的 mysql_connect/mysql_close 仅​​对长时间运行的脚本有用,这些脚本在整个运行期间都不需要活动连接。

    每个 mysql 用户允许的单独 mysql 连接数是有限的,具体取决于服务器的配置。

    如果您有一些脚本运行时间很长,并且可能会与许多其他脚本相交,您可能会用完每个用户允许的所有连接,从而阻止其他用户。

    我建议(作为一种简单的方法)在一个文件中实例化 mysqli,您将在需要数据库访问的任何地方使用您存储 mysqli 对象的变量,使用global $db

    【讨论】:

      【解决方案4】:

      我倾向于像 Panique 那样在配置文件中创建常量。

      我还使用包含连接代码的静态方法 fetch_db 创建了一个 App 类。然后每当我需要一个数据库连接时,我只需调用App::fetch_db()

      我可以在今天下午晚些时候回家后发布代码和更多解释。

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多