PHP 7.4 mysqli_connect

PHP7. 4 hiện đã được phát hành ???, và nó hỗ trợ plugin xác thực mật khẩu mới của MySQL 8.

$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);
9

Nếu bạn đang sử dụng MySQL 8 với phiên bản PHP cũ hơn 7. 3, có thể bạn đang xác thực cơ sở dữ liệu bằng cách sử dụng

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
0. Với việc nâng cấp lên 7. 4, PHP vốn hỗ trợ plugin xác thực mặc định mới
$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);
9. Hai lỗi sau có thể xuất hiện nếu bạn đang sử dụng MySQL 8 với PHP 7. 3 trở lên và sử dụng plugin
$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
0 để giải quyết vấn đề PHP thiếu hỗ trợ cho plugin
$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);
9 mới

Unexpected server response while doing caching_sha2 auth: 109
mysqli_real_connect(): (HY000/2006): MySQL server has gone away

Bài đăng này là để cung cấp một số thông tin nhanh về cách khắc phục sự cố này

Từ PHP7. 4, PHP vốn hỗ trợ

$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);
9. Giải pháp đơn giản nhất là thay đổi người dùng hiện có mà bạn kết nối với cơ sở dữ liệu để sử dụng plugin mới

Nếu bây giờ bạn không biết rằng tiện ích mở rộng MySQL đang bị xóa trong bản phát hành PHP 7, thì hãy để tôi là người đầu tiên chào mừng bạn đến với thế kỷ hiện tại

Trong bài viết này, tôi sẽ thảo luận về một số kỹ thuật mà tôi sử dụng để làm cho quá trình di chuyển MySQL sang MySQLi trở nên dễ dàng nhất có thể bằng cách sử dụng kiểu thủ tục MySQLi rất giống với phần mở rộng của MySQL

Video hướng dẫn phiên âm sau đây

Xin chào, đây là Dave Smith, tác giả của cách chuyển đổi MySQL sang MySQLi và nhà phát triển gói PHP MySQL sang MySQLi, cả hai đều có thể tìm thấy trên PHPClasses. trang web tổ chức. Các liên kết sẽ có sẵn trong phần mô tả dưới đây

PHP 7 không còn hỗ trợ phần mở rộng mysql, vì vậy bất kỳ mã kế thừa nào sử dụng phần mở rộng mysql sẽ cần phải được di chuyển sang PDO hoặc mysqli trước khi nó có thể chạy trên máy chủ chạy PHP 7 trở lên

Bài viết này sẽ cung cấp cho bạn các ví dụ về cách kết nối bằng mysqli và cách di chuyển các phương thức mysql sang các phương thức thủ tục mysqli, đưa ra các ví dụ về mã cho một số thay đổi đơn giản đối với một số thay đổi khó hơn, ngay cả đối với những thay đổi không có.

Tôi cũng muốn dành một chút thời gian để nói về gói mysql to mysqli. Gói này được dự định đưa vào mã kế thừa bằng cách sử dụng tiện ích mở rộng mysql có thể được đưa vào phiên bản PHP 5. 6 trở xuống và nó sẽ chỉ nằm đó và đợi tiện ích mở rộng mysql biến mất

Vì vậy, khi máy chủ cập nhật lên PHP 7 trở lên thì gói sẽ tiếp quản và nó sẽ giữ cho mã kế thừa mysql không làm hỏng tập lệnh của bạn

Nó được dự định là một khoảng cách dừng nhằm mục đích giữ cho mọi thứ chạy cho đến khi bạn có cơ hội thực sự tham gia và thay đổi và thực hiện việc di chuyển từ mysql sang mysqli một lần nữa, bạn chỉ nên sử dụng điều này như một điểm dừng cuối cùng mà bạn thực hiện

Tôi hy vọng rằng bạn thấy bài viết có nhiều thông tin. Hãy nhớ rằng bạn cũng có thể nhận xét nếu bạn gặp bất kỳ vấn đề nào và tôi sẽ liên hệ lại ngay với bạn và giúp bạn giải quyết chúng. Cảm ơn
bạn đã dành thời gian. Từ biệt.

Điều đầu tiên chúng ta cần xem xét MySQL là một tài nguyên và MySQLi là một đối tượng. Để di chuyển mã của chúng tôi, chúng tôi thực sự không cần phải hiểu sự khác biệt về kỹ thuật, tuy nhiên chúng tôi phải hiểu rằng chúng khác nhau

Điều đầu tiên chúng ta thường làm với MySQL là kết nối và chọn cơ sở dữ liệu, vì vậy hãy xem mysql_connect và mysql_select_db

$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);

$connection là một định danh liên kết MySQL với tài nguyên và $database chỉ là một biến boolean sẽ chứa true nếu thành công hoặc sai khi thất bại. Trong hầu hết các trường hợp, máy chủ của bạn sẽ là máy chủ cục bộ và bạn sẽ chỉ cung cấp tên người dùng và mật khẩu của mình

mysqli_connect trong PHP

Bây giờ hãy xem đối tác của nó trong MySQLi, mysqli_connect

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');

Bạn cần thay đổi gì để sử dụng hàm mysqli_connect PHP

$connection là một liên kết đến đối tượng MySQLi cho kết nối này. Nếu kết nối của bạn sử dụng mysql chỉ sử dụng máy chủ, tên người dùng và mật khẩu, thì việc cập nhật mã của bạn cũng đơn giản như thay đổi mysql_connect thành mysqli_connect

Bạn cũng có thể tiếp tục và thêm cơ sở dữ liệu để kết nối vào ngay trong tham số mysqli_connect và loại bỏ mysql_select_db. Điều này không sao nếu không có biến để lưu trữ kết quả, tuy nhiên nếu một biến được sử dụng thì có thể có logic ở đâu đó sâu trong mã sẽ sử dụng biến này để kiểm tra kết nối hợp lệ với cơ sở dữ liệu. Trong những trường hợp này, tôi khuyên bạn nên sử dụng mysqli_select_db

$database = mysqli_select_db($link, 'database');

Với MySQL, bạn không bắt buộc phải cung cấp liên kết, kết nối được mở lần cuối được sử dụng nếu liên kết không được chỉ định. Khi sử dụng MySQLi, liên kết là bắt buộc và như bạn có thể thấy, bây giờ nó là tham số đầu tiên

Sử dụng các ví dụ của chúng tôi, $link này là kết nối và tên cơ sở dữ liệu của chúng tôi sẽ giữ nguyên. $database vẫn là một biến boolean, vì vậy nếu nó được tham chiếu ở bất kỳ nơi nào khác trong mã, nó sẽ hoạt động như mong đợi

Trong trường hợp kết nối của bạn không phải là tiêu chuẩn đơn giản mà chúng ta vừa trải qua, chúng ta cần quay lại và xem lại mysql_connect. Tham số máy chủ có thể chứa số cổng, localhost. 3307 hoặc ổ cắm, máy chủ cục bộ. /đường dẫn/đến/mysql. bít tất. Khi di chuyển những thứ này sang mysqli_connect, bạn chỉ cần di chuyển cổng hoặc ổ cắm sang các tham số cổng và ổ cắm

Bạn có thể đã đặt cờ new_link, cho phép MySQL mở một kết nối mới thay vì sử dụng kết nối đã mở trước đó. Sau đó, bất kỳ liên kết nào đang được sử dụng sẽ được đặt tên là tham số liên kết. Khi di chuyển những thứ này, chúng tôi chỉ cần tạo một đối tượng MySQLi mới có cùng tên liên kết. Để minh họa điều này

$connection2 = mysql_connect( 'host', 'username', 'password', true);

$connection2 = mysqli_connect( 'host', 'username', 'password');

Bạn cũng có thể đã đặt các cờ máy khách, MySQLi không sử dụng các cờ này và chúng có thể được gỡ bỏ một cách an toàn khi tạo kết nối MySQLi

Bạn có thể có một biến thể đối với mysql_connect để thiết lập kết nối liên tục, đó là mysql_pconnect. Để thiết lập cùng một kết nối liên tục trong MySQLi, bạn chỉ cần thêm vào trước máy chủ một p. tiền tố, vì vậy localhost trở thành p. máy chủ cục bộ

Trong MySQL, chúng tôi có thể sử dụng mysql_error và mysql_errno để xác định xem có lỗi kết nối hay không. Vì các thay thế MySQLi cho những thứ này sử dụng liên kết đến đối tượng và ngay cả khi có sự cố khi kết nối một đối tượng được trả về, chúng tôi phải sử dụng mysqli_connect_error và mysql_connect_errno

Với cả hai thứ này, bạn không cung cấp liên kết, điều này cho phép chúng được sử dụng để kiểm tra lần thử kết nối cuối cùng

OK, tôi đã hứa điều này sẽ đơn giản và bây giờ chúng ta đã có kết nối MySQLi phù hợp, chúng ta đã giải quyết được phần khó khăn nhất

Các phương thức thủ tục của MySQLi sử dụng một tham số tham chiếu đến một liên kết đối tượng hoặc một đối tượng kết quả. Chúng tôi đã thấy tham chiếu đến liên kết đối tượng khi chúng tôi xử lý mysqli_select_db. Ví dụ: đối tượng kết quả tương tự như kết quả MySQL được trả về từ một truy vấn

Nhiều phương thức trong MySQL có các phương thức thủ tục rất giống trong MySQLi và dễ di chuyển như thêm i vào mysql và thêm hoặc di chuyển liên kết hoặc kết quả đến tham số đầu tiên. Hãy nhớ rằng MySQLi yêu cầu liên kết cho các phương thức tham chiếu liên kết. Trong danh sách sau đây, câu lệnh MySQL được theo sau bởi phương thức thủ tục MySQLi thay thế

mysql_affected_rows -> mysqli_affected_rows($link)
mysql_close -> mysqli_close($link)
mysql_data_seek -> mysqli_data_seek( $result, $offset)
mysql_errno -> mysqli_errno( $link)
mysql_error -> mysqli_error( $link)
mysql_fetch_array -> mysqli_fetch_array( $result, $type)
mysql_fetch_assoc -> mysqli_fetch_assoc( $result)
mysql_fetch_lengths -> mysqli_fetch_lengths( $result )
mysql_fetch_object -> mysqli_fetch_object( $result, $class, $params)
mysql_fetch_row -> mysqli_fetch_row( $result)
mysql_field_seek -> mysqli_field_seek( $result, $number)
mysql_free_result -> mysqli_free_result(result)
mysql_get_client_info -> mysqli_get_client_info( $link)
mysql_get_host_info -> mysqli_get_host_info( $link)
mysql_get_proto_info -> mysqli_get_proto_info( $link)
mysql_get_server_info -> mysqli_get_server_info( $link)
mysql_info -> mysqli_info( $link)
mysql_insert_id -> mysqli_insert_id( $link)
mysql_num_rows ->  mysqli_num_rows( $result)
mysql_ping -> mysqli_ping( $link)
mysql_query -> mysqli_query( $link, $query)
mysql_real_escape_string -> mysqli_real_escape_string( $link)
mysql_select_db - > mysqli_select_db( $link, $database)
mysql_set_charset -> mysqli_set_charset( $link, $charset)
mysql_stat -> mysqli_stat( $link)
mysql_thread_id -> mysqli_thread_id( $link)

Tin xấu, không phải tất cả các phương pháp đều dễ dàng di chuyển như những phương pháp được liệt kê ở trên. Tin tốt là những phương pháp này không phổ biến nên bạn thậm chí có thể không phải xử lý chúng. Những phương pháp khó hơn này sẽ cần một số cuộc thảo luận, vì vậy chúng tôi sẽ thực hiện từng bước một

mysql_client_encoding -> mysqli_character_set_name( $link)

Đây là một thay đổi tên đơn giản

Câu lệnh này được thay thế bằng phương thức mysqli_query bằng cách sử dụng câu lệnh CREATE DATABASE sql

$result = mysqli_query( $link, 'CREATE DATABASE database_name' );

Câu lệnh này được sử dụng cùng với câu lệnh mysql_list_dbs để lấy hàng được yêu cầu từ một kết quả nhất định. Để di chuyển nó sang MySQLi, chúng ta phải sử dụng phương thức mysqli_data_seek để định vị hàng được yêu cầu và sau đó mysqli_fetch_row để trả về hàng được yêu cầu

________số 8

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

Trong MySQL, câu lệnh này chọn cơ sở dữ liệu và chạy truy vấn. Để chuyển nó sang MySQLi, chúng tôi sử dụng phương thức mysqli_select_db để chọn cơ sở dữ liệu và sau đó phương thức mysqli_query để chạy truy vấn và trả về kết quả

mysqli_real_connect(): (HY000/2006): MySQL server has gone away
0

mysqli_real_connect(): (HY000/2006): MySQL server has gone away
1

Câu lệnh này được thay thế bằng phương thức mysqli_query sử dụng sql DROP DATABASE

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
0

mysql_escape_string -> mysql_real_escape_string( $link, 'string')

Đây là một thay đổi tên đơn giản

mysql_fetch_field -> mysqli_fetch_field( $result )

Nếu câu lệnh này không chứa tham số offset tùy chọn, thì đó là một sự thay thế tên đơn giản để di chuyển. Nếu tham số offset được bao gồm, thì chúng ta phải lặp lại kết quả cho đến khi tìm thấy offset được yêu cầu

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
1

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
2

mysql_field_len
mysql_field_name
mysql_field_table

Trong MySQL, các câu lệnh này trả về độ dài, tên hoặc bảng của trường đã chỉ định. Để di chuyển nó, chúng tôi sử dụng phương thức MySQLi mysqli_fetch_field_direct để trả về một đối tượng chứa dữ liệu trường và sau đó trả về độ dài, tên hoặc bảng của trường từ đối tượng đó

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
3

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
4

Câu lệnh này được thay thế bằng phương thức mysqli_query bằng cách sử dụng SHOW DATABASES sql

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
5

Câu lệnh này được thay thế bằng phương thức mysqli_query bằng cách sử dụng SHOW COLUMNS FROM sql

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
6

mysql_list_processes -> mysqli_thread_id( $link )

Đây là một thay đổi tên đơn giản

Câu lệnh này được thay thế bằng phương thức mysqli_query bằng SHOW TABLES FROM sql

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
7

mysql_num_fields -> mysqli_field_count( $link )

Câu lệnh này tham chiếu kết quả trong MySQL và được thay thế bằng phương thức mysql_field_count tham chiếu liên kết

Trong MySQL, câu lệnh này tìm nạp một hàng đã chỉ định và trường tùy chọn từ một kết quả nhất định. Để di chuyển nó, chúng tôi sử dụng mysqli_data_seek để định vị hàng và lặp qua các trường bằng cách sử dụng mysqli_fetch_field để trả lại trường

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
8

$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');
9

Trong MySQL, câu lệnh này trả về tên bảng trong hàng của một kết quả được chỉ định. Để di chuyển nó, chúng tôi sử dụng phương thức mysqli_data_seek để định vị hàng đã chỉ định và tìm nạp tên bằng phương thức mysqli_fetch_array

$database = mysqli_select_db($link, 'database');
0

$database = mysqli_select_db($link, 'database');
1

Câu lệnh này được thay thế bằng phương thức mysqli_query với chế độ kết quả được đặt thành MYSQLI_USE_RESULT

$database = mysqli_select_db($link, 'database');
2

Trước hết, tôi muốn chỉ ra rằng tôi không có gì chống lại những người tóc đỏ hay con riêng nói chung. Ở Hoa Kỳ, đây là một cụm từ đề cập đến một vấn đề mà không ai muốn giải quyết và tôi chỉ không biết sự thay thế đúng đắn về mặt chính trị sẽ là gì, vì vậy chúng tôi bị mắc kẹt với nó

Có 2 câu lệnh MySQL thực sự khó giải quyết vì chúng sử dụng các cờ và loại không được hỗ trợ trong MySQLi giống như cách chúng ở trong MySQL. Để những thứ này hoạt động, chúng ta phải tự tạo

$database = mysqli_select_db($link, 'database');
3

$database = mysqli_select_db($link, 'database');
4

$database = mysqli_select_db($link, 'database');
5

$database = mysqli_select_db($link, 'database');
6

PHP MySQL to MySQLi là gói mô phỏng các chức năng tiện ích mở rộng mysql bằng tiện ích mở rộng mysqli.  

Nó sử dụng các giải pháp mã thay thế này và có thể hoạt động như một khoảng trống trong khi bạn di chuyển mã của mình. Nó cung cấp một giải pháp thay thế nhanh chóng cho các dự án cần chuyển sang mysqli ngay lập tức, nhưng bạn nên coi đó là một giải pháp tạm thời trong khi quá trình chuyển đổi mysqli thực sự của bạn chưa hoàn tất

Luôn cập nhật mã của bạn là cách tốt nhất để cho những người dùng trung thành của bạn thấy rằng bạn quan tâm đến những gì xảy ra với họ. Khi các máy chủ bắt đầu nâng cấp lên bản phát hành PHP 7 mới, rất nhiều mã nguồn mở sẽ trở thành di sản chỉ trong một đêm và sẽ ngừng hoạt động

Khuyến nghị số một của tôi là cắn viên đạn và vào đó và sửa mã đó. Khi bạn bắt đầu, bạn sẽ khám phá ra rằng nó không tệ như thoạt nhìn

Bạn có thể tải xuống gói tại trang PHP MySQL to MySQL Tải xuống tab và tải xuống kho lưu trữ ZIP. Bạn cũng có thể cài đặt nó bằng công cụ soạn thảo PHP bằng hướng dẫn được đề cập trong trang đó

Liệu PHP 7. 4 hỗ trợ MySQL?

PHP 7. 4 hiện hỗ trợ MySQL với caching_sha2_password , mặc dù có một chút không rõ ràng xung quanh các phiên bản cũ hơn, dường như có các báo cáo mâu thuẫn.

Làm cách nào để bật tiện ích mở rộng MySQLi trong PHP 7?

Đối với tất cả người dùng docker, chỉ cần chạy docker-php-ext-install mysqli từ bên trong bộ chứa php của bạn .

MySQLi có bị phản đối trong PHP 7 không?

Phần mở rộng mysqli bao gồm những gì? . Cái cũ nhất sử dụng tiện ích mở rộng MySQL, không được dùng nữa kể từ PHP 5. 5 và xóa hoàn toàn trong PHP 7 . Hàm mysql() không còn hoạt động trong PHP 7.

Làm cách nào để sử dụng mysqli_connect trong PHP?