【问题标题】:How to change mysql to mysqli?如何将mysql更改为mysqli?
【发布时间】:2026-02-01 16:05:01
【问题描述】:

根据下面我用于常规 mysql 的代码,如何将其转换为使用 mysqli?

就是把mysql_query($sql);改成mysqli_query($sql);这么简单吗?

<?PHP

//in my header file that is included on every page I have this
$DB["dbName"] = "emails";
$DB["host"] = "localhost";
$DB["user"] = "root";
$DB["pass"] = "";
$link = mysql_connect($DB['host'], $DB['user'], $DB['pass']) or die("<center>An Internal Error has Occured. Please report following error to the webmaster.<br><br>".mysql_error()."'</center>");
mysql_select_db($DB['dbName']);
// end header connection part

// function from a functions file that I run a mysql query through in any page.
function executeQuery($sql) {
    $result = mysql_query($sql);
    if (mysql_error()) {
        $error = '<BR><center><font size="+1" face="arial" color="red">An Internal Error has Occured.<BR> The error has been recorded for review</font></center><br>';
        if ($_SESSION['auto_id'] == 1) {
            $sql_formatted = highlight_string(stripslashes($sql), true);
            $error .= '<b>The MySQL Syntax Used</b><br>' . $sql_formatted . '<br><br><b>The MySQL Error Returned</b><br>' . mysql_error();
        }
        die($error);
    }
    return $result;
}

// example query ran on anypage of the site using executeQuery function
$sql='SELECT auto_id FROM friend_reg_user WHERE auto_id=' .$info['auto_id'];
$result_member=executequery($sql);
if($line_member=mysql_fetch_array($result_member)){
    extract($line_member);
} else {
    header("location: index.php");
    exit;
}
?>

【问题讨论】:

  • Jason,考虑接受the answer from Dharman,它是最新的和现代的标准,因此与旧答案不同,不会造成伤害。

标签: php mysql mysqli


【解决方案1】:

首先要做的可能是将每个 mysql_* 函数调用替换为等效的 mysqli_*,至少如果您愿意使用过程 API 的话——这将是更简单的方法,考虑到您已经拥有一些基于 MySQL API 的代码,这是一个程序性代码。

为此提供帮助,the MySQLi Extension Function Summary 肯定会很有帮助。

例如:

注意:对于某些功能,您可能需要仔细检查参数:也许这里和那里有一些差异 - 但不是很多,我会说:mysql和mysqli都是基于相同的库 (libmysql ; 至少对于 PHP

例如:

  • 使用 mysql,您必须在连接后使用 mysql_select_db 来指示您要在哪个数据库上进行查询
  • 另一方面,mysqli 允许您将该数据库名称指定为mysqli_connect 的第四个参数。
  • 不过,如果您愿意,还可以使用 mysqli_select_db 函数。

完成后,尝试执行新版本的脚本...并检查一切是否正常;如果不是……是时候寻找错误了 ;-)

【讨论】:

  • 只要你想保留程序代码,从mysql切换到mysqli应该不会太难;但是,如果您的代码库不是太大(即,从一个 API 转到另一个并不意味着太多工作),您可能想要使用面向对象的 API;不过,这需要更多的工作......如果要完全重写 OO-API,我会使用 PDO 而不是 mysqli......
  • 我的意思是现在整天都在阅读 2,据我了解,这不是与 PDO 的主要区别,即 PDO 允许您使用不同的数据库系统。如果这是唯一的好处,那么在我的情况下它不会有太大帮助,因为我永远不需要为此应用程序使用不同的。
  • 有一些工具可以自动化迁移过程,例如:github.com/philip/MySQLConverterTool
  • 请注意,某些mysqli_* 程序函数的前两个参数已切换。旧样式为mysql_*(q, link, ...),新样式为mysqli_*(link, q, ...)
  • 虽然这是公认的答案,并回答了 question,但它没有提到这样一个事实,即这样的转换仍然会使您面临严重的 SQLi 安全漏洞(由于缺乏准备好的陈述)。我建议在这方面参考official PHP documentation 在 PHP 中使用准备好的语句。
【解决方案2】:

(我意识到这是旧的,但它仍然出现......)

如果您确实将mysql_* 替换为mysqli_*,请记住,整个负载的mysqli_* 函数都需要传递数据库链接。

例如:

mysql_query($query)

变成

mysqli_query($link, $query)

即需要大量检查。

【讨论】:

  • 对于未来的读者:在看到下面 2019 年 7 月的 Dharmans answer 之前,请不要停止阅读。 应该是这个问题的公认答案,恕我直言。
【解决方案3】:

mysql_* 函数升级到 MySQLi API 的终极指南

新 mysqli 扩展的原因是利用 MySQL 系统版本 4.1.3 和更新版本中的新功能。将现有代码从 mysql_* 更改为 mysqli API 时,您应该利用这些改进,否则您的升级工作可能会徒劳无功。
mysqli 扩展有很多好处,对 mysql 扩展的主要改进是:

  • 面向对象的界面
  • 支持准备好的语句
  • 增强的调试功能

mysql_* 函数升级到 MySQLi 时,重要的是要考虑这些特性,以及应该使用此 API 的方式的一些变化。

1。面向对象的接口与过程函数。

新的 mysqli 面向对象接口是对旧功能的重大改进,它可以使您的代码更清晰,更不容易受到印刷错误的影响。还有这个 API 的过程版本,但不鼓励使用它,因为它会导致代码可读性降低,更容易出错。

要使用 MySQLi 打开与数据库的新连接,您需要创建 MySQLi 类的新实例。

$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');

使用程序样式,它看起来像这样:

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');

请记住,只有前 3 个参数与 mysql_connect 中的相同。旧 API 中的相同代码是:

$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');

如果您的 PHP 代码依赖于 php.ini 中定义的默认参数的隐式连接,您现在必须打开 MySQLi 连接并在代码中传递参数,然后提供所有程序函数的连接链接或使用 OOP 样式.

更多信息见文章:How to connect properly using mysqli

2。支持预处理语句

这是一件大事。 MySQL 在 MySQL 4.1 (2004) 中增加了对本机准备语句的支持。准备好的语句是prevent SQL injection 的最佳方式。对原生预处理语句的支持被添加到 PHP 中是合乎逻辑的。只要数据需要与 SQL 语句一起传递,就应该使用准备好的语句(即WHEREINSERTUPDATE 是常见的用例)。

旧的 MySQL API 有一个用于转义 SQL 中使用的字符串的函数,称为 mysql_real_escape_string,但 it was never intended for protection against SQL injections 自然不应该用于此目的。
新的 MySQLi API 提供了一个替代函数 mysqli_real_escape_string 以实现向后兼容性,该函数与旧函数存在相同的问题,因此除非准备好的语句不可用,否则不应使用该函数。

旧的mysql_*方式:

$login = mysql_real_escape_string($_POST['login']);
$result = mysql_query("SELECT * FROM users WHERE user='$login'");

准备好的语句方式:

$stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
$stmt->bind_param('s', $_POST['login']);
$stmt->execute();
$result = $stmt->get_result();

MySQLi 中的准备好的语句对于初学者来说可能看起来有点反感。如果您正在开始一个新项目,那么决定使用更强大、更简单的PDO API 可能是个好主意。

3。增强的调试功能

一些老式的 PHP 开发人员习惯于手动检查 SQL 错误并直接在浏览器中显示它们作为调试的手段。然而,事实证明,这种做法不仅繁琐,而且存在安全风险。幸运的是 MySQLi 改进了错误报告功能。

MySQLi 能够将遇到的任何错误报告为 PHP 异常。 PHP 异常将在脚本中冒泡,如果未处理将立即终止它,这意味着错误语句之后的任何语句都不会被执行。该异常将触发 PHP 致命错误,并将表现为任何从 PHP 核心触发的错误,遵循 display_errorslog_errors 设置。要启用 MySQLi 异常,请使用行 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 并在您打开数据库连接之前将其插入。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');

如果你习惯写这样的代码:

$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
    die('Invalid query: ' . mysql_error());
}

$result = mysql_query('SELECT * WHERE 1=1') or die(mysql_error());

您不再需要在代码中使用die()

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');

$result = $mysqli->query('SELECT * FROM non_existent_table');
// The following line will never be executed due to the mysqli_sql_exception being thrown above
foreach ($result as $row) {
    // ...
}

如果由于某种原因您不能使用异常,MySQLi 具有等效的错误检索功能。您可以使用mysqli_connect_error() 检查连接错误,使用mysqli_error($mysqli) 检查任何其他错误。注意mysqli_error($mysqli)中的强制参数,或者坚持OOP风格并使用$mysqli-&gt;error

$result = $mysqli->query('SELECT * FROM non_existent_table') or trigger_error($mysqli->error, E_USER_ERROR);

查看这些帖子以获得更多解释:
mysqli or die, does it have to die?
How to get MySQLi error information in different environments?

4。其他变化

不幸的是,并非mysql_* 中的每个函数在 MySQLi 中都有对应的函数,只是在名称和连接链接中添加了一个“i”作为第一个参数。以下是其中的一些列表:

  • mysql_client_encoding() 已替换为 mysqli_character_set_name($mysqli)
  • mysql_create_db 没有对应的。改用准备好的语句或mysqli_query
  • mysql_drop_db 没有对应的。改用准备好的语句或mysqli_query
  • mysql_db_name & mysql_list_dbs 支持已被放弃,支持 SQL 的 SHOW DATABASES
  • mysql_list_tables 支持已被放弃,转而支持 SQL 的 SHOW TABLES FROM dbname
  • mysql_list_fields 支持已被放弃,转而支持 SQL 的 SHOW COLUMNS FROM sometable
  • mysql_db_query -> 使用mysqli_select_db() 然后查询或在查询中指定数据库名称
  • mysql_fetch_field($result, 5) -> 第二个参数(偏移量)在 mysqli_fetch_field 中不存在。您可以使用 mysqli_fetch_field_direct 记住返回的不同结果
  • mysql_field_flagsmysql_field_lenmysql_field_namemysql_field_table & mysql_field_type -> 已替换为 mysqli_fetch_field_direct
  • mysql_list_processes 已被删除。如果您需要线程 ID,请使用 mysqli_thread_id
  • mysql_pconnect 已替换为 mysqli_connect()p: 主机前缀
  • mysql_result -> 将mysqli_data_seek()mysqli_field_seek()mysqli_fetch_field() 结合使用
  • mysql_tablename 支持已被放弃以支持 SQL 的 SHOW TABLES
  • mysql_unbuffered_query 已被删除。有关更多信息,请参阅本文Buffered and Unbuffered queries

【讨论】:

  • 对于这种你所期待的问题,答案是一个很好的惊喜,而不是一个无用的圈外评论。相信会得到应有的认可。只是几个挑剔。还有 mysql_set_charset() ,只是一个事实检查;我不会责怪 mrs() “不足以防止 SQL 注入”。你不能责怪斧头没有锯你的原木。所以我宁愿把它说成“它从来都不是用来保护的,自然也不应该用于这个目的”
  • @YourCommonSense 谢谢,我已经更改了措辞。关于mysql_set_charset,它不适用于 MySQL
  • 出色的答案 - 并没有得到足够的支持。我将查看您的其他答案,看看您还做了哪些出色且值得支持的工作。非常感谢您在这个问题上花费的时间和精力。
【解决方案4】:

我总是处理这个 Where 的最简单方法

 $con = mysqli_connect($serverName,$dbusername,$dbpassword);

按以下顺序进行3步替换

  1. 所有“mysql_select_db(”与“mysqli_select_db($con,
  2. 所有“mysql_query(”与“mysqli_query($con,”和
  3. 所有“mysql_”和“mysqli_”。

这对我每次都有效

【讨论】:

  • 我会添加搜索所有function 字符串并将global $con; 放在函数内容的顶部,因为在函数外部定义的$con 默认情况下将不可用,因为PHP 中变量的作用域。
  • 不是一个完美的答案——有些函数仍然需要添加 $con 参数(例如 mysqi_affected_rows、mysqi_real_escape_string)——但很有帮助,因为它总结了所需的更改。
  • 另外不要忘记 mysql_error() 被更改为 mysqli_error($con)
【解决方案5】:

2020+ 答案

我创建了一个工具called Rector,用于处理即时升级。还有mysql → mysqli set

它处理:

  • 函数重命名

  • 不断重命名

  • 切换参数

  • 非 1:1 函数调用变化,例如

      $data = mysql_db_name($result, $row);
    

      mysqli_data_seek($result, $row);
      $fetch = mysql_fetch_row($result);
      $data = $fetch[0];
    

Rector如何使用?

1。通过 Composer 安装它

composer require rector/rector --dev

// or in case of composer conflicts
composer require rector/rector-prefixed --dev

2。在项目根目录下创建rector.php,设置Mysql to Mysqli

<?php

use Rector\Core\Configuration\Option;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {

    $parameters->set(Option::SETS, [
        SetList::MYSQL_TO_MYSQLI,
    ]);
};

3。让 Rector 运行,例如/src 目录只显示差异

vendor/bin/rector process src --dry-run

4。让Rector改代码

vendor/bin/rector process src

我已经在 2 个大型 PHP 项目上运行过它,并且运行良好。

【讨论】:

  • 它是否启用 mysqli 错误报告,是否切换到带有参数绑定的预处理语句?
  • 我已经在GitHub上详细解释了情况并提供了一些代码示例。您可以对它们执行您的校长规则,并查看它没有进行必要的更改。至少我按照这个答案中的描述做了,它只创建了损坏的代码。
  • 目前以上 composer 安装 0.8.56 的 rector,我得到 The "--set" option does not exist.
  • 嗨@Greg - 感谢您的报告。这个选项不再使用,所以我用rector.php config 更新了这个例子。它可以防止拼写错误并且更易于配置。让我知道它如何为您工作
  • 如果我没记错的话,我已经阅读了自己的文档,并按照建议组装了rector.php。不得不在网上搜索示例,但最后我能够在相关项目中创建一个单一的配置修复 mysql2mysqli。 $parameters-&gt;set(Option::SETS, [SetList::MYSQL_TO_MYSQLI]);
【解决方案6】:

如果是大型项目,需要更改很多文件,并且如果以前的项目版本的 PHP 是 5.6 而新版本是 7.1,您可以创建一个新文件 sql.php 并将其包含在标题中或您使用的地方它一直都需要sql连接。例如:

//local
$sql_host =     "localhost";      
$sql_username = "root";    
$sql_password = "";       
$sql_database = "db"; 


$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

// /* change character set to utf8 */
if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
    exit();
} else {
    // printf("Current character set: %s\n", $mysqli->character_set_name());
}
if (!function_exists('mysql_real_escape_string')) {
    function mysql_real_escape_string($string){
        global $mysqli;
        if($string){
            // $mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );            
            $newString =  $mysqli->real_escape_string($string);
            return $newString;
        }
    }
}
// $mysqli->close();
$conn = null;
if (!function_exists('mysql_query')) {
    function mysql_query($query) {
        global $mysqli;
        // echo "DAAAAA";
        if($query) {
            $result = $mysqli->query($query);
            return $result;
        }
    }
}
else {
    $conn=mysql_connect($sql_host,$sql_username, $sql_password);
    mysql_set_charset("utf8", $conn);
    mysql_select_db($sql_database);
}

if (!function_exists('mysql_fetch_array')) {
    function mysql_fetch_array($result){
        if($result){
            $row =  $result->fetch_assoc();
            return $row;
        }
    }
}

if (!function_exists('mysql_num_rows')) {
    function mysql_num_rows($result){
        if($result){
            $row_cnt = $result->num_rows;;
            return $row_cnt;
        }
    }
}

if (!function_exists('mysql_free_result')) {
    function mysql_free_result($result){
        if($result){
            global $mysqli;
            $result->free();

        }
    }
}

if (!function_exists('mysql_data_seek')) {
    function mysql_data_seek($result, $offset){
        if($result){
            global $mysqli;
            return $result->data_seek($offset);

        }
    }
}

if (!function_exists('mysql_close')) {
    function mysql_close(){
        global $mysqli;
        return $mysqli->close();
    }
}

if (!function_exists('mysql_insert_id')) {
    function mysql_insert_id(){
            global $mysqli;
            $lastInsertId = $mysqli->insert_id;
            return $lastInsertId;
    }
}

if (!function_exists('mysql_error')) {
    function mysql_error(){
        global $mysqli;
        $error = $mysqli->error;
        return $error;
    }
}

【讨论】:

  • 我应该如何使用它来测试mysqli函数?例如,如果 mysql_query 退出,则您的文件首先检查是否存在,如果用于 5.6,但如何测试 mysqli_query 是否有效?
  • 并使用它:
     $id_cat = (int)'4'; $sql = "从类别中删除 id='$id_cat' OR parent_id ='$id_cat'"; mysql_query($sql) or die('错误 SQL !
    '.$sql.'
    '.mysql_error());
【解决方案7】:

我暂时建议您使用PDO 进行 SQL 访问。

那么这只是更改驱动程序并确保 SQL 在新后端上工作的情况。理论上。数据迁移是一个不同的问题。

抽象数据库访问很棒。

【讨论】:

    【解决方案8】:

    我刚刚创建了同名函数来转换和覆盖到新的php7:

    $host =     "your host";      
    $un = "username";    
    $pw = "password";       
    $db = "database"; 
    
    $MYSQLI_CONNECT = mysqli_connect($host, $un, $pw, $db);
    
    function mysql_query($q) {
        global $MYSQLI_CONNECT;
        return mysqli_query($MYSQLI_CONNECT,$q);
    }
    
    function mysql_fetch_assoc($q) {
        return mysqli_fetch_assoc($q);
    }
    
    function mysql_fetch_array($q){
        return mysqli_fetch_array($q , MYSQLI_BOTH);
    }
    
    function mysql_num_rows($q){
        return mysqli_num_rows($q);
    }
    
    function mysql_insert_id() {
        global $MYSQLI_CONNECT;
        return mysqli_insert_id($MYSQLI_CONNECT);
    }
    
    function mysql_real_escape_string($q) {
        global $MYSQLI_CONNECT;
        return mysqli_real_escape_string($MYSQLI_CONNECT,$q);
    }
    

    它对我有用,我希望它对大家有用,如果我弄错了,请纠正我。

    【讨论】:

      【解决方案9】:

      这里有一个完整的教程,如果您需要在 PHP 升级后重新制作网站,如何快速制作它。我在为我的客户将主机从 5.4 (OMG!!!) 升级到 7.x PHP 版本后使用它。

      这是一种解决方法,最好使用重写所有代码 PDO 或 mysqli 类。

      1。连接定义

      首先,您需要将连接放入一个新变量$link$con,或任何您想要的。

      示例

      更改连接:

      @mysql_connect($host, $username, $password) or die("Error message...");
      @mysql_select_db($db);
      

      @mysql_connect($host, $username, $password, $db) or die("Error message...");
      

      到:

      $con = mysqli_connect($host, $username, $password, $db) or die("Error message...");
      

      2。 mysql_* 修改

      使用 Notepad++ 我使用“在文件中查找”(Ctrl + Shift + f):

      按以下顺序我选择“在文件中替换”:

      1. mysql_query(->mysqli_query($con,

      2. mysql_error() -> mysqli_error($con)

      3. mysql_close() -> mysqli_close($con)

      4. mysql_insert_id() -> mysqli_insert_id($con)

      5. mysql_real_escape_string(->mysqli_real_escape_string($con,

      6. mysql_ -> mysqli_

      3。调整

      如果您遇到错误,可能是因为您的 $con 无法从您的函数中访问。

      您需要在所有函数中添加global $con;,例如:

      function my_function(...) {
          global $con;
          ...
      }
      

      在 SQL 类中,您将连接到 $this-&gt;con 而不是 $con。并在每个函数调用中替换它(例如:mysqli_query($con, $query);

      【讨论】:

      • 这些 API 非常不同,您无法通过搜索和替换进行升级。功能和使用方式都发生了变化。如果您只进行搜索和替换,那么您将错过删除 mysql_* API 的重点
      • 这不是解决方案,但是当您继承一个网站并且没有时间重写所有代码时,这是一种解决方法@Dharman 并且它正在工作,
      • 必须添加一些其他需要修改的命令,我发现很难... mysql_insert_id() 变成 mysqli_insert_id($con) 和 mysql_real_escape_string($var) 变成 mysqli_real_escape_string($con, $变量);否则他们不工作......
      • 感谢@LaurensSwart 我刚刚将它添加到 mysql_* 修改程序中。
      【解决方案10】:

      如果您的项目中有很多文件要更改,您可以创建具有相同名称的函数,如 mysql 函数, 并在函数中进行转换,如下代码:

      $sql_host =     "your host";      
      $sql_username = "username";    
      $sql_password = "password";       
      $sql_database = "database";       
      
      
      
      $mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );
      
      
      /* check connection */
      if ($mysqli->connect_errno) {
          printf("Connect failed: %s\n", $mysqli->connect_error);
          exit();
      }
      
      
      function mysql_query($query){
          $result = $mysqli->query($query);
          return $result;
      
      }
      
      function mysql_fetch_array($result){
          if($result){
              $row =  $result->fetch_assoc();
               return $row;
             }
      }
      
      function mysql_num_rows($result){
          if($result){
               $row_cnt = $result->num_rows;;
               return $row_cnt;
             }
      }
      

      【讨论】:

        【解决方案11】:

        尽管这个话题已有十年之久,但我仍然经常需要对依赖于 mysql 扩展的现有应用程序进行“备份”——最初的程序员懒得重构他们所有的代码,只是告诉客户确保他们运行最新的 PHP 5.6 版本。

        PHP 5.6 现已正式弃用;换句话说,开发人员有十年的时间来摆脱对mysql 的依赖并转向PDO(或者,好吧,mysqli...)。但是...更改这么多遗留代码的成本很高,而且并不是每个经理都愿意花费数不清的时间来“修复”具有数十万行代码的项目。

        我搜索了很多解决方案,就我而言,我经常使用@esty-shlomovitz 提出的解决方案——但与此同时,我发现了更好的解决方案:

        https://www.phpclasses.org/package/9199-PHP-Replace-mysql-functions-using-the-mysqli-extension.html

        (您需要注册才能下载,但只需一分钟)

        这只是两个文件,它们充当整个 mysql 扩展的直接替换,并且非常巧妙地模拟了几乎所有内容(使用 mysqli),而无需担心太多。当然,这不是一个完美的解决方案,但很可能它适用于 99% 的所有情况。

        此外,还可以在此处找到处理迁移琐事的好教程(列出迁移时的许多常见陷阱):https://www.phpclasses.org/blog/package/9199/post/3-Smoothly-Migrate-your-PHP-Code-using-the-Old-MySQL-extension-to-MySQLi.html

        (如果您在 2030 年阅读本文并且 PHPclasses 网站已关闭,那么您可以随时尝试 archive.org :-)

        更新: @crashwap 在下面的 cmets 中指出,您也可以直接从 GitHub 获得相同的代码。感谢您的提示,@crashwap :-)

        【讨论】:

        • 为了省去 phpclasses.org 注册/登录系统的麻烦(除非你提供 facebook/github/SO/etc auth,否则基本上不起作用),我也找到了确切的相同的代码available here(请注意,您需要两个文件:.class.php 和 .func.php - .class 文件将 include() .func 文件)。
        • @crashwap 谢谢!我已更改答案以添加您的提示。不错的谷歌搜索,顺便说一句——比我的好多了,哈哈
        【解决方案12】:

        类似于 dhw 的回答,但您不必担心在所有函数中将链接设置为全局,因为这有点困难:

        只需在您的配置文件中使用此代码:

        $sv_connection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
        $db_connection = mysqli_select_db ($sv_connection, $dbname);
        mysqli_set_charset($sv_connection, 'utf8'); //optional
        
        // Check connection
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
            exit();
        }
        
        
        function mysqljx_query($q){
            global $sv_connection;
            return mysqli_query($sv_connection, $q);
        }
        
        function mysqljx_fetch_array($r){
            return mysqli_fetch_array($r);
        }
        
        function mysqljx_fetch_assoc($r){
            return mysqli_fetch_assoc($r);
        }
        
        function mysqljx_num_rows($r){
            return mysqli_num_rows($r);
        }
        
        function mysqljx_insert_id(){
            global $sv_connection;
            return mysqli_insert_id($sv_connection);
        }
        
        function mysqljx_real_escape_string($string){
            global $sv_connection;
            return mysqli_real_escape_string($sv_connection, $string);
        }
        

        -现在搜索包含“mysql_”的 php 文件(我使用了总指挥官 - Alt+F7,搜索“*.php”,查找文本“mysql_”,开始搜索,Feed to listbox)

        -将它们全部拖放到记事本++中,然后按CTRL + H,查找内容:“mysql_”,替换为“mysqljx_”,“全部替换所有打开的文档”

        如果您担心您有其他功能而不是上面列出的功能,只需将“mysql_query”替换为“mysqljx_query”,然后将 mysql_fetch_array 替换为“mysqljx_fetch_array”等。)然后再次搜索“mysql_”并如果它仍然存在,则它是一个未覆盖的功能,您可以添加它与其他功能相同..

        就是这样

        【讨论】:

          最近更新 更多