Hướng dẫn mysql_query vs mysqli_query - mysql_query so với mysqli_query

Hướng dẫn cuối cùng để nâng cấp các $mysqli = mysqli_connect($host, $user, $password, $dbName); mysqli_set_charset($mysqli, 'utf8mb4'); 0chức năng lên MySQLi API

Lý do cho phần mở rộng mysqli mới là để tận dụng các tính năng mới có trong hệ thống MySQL phiên bản 4.1.3 và mới hơn. Khi thay đổi mã hiện tại của bạn từ

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
0API mysqli, bạn nên tận dụng những cải tiến này, nếu không nỗ lực nâng cấp của bạn có thể vô ích. Phần mở rộng mysqli có một số lợi ích, những cải tiến chính so với phần mở rộng mysql là:
Phần mở rộng mysqli có một số lợi ích, những cải tiến chính so với phần mở rộng mysql là:

  • Giao diện hướng đối tượng
  • Hỗ trợ cho các báo cáo đã soạn sẵn
  • Nâng cao khả năng gỡ lỗi

Khi nâng cấp từ các

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
0chức năng lên MySQLi, điều quan trọng là phải xem xét các tính năng này, cũng như một số thay đổi trong cách API này nên được sử dụng.

1. Giao diện hướng đối tượng so với các chức năng thủ tục.

Giao diện hướng đối tượng mysqli mới là một cải tiến lớn so với các chức năng cũ hơn và nó có thể làm cho mã của bạn sạch hơn và ít bị lỗi đánh máy hơn. Ngoài ra còn có phiên bản thủ tục của API này, nhưng việc sử dụng nó không được khuyến khích vì nó dẫn đến mã ít đọc hơn, dễ bị lỗi hơn.

Để mở kết nối mới với cơ sở dữ liệu với MySQLi, bạn cần tạo phiên bản mới của lớp MySQLi.

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

Sử dụng kiểu thủ tục, nó sẽ trông như thế này:

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

Hãy nhớ rằng chỉ có 3 tham số đầu tiên giống như trong

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
3. Mã tương tự trong API cũ sẽ là:

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

Nếu mã PHP của bạn dựa trên kết nối ngầm với các tham số mặc định được xác định trong php.ini, bây giờ bạn phải mở kết nối MySQLi chuyển các tham số trong mã của bạn, sau đó cung cấp liên kết kết nối đến tất cả các hàm thủ tục hoặc sử dụng kiểu OOP.

Để biết thêm thông tin, hãy xem bài viết: Cách kết nối đúng cách bằng mysqli

2. Hỗ trợ cho các báo cáo đã soạn sẵn

Đây là một vấn đề lớn. MySQL đã hỗ trợ thêm cho các câu lệnh chuẩn bị sẵn trong MySQL 4.1 (2004). Các câu lệnh chuẩn bị sẵn là cách tốt nhất để ngăn chặn SQL injection . Nó chỉ hợp lý khi hỗ trợ cho các câu lệnh được chuẩn bị sẵn đã được thêm vào PHP. Các câu lệnh chuẩn bị sẵn nên được sử dụng bất cứ khi nào dữ liệu cần được truyền cùng với câu lệnh SQL (tức là

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
4,
$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
5hoặc
$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
6là các trường hợp sử dụng thông thường).

MySQL API cũ có một chức năng để thoát khỏi các chuỗi được sử dụng trong SQL được gọi

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
7, nhưng nó không bao giờ nhằm mục đích bảo vệ chống lại việc tiêm SQL và đương nhiên không nên được sử dụng cho mục đích này. API MySQLi mới cung cấp một hàm thay thế
$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
8cho khả năng tương thích ngược, hàm này gặp phải các vấn đề tương tự như hàm cũ và do đó không nên được sử dụng trừ khi không có sẵn các câu lệnh đã chuẩn bị.
API MySQLi mới cung cấp một hàm thay thế
$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
8cho khả năng tương thích ngược, hàm này gặp phải các vấn đề tương tự như hàm cũ và do đó không nên được sử dụng trừ khi không có sẵn các câu lệnh đã chuẩn bị.

Cách mysql_ * cũ:

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

Cách tuyên bố đã chuẩn bị:

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

Các câu lệnh chuẩn bị sẵn trong MySQLi có thể hơi khó hiểu đối với người mới bắt đầu. Nếu bạn đang bắt đầu một dự án mới thì quyết định sử dụng API PDO mạnh hơn và đơn giản hơn có thể là một ý tưởng hay.

3. Khả năng gỡ lỗi nâng cao

Một số nhà phát triển PHP cũ đã quen với việc kiểm tra lỗi SQL theo cách thủ công và hiển thị chúng trực tiếp trong trình duyệt như một phương tiện gỡ lỗi. Tuy nhiên, thực tế như vậy hóa ra không chỉ cồng kềnh mà còn có nguy cơ bảo mật. Rất may, MySQLi đã cải thiện khả năng báo cáo lỗi.

MySQLi có thể báo cáo bất kỳ lỗi nào mà nó gặp phải dưới dạng ngoại lệ PHP. Các ngoại lệ PHP sẽ bong bóng trong tập lệnh và nếu không được xử lý sẽ kết thúc nó ngay lập tức, có nghĩa là không có câu lệnh nào sau câu lệnh có lỗi sẽ được thực thi. Ngoại lệ sẽ kích hoạt lỗi PHP Fatal và sẽ hoạt động như bất kỳ lỗi nào được kích hoạt từ lõi PHP tuân theo các cài đặt

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
9và
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
0. Để kích hoạt các ngoại lệ MySQLi, hãy sử dụng dòng
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
1và chèn nó ngay trước khi bạn mở kết nối DB.

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

Nếu bạn đã quen viết mã như:

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

hoặc là

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

bạn không cần phải nhập

$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
2mã của mình nữa.

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) {
    // ...
}

Nếu vì lý do nào đó bạn không thể sử dụng ngoại lệ, MySQLi có các chức năng tương đương để truy xuất lỗi. Bạn có thể sử dụng

$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
3để kiểm tra lỗi kết nối và
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
4bất kỳ lỗi nào khác. Hãy chú ý đến đối số bắt buộc trong
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
4hoặc cách khác là bám vào kiểu và sử dụng OOP
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
6.

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

Xem các bài viết này để giải thích thêm: mysqli hoặc chết, nó có phải chết không? Làm cách nào để lấy thông tin lỗi MySQLi trong các môi trường khác nhau?
mysqli hoặc chết, nó có phải chết không?
Làm cách nào để lấy thông tin lỗi MySQLi trong các môi trường khác nhau?

4. Các thay đổi khác

Thật không may, không phải mọi hàm từ

$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
0đều có bản sao của nó trong MySQLi chỉ với một chữ "i" được thêm vào tên và liên kết kết nối làm tham số đầu tiên. Dưới đây là danh sách một số trong số họ:

  • $link = mysql_connect($host, $user, $password);
    mysql_select_db($dbName, $link);
    mysql_query('SET NAMES utf8');
    
    8 đã được thay thế bởi
    $link = mysql_connect($host, $user, $password);
    mysql_select_db($dbName, $link);
    mysql_query('SET NAMES utf8');
    
    9
  • $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    0không có đối tác. Sử dụng chuẩn bị báo cáo hoặc
    $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    1thay
  • $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    2không có đối tác. Sử dụng chuẩn bị báo cáo hoặc
    $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    1thay
  • $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    4&
    $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    5hỗ trợ đã bị loại bỏ để ủng hộ SQL
    $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    6
  • $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    7 hỗ trợ đã bị loại bỏ để ủng hộ SQL
    $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    8
  • $login = mysql_real_escape_string($_POST['login']);
    $result = mysql_query("SELECT * FROM users WHERE user='$login'");
    
    9 hỗ trợ đã bị loại bỏ để ủng hộ SQL
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    0
  • $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    1-> sử dụng
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    2sau đó truy vấn hoặc chỉ định tên DB trong truy vấn
  • $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    3-> tham số thứ hai (offset) không có trong
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    4. Bạn có thể
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    5ghi nhớ các kết quả trả về khác nhau
  • $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    6,
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    7,
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    8,
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    9&
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    0-> đã được thay thế bằng
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
    $stmt->bind_param('s', $_POST['login']);
    $stmt->execute();
    $result = $stmt->get_result();
    
    5
  • mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    2đã bị loại bỏ. Nếu bạn cần sử dụng ID chuỗi
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    3
  • mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    4đã được thay thế bằng
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    5với
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    6tiền tố chủ
  • mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    7-> sử dụng
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    8kết hợp với
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli($host, $user, $password, $dbName);
    $mysqli->set_charset('utf8mb4');
    
    9và
    $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Invalid query: ' . mysql_error());
    }
    
    0
  • $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Invalid query: ' . mysql_error());
    }
    
    1 hỗ trợ đã bị loại bỏ để ủng hộ SQL
    $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Invalid query: ' . mysql_error());
    }
    
    2
  • $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Invalid query: ' . mysql_error());
    }
    
    3đã bị loại bỏ. Xem bài viết này để biết thêm thông tin Truy vấn có bộ đệm và không có bộ đệm

20 hữu ích 3 bình luận chia sẻ 3 bình luận chia sẻ