Không được dùng nữa: mysql_connect ()


95

Tôi nhận được cảnh báo này, nhưng chương trình vẫn chạy chính xác.

Mã MySQL đang hiển thị cho tôi một thông báo bằng PHP:

Không được dùng nữa: mysql_connect (): Phần mở rộng mysql không được dùng nữa và sẽ bị xóa trong tương lai: hãy sử dụng mysqli hoặc PDO thay thế trong C: \ xampp \ htdocs \ task \ media \ new \ connect.inc.php trên dòng 2

connect.inc.phpTrang của tôi là

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

Điều này có nghĩa là gì và làm cách nào để loại bỏ thông báo?


5
Sử dụng các hàm mysqli_ * hoặc PDO !!!!
Krish R


3
Cập nhật liên quan, các chức năng mysql_ * đã bị loại bỏ trong PHP7. Sử dụng MySQLi để thay thế.
techdude

Câu trả lời:


142

Có một số giải pháp cho vấn đề của bạn.

Cách với MySQLi sẽ như thế này:

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

Để chạy các truy vấn cơ sở dữ liệu cũng đơn giản và gần giống với cách cũ:

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

Tắt tất cả các cảnh báo không dùng nữa bao gồm cả chúng từ mysql_ *:

<?php
error_reporting(E_ALL ^ E_DEPRECATED);

Vị trí tệp và dòng chính xác cần được thay thế là "/System/Startup.php> dòng: 2" error_reporting (E_All); thay thế bằng error_reporting (E_ALL ^ ​​E_DEPRECATED);


34

Bạn có thể xóa cảnh báo bằng cách thêm '@' trước mysql_connect.

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

nhưng như cảnh báo đang nói với bạn, hãy sử dụng mysqli hoặc PDO vì phần mở rộng mysql sẽ bị xóa trong tương lai.


1
Tôi thấy bạn không chỉ áp dụng các phương pháp xấu cho bản thân mà thậm chí còn bảo người khác làm như vậy
Your Common Sense

29
Ẩn cảnh báo là một ĐIỀU TỐT. Nó giúp chương trình tiếp tục hoạt động và các hàm mysql_xxxx có nghĩa là không có vấn đề gì ngay bây giờ vì chúng hoạt động tốt trong phiên bản hiện tại. Tất cả những gì bạn đang nói về việc nó không được dùng nữa là MỘT PHẦN CỦA THÔNG ĐIỆP LỖI, vì vậy không phải là điều khôn ngoan khi lặp lại. Mọi người có thể thấy nó không được chấp nhận, vâng, cảm ơn bạn, xin vui lòng tiếp theo. Trong tương lai, các lệnh gọi hàm mysql rõ ràng sẽ được thay thế. Cho đến lúc đó, ẩn cảnh báo là một lời khuyên thiết thực để cho phép trang web hoạt động trong khi chúng tôi đang âm thầm thay thế các lệnh gọi mysql_xxx bằng một thứ gì đó khác trong nền. Đừng mê tín.
dkellner

5
Nhận xét cực kỳ hữu ích ở đây .. Để lại các cảnh báo không dùng nữa và phá vỡ mã hoạt động của bạn? Tuyệt vời .. Tất nhiên ẩn cảnh báo không phải là lý tưởng nhưng vẫn nên làm để giữ cho mã hoạt động. Một nhà phát triển giỏi sẽ vẫn theo dõi mã không dùng nữa và lên lịch cho bản cập nhật trong tương lai.
squrockad

1
ngăn chặn lỗi / cảnh báo không phải là cách điều này được khắc phục - nếu bạn có cảnh báo / lỗi thô được hiển thị cho người dùng trên máy chủ sản xuất của mình, bạn đang làm sai - nếu bạn chỉ có máy chủ sản xuất và không có môi trường phát triển để thử nghiệm, bạn ' tái làm nó wronger - nếu bạn không sửa lỗi / cảnh báo trong phát triển trước khi phát hành để sản xuất, bạn đang làm nó wrongest
HorusKol

1
@sturrockad Một nhà phát triển giỏi sẽ xử lý lỗi tốt hơn để chúng không bao giờ bị rò rỉ ra công chúng và chỉ đăng nhập vào back-end để các nhà phát triển xem. Nếu bạn vẫn vi phạm mã trực tiếp bằng cách phát hành thông báo lỗi, có lẽ bạn nên suy nghĩ lại toàn bộ trang web của mình. Đó không phải là một cái cớ hợp lệ để ngăn chặn các cảnh báo.
animuson

10

Để loại bỏ thông báo ngừng sử dụng cho riêng điều này (và luôn được thông báo về các trường hợp không dùng nữa trong mã của bạn), bạn có thể đặt tiền tố kết nối bằng @:

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

Lưu ý rằng với PHP 7+, điều này sẽ không hoạt động nữa (do đó, phản đối của tôi); nó không phải là một 'giải pháp' ...
Gwyneth Llewelyn

OP nói về một thông báo không dùng nữa chỉ được tạo bởi PHP 5.5 và 5.6. Giải pháp nằm trong môi trường mà thông báo OP được hiển thị.
IanMcL

8

Các tính năng không được dùng nữa trong PHP 5.5.x

Phần mở rộng MySQL gốc hiện không được dùng nữa và sẽ tạo ra E_DEPRECATEDlỗi khi kết nối với cơ sở dữ liệu. Thay vào đó, hãy sử dụng các phần mở rộng ** MYSQLi hoặc PDO_MySQL . **

Cú pháp:

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

Ngoài ra, thay thế tất cả các mysql_*chức năng thành mysqli_*các chức năng

thay vì

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

6

Cảnh báo này được hiển thị vì một tiện ích mở rộng mới đã xuất hiện. Nó cho rằng bạn vẫn có thể sử dụng cái cũ nhưng trong một số trường hợp thì không thể.

Tôi chỉ cho bạn cách tôi thực hiện kết nối với cơ sở dữ liệu. Bạn chỉ cần thay đổi giá trị của các biến.

Tệp kết nối của tôi: connect.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);
?>

Tiện ích mở rộng cũng thay đổi khi thực hiện truy vấn.

Tệp truy vấn: "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");    
?>

Cách này là sử dụng Tiện ích mở rộng cải tiến MySQL , nhưng bạn có thể sử dụng PDO (Đối tượng dữ liệu PHP) .

Phương pháp đầu tiên chỉ có thể được sử dụng với cơ sở dữ liệu MySQL, nhưng PDO có thể quản lý các loại cơ sở dữ liệu khác nhau.

Tôi sẽ đưa ra một ví dụ nhưng cần phải nói rằng tôi chỉ sử dụng cái đầu tiên, vì vậy hãy sửa cho tôi nếu có bất kỳ lỗi nào.

Tệp kết nối PDO của tôi: "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);
?>

Tệp truy vấn (PDO): "example.php"

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

Để kết thúc, chỉ cần nói rằng tất nhiên bạn có thể ẩn cảnh báo nhưng đó không phải là một ý kiến ​​hay vì có thể giúp bạn tiết kiệm thời gian trong tương lai nếu có lỗi xảy ra (tất cả chúng ta đều biết lý thuyết nhưng nếu bạn làm việc nhiều giờ đôi khi .. . não không có ^^).


4

Đó là do bạn đang sử dụng PHP 5.5 hoặc máy chủ web của bạn đã được nâng cấp lên 5.5.0.

Các mysql_*chức năng đã không được chấp nhận kể từ 5.5.0

nhập mô tả hình ảnh ở đây

Source




1

Cảnh báo "không được dùng nữa" nói chung có nghĩa là bạn đang cố gắng sử dụng chức năng đã lỗi thời. Điều đó không có nghĩa là mã của bạn sẽ không hoạt động, nhưng bạn nên xem xét việc cấu trúc lại.

Trong trường hợp của bạn, hàm mysql_ không được dùng nữa. Nếu bạn muốn biết thêm về điều đó thì đây là lời giải thích hữu ích: Tại sao tôi không nên sử dụng các hàm mysql_ * trong PHP?


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

Điều này sẽ giải quyết vấn đề của bạn.


1

Lớp PDO thay thế các phương thức này. Ví dụ cho Mysql hoặc 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
                ));

Nguồn: Lớp PDO


1

Nếu bạn đã thực hiện mã hóa của mình thì

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

là một lựa chọn tốt nhưng nếu bạn đang bắt đầu thì chắc chắn bạn nên sử dụng mysqli.


1

Chà, tôi vừa gặp phải thông báo như vậy hôm nay khi tôi chuyển sang dịch vụ lưu trữ mới! Dù sao tôi đã cố gắng thay đổi "mySQL" thành "mySQLi" nhưng không hoạt động, vì vậy tôi đã thực hiện điều này:

<?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);
?>

Mẹo là tắt báo cáo lỗi :)

# Turn off all error reporting
error_reporting(0);

Đối với PHP 7+, bạn có thể sử dụng mã này thay thế:

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

Cảm ơn


1
Xin chào, Có, đối với PHP 7+, bạn có thể sử dụng cái này ini_set('display_errors', 0); ini_set('log_errors', 1);. Tôi sẽ cập nhật câu trả lời ở trên. Cảm ơn.
Trò chơi Mizo

-3

đưa cái này vào trang php của bạn.

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

Lưu ý rằng với PHP 7+, điều này sẽ không hoạt động nữa (do đó, phản đối của tôi); nó không phải là một 'giải pháp' ...
Gwyneth Llewelyn

-5

Thêm một @tác phẩm cho tôi!

Tôi đã thử nghiệm với error_reporting(E_ALL ^ E_DEPRECATED);


1
Bạn sẽ không giải quyết lỗi này, bạn chỉ che giấu thông điệp
Leonardo Sapuy

Lưu ý rằng với PHP 7+, điều này sẽ không hoạt động nữa (do đó, phản đối của tôi); nó không phải là một 'giải pháp' ...
Gwyneth Llewelyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.