【问题标题】:Deprecated: mysql_connect() [duplicate]已弃用:mysql_connect() [重复]
【发布时间】:2014-03-14 20:41:50
【问题描述】:

我收到此警告,但程序仍可正常运行。

MySQL 代码在 PHP 中显示一条消息:

不推荐使用:mysql_connect():不推荐使用 mysql 扩展,并且 将来将被删除:使用 mysqli 或 PDO 代替 C:\xampp\htdocs\task\media\new\connect.inc.php 在第 2 行

我的connect.inc.php 页面是

<?php
  $connect = mysql_connect('localhost','root','');
  mysql_select_db('dbname');
?>

这是什么意思,我该如何消除该消息?

【问题讨论】:

  • 使用 mysqli_* 函数或 PDO !!!
  • 相关更新,php7中已移除mysql_*函数。请改用 MySQLi。

标签: php mysql function deprecated


【解决方案1】:

您的问题有几个解决方案。

使用 MySQLi 的方式是这样的:

<?php
$connection = mysqli_connect('localhost', 'username', 'password', 'database');

运行数据库查询也很简单,几乎与旧方法相同:

<?php
// Old way
mysql_query('CREATE TEMPORARY TABLE `table`', $connection);
// New way
mysqli_query($connection, 'CREATE TEMPORARY TABLE `table`');

关闭所有已弃用的警告,包括来自 mysql_* 的警告:

<?php
error_reporting(E_ALL ^ E_DEPRECATED);

需要替换的确切文件和行位置是 "/System/Startup.php > line: 2 " error_reporting(E_All);替换为 error_reporting(E_ALL ^ E_DEPRECATED);

【讨论】:

    【解决方案2】:

    您可以通过在 mysql_connect 之前添加“@”来删除警告。

    @mysql_connect('localhost','root','');
    

    但是正如警告告诉你的那样,使用 mysqli 或 PDO,因为 mysql 扩展将在未来被删除。

    【讨论】:

    • 我看到你不仅自己一直在使用不良做法,甚至还告诉别人这样做
    • 隐藏警告是一件好事。它使程序继续运行,并且 mysql_xxxx 函数现在没有问题,因为它们在当前版本中运行良好。你所说的关于它被弃用的只是错误消息的一部分,所以重复它不是一个明智的事情。每个人都可以看到它已被弃用,是的,谢谢,请下一个。未来,mysql的函数调用显然会被取代。在那之前,隐藏警告是一个实用的建议,可以让网站在我们默默地用后台的其他东西替换 mysql_xxx 调用时运行。不要迷信。
    • 在这里非常有用的 cmets.. 留下不推荐使用的警告并破坏您的实时代码?很好..当然隐藏警告并不理想,但仍然应该这样做以保持代码正常工作。优秀的开发人员仍会跟踪已弃用的代码并将其安排在未来的更新中。
    • 错误/警告抑制不是解决方法 - 如果您在生产服务器上向用户显示原始警告/错误,那么您做错了 - 如果您只有生产服务器并且没有用于测试的开发环境,你做错了 - 如果你没有在发布到生产之前修复开发中的错误/警告,你做错了
    • @sturrockad 一个优秀的开发人员会更好地处理错误,因此它们永远不会泄露给公众,只会登录到后端供开发人员查看。如果您仍然通过向野外发布错误消息来破坏实时代码,您可能应该重新考虑您的整个网站。这不是压制警告的有效借口。
    【解决方案3】:

    要单独禁止此消息的弃用消息(并随时了解代码中的其他弃用),您可以在连接前加上 @:

    <?php
    $connect = @mysql_connect('localhost','root','');
    mysql_select_db('dbname');
    ?> 
    

    【讨论】:

    • 请注意,对于 PHP 7+,这将不再有效(因此我不赞成);这不是一个“解决方案”......
    • OP 是关于仅由 PHP 5.5 和 5.6 生成的弃用消息。该解决方案位于显示 OP 消息的环境中。
    • PHP 5.* 已完全停产,任何仅在 PHP 5 中起作用的代码本质上是不安全的,不应在任何生产环境中使用
    【解决方案4】:

    PHP 5.5.x 中已弃用的功能

    原始 MySQL 扩展现已弃用,在连接到数据库时会生成 E_DEPRECATED 错误。 改为使用 **MYSQLiPDO_MySQL 扩展名。**

    语法:

    <?php
      $connect = mysqli_connect('localhost', 'user', 'password', 'dbname');
    

    另外,将所有 mysql_* 函数替换为 mysqli_* 函数

    而不是

    <?php
     $connect = mysql_connect('localhost','root','');
      mysql_select_db('dbname');
    ?> 
    

    【讨论】:

      【解决方案5】:

      显示此警告是因为出现了新的扩展程序。 假设您仍然可以使用旧的,但在某些情况下这是不可能的。

      我向您展示了我如何与数据库进行连接。您只需更改变量的值。

      我的连接文件:connection.php

      <?php    
       $host='IP or Server Name (usually "localhost") ';
       $user='Database user';
       $password='Database password';
       $db='Database name';
      
       //PHP 5.4 o earlier (DEPRECATED)
       $con = mysql_connect($host,$user,$password) or exit("Connection Error");
       $connection = mysql_select_db($db, $con);
      
       //PHP 5.5 (New method)
       $connection =  mysqli_connect($host,$user,$password,$db);
      ?>
      

      执行查询时扩展名也会发生变化。

      查询文件:“example.php”

      <?php
       //First I call for the connection
       require("connection.php");
      
       // ... Here code if you need do something ...
      
       $query = "Here the query you are going to perform";
      
       //QUERY PHP 5.4 o earlier (DEPRECATED)
       $result = mysql_query ($query) or exit("The query could not be performed");
      
       //QUERY PHP 5.5 (NEW EXTENSION)
       $result = mysqli_query ($query) or exit("The query could not be performed");    
      ?>
      

      这种方式是使用MySQL改进扩展,但你可以使用PDO (PHP Data Objects)

      第一种方法只能用于 MySQL 数据库,但 PDO 可以管理不同类型的数据库。

      我将举一个例子,但有必要说我只使用第一个,所以如果有任何错误,请纠正我。

      我的 PDO 连接文件:“PDOconnection.php”

      <?php
       $hostDb='mysql:host= "Here IP or Server Name";dbname="Database name" ';
       $user='Database user';
       $password='Database password';
      
       $connection = new PDO($hostDb, $user, $password);
      ?>
      

      查询文件 (PDO):"example.php"

      <?php
       $query = "Here the query you are going to perform";
       $result=$connection->$query;
      ?>
      

      最后只是说你当然可以隐藏警告,但这不是一个好主意,因为如果发生错误可以帮助你在未来节省时间(我们都知道这个理论,但如果你工作很多小时有时......大脑不在那儿^^)。

      【讨论】:

        【解决方案6】:

        那是因为您使用的是 PHP 5.5,否则您的网络服务器将升级到 5.5.0。

        mysql_* 函数自 5.5.0 起已被弃用

        Source

        【讨论】:

          【解决方案7】:

          mysql_*,自 PHP v5.5.0 起为 officially deprecated,将来会被删除。

          使用mysqli_*函数或pdo

          阅读甲骨文Converting to MySQLi

          【讨论】:

            【解决方案8】:

            这只是一个警告,告诉您开始使用更新的方法连接到您的数据库,例如 pdo 对象

            http://code.tutsplus.com/tutorials/php-database-access-are-you-doing-it-correctly--net-25338

            说明书在这里

            http://www.php.net/manual/en/book.pdo.php

            【讨论】:

              【解决方案9】:

              警告“已弃用”通常意味着您正在尝试使用已过时的功能。这并不意味着您的代码将无法工作,但您应该考虑重构。

              在你的情况下,函数 mysql_ 已被弃用。如果你想了解更多,这里已经有很好的解释了:Why shouldn't I use mysql_* functions in PHP?

              【讨论】:

                【解决方案10】:
                <?php 
                $link = mysqli_connect('localhost','root',''); 
                if (!$link) { 
                    die('Could not connect to MySQL: ' . mysqli_error()); 
                } 
                echo 'Connection OK'; mysqli_close($link); 
                ?>
                

                这将解决您的问题。

                【讨论】:

                  【解决方案11】:

                  PDO 类替换了这些方法。 Mysql 或 MariaDB 示例:

                  $BDD_SQL = new PDO('mysql:host='.BDD_SQL_SERVER.';dbname='.BDD_SQL_BASE.';charset=utf8', 
                          BDD_SQL_LOGIN, BDD_SQL_PWD, 
                          array(
                            PDO::ATTR_EMULATE_PREPARES => false,
                            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //launch exception if error
                            PDO::ATTR_DEFAULT_FETCH_MODE=> PDO::FETCH_ASSOC
                                  ));
                  

                  来源:PDO Class

                  【讨论】:

                    【解决方案12】:

                    如果你已经完成了编码,那么

                    ini_set("error_reporting", E_ALL & ~E_DEPRECATED); 
                    

                    是不错的选择,但如果你刚开始,那么绝对应该使用 mysqli。

                    【讨论】:

                      【解决方案13】:

                      好吧,我今天刚搬到新主机时遇到了这样的消息!无论如何,我试图将“mySQL”更改为“mySQLi”但没有工作,所以我这样做了:

                      <?php
                      # FileName="Connection_php_mysql.htm"
                      # Type="MYSQL"
                      # HTTP="true"
                      # Turn off all error reporting
                      error_reporting(0);
                      $connect_myconn = "Database Connection";
                      $hostname_myconn = "localhost";
                      $database_myconn = "db name";
                      $username_myconn = "user name";
                      $password_myconn = "pass";
                      $myconn = mysql_connect($hostname_myconn, $username_myconn, $password_myconn) or die("<h1 style=margin:0;>A MySQL error has occurred.</h1><p><b>Your Query:</b> " . $connect_myconn . "<br /> <b>Error Number:</b> (" . mysql_errno() . ")</p>" . mysql_error());
                      mysql_select_db($database_myconn, $myconn);
                      ?>
                      

                      诀窍是关闭错误报告:)

                      # Turn off all error reporting
                      error_reporting(0);
                      

                      对于 PHP 7+,您可以改用以下代码:

                      ini_set('display_errors', 0);
                      ini_set('log_errors', 1);
                      

                      谢谢

                      【讨论】:

                      • 嗨,是的,对于 PHP 7+,您可以使用 ini_set('display_errors', 0); ini_set('log_errors', 1);。我会更新上面的答案。谢谢。
                      【解决方案14】:

                      把它放在你的 php 页面中。

                      ini_set("error_reporting", E_ALL & ~E_DEPRECATED); 
                      

                      【讨论】:

                      • 请注意,对于 PHP 7+,这将不再有效(因此我投反对票);这不是一个“解决方案”......
                      【解决方案15】:

                      添加@ 对我有用!

                      我用error_reporting(E_ALL ^ E_DEPRECATED);测试过

                      【讨论】:

                      • 你没有解决错误,你只是隐藏了消息
                      • 请注意,对于 PHP 7+,这将不再有效(因此我投反对票);这不是一个“解决方案”......
                      猜你喜欢
                      • 1970-01-01
                      • 2016-06-18
                      • 2017-05-14
                      • 1970-01-01
                      • 2013-05-08
                      • 2017-10-06
                      • 2021-09-11
                      • 1970-01-01
                      • 2020-04-20
                      相关资源
                      最近更新 更多