Tôi đã viết một tập lệnh bằng PHP để truy cập cơ sở dữ liệu MySQL bằng hàm mysqli nhưng dịch vụ PHP sẽ không vượt quá lệnh gọi hàm mysqli. Tôi biết rằng dịch vụ PHP đang chạy, tôi gọi thông tin. trang php, điều đó cũng có nghĩa là Apache được cấu hình đúng
Trong video này, tôi sẽ trình bày cách bật chức năng mysqli của bạn trên máy chủ Apache chạy PHP
Tiện ích mở rộng MySQLi [MySQL được cải tiến] là trình điều khiển cơ sở dữ liệu được ngôn ngữ lập trình PHP sử dụng để cung cấp giao diện cho cơ sở dữ liệu MySQL. Hiện tại, có sẵn ba API chính nếu bạn yêu cầu chương trình của mình giao tiếp với máy chủ cơ sở dữ liệu MySQL;
Tại Bobcares, chúng tôi thường nhận được yêu cầu sửa lỗi thiếu tiện ích mở rộng MySQLi như một phần của Dịch vụ quản lý máy chủ của chúng tôi
Hôm nay, hãy phân tích lỗi và xem các Kỹ sư hỗ trợ của chúng tôi khắc phục lỗi đó cho khách hàng như thế nào
Phần mở rộng MySQLi thiếu lỗi phpMyAdmin là gì?
Trước khi tìm hiểu sâu hơn về lỗi, trước tiên, hãy hiểu tiện ích mở rộng MySQLi bị thiếu trong phpMyAdmin là gì?
Các hàm MySQLi cho phép chúng tôi truy cập các máy chủ cơ sở dữ liệu MySQL và đó là trình điều khiển cơ sở dữ liệu quan hệ được sử dụng trong ngôn ngữ kịch bản PHP. Nếu có phần mở rộng MySQLi, chúng tôi sẽ gặp lỗi này
Một lỗi mẫu tại PHPMyAdmin sẽ giống như
Làm cách nào chúng tôi sửa tiện ích mở rộng MySQLi bị thiếu phpMyAdmin?
Cho đến nay, chúng ta đã thấy tiện ích mở rộng MySQLi bị thiếu trong lỗi phpMyAdmin là gì. Giải pháp cho lỗi này là bật tiện ích mở rộng MySQLi trên máy chủ
Hãy xem các cách khác nhau mà Kỹ sư hỗ trợ của chúng tôi khắc phục lỗi này cho khách hàng bằng cách bật tiện ích mở rộng MySQLi
Bật tiện ích mở rộng MySQLi trong php. tập tin ini
Trước tiên, chúng tôi xác minh rằng tiện ích mở rộng trong các mô-đun PHP đã được bật hay chưa. Đối với điều này, chúng tôi chạy lệnh này
php -m | grep -i mysqli
Hãy để chúng tôi thảo luận về cách Kỹ sư hỗ trợ của chúng tôi kích hoạt tiện ích mở rộng MySQLi từ tệp php. ini trong Linux và Windows
Trong Linux
1. Đầu tiên, chúng tôi mở php. tập tin ini
extension=php_mysqli.so
02. Sau đó, chúng tôi tìm kiếm dòng bình luận
#extension=php_mysqli.so
3. Và, chúng tôi bỏ ghi chú dòng bằng cách xóa thẻ bắt đầu bằng # ngay từ đầu, chẳng hạn như
extension=php_mysqli.so
Cuối cùng, chúng tôi khởi động lại máy chủ web
Trong cửa sổ
1. Chúng tôi mở php. tập tin ini
2 Sau đó, chúng tôi tìm kiếm dòng nhận xét
#extension=php_mysqli.dll
3. Và, chúng tôi bỏ ghi chú dòng bằng cách xóa thẻ bắt đầu bằng # ngay từ đầu, chẳng hạn như
extension=php_mysqli.dll
Do đó, cho phép nó giải quyết lỗi
Kích hoạt MySQLi bằng EasyApache4
Cách đơn giản nhất để kích hoạt MySQLi là từ EasyApache. Hãy để chúng tôi thảo luận về cách Kỹ sư hỗ trợ của chúng tôi kích hoạt nó từ EasyApache
1. Đầu tiên, chúng tôi đăng nhập vào WHM với quyền root
2. Sau đó, chúng tôi tìm kiếm “EasyApache4” hoặc vào Phần mềm > EasyApache4
3. Ở trên cùng, hãy tìm “Gói đã cài đặt hiện tại” và chúng tôi nhấp vào nút “Tùy chỉnh”
4. Sau đó, trên phần bảng điều khiển bên trái, chúng tôi nhấp vào “Tiện ích mở rộng PHP”
5. Sau đó, chúng tôi tìm kiếm mysqlnd
6. Chúng tôi thấy một cái gì đó giống như “php70-php-mysqlnd” [tùy thuộc vào phiên bản PHP]. Chúng tôi kích hoạt nó
7. Nhấp vào Xem lại và nhấp vào nút Cung cấp
Kích hoạt tiện ích mở rộng MySQLi trên máy chủ web mà không cần bất kỳ bảng điều khiển nào
Các kỹ sư hỗ trợ của chúng tôi cũng cung cấp giải pháp cho những khách hàng không sử dụng bất kỳ bảng nào. Để bật tiện ích mở rộng MySQLi trong máy chủ không có bảng điều khiển. Chúng tôi chạy lệnh dưới đây, chẳng hạn như
# ./configure --with-mysql=/usr --with-mysqli=/usr/bin/mysql_config
Sau đó, chúng tôi kiểm tra tiện ích mở rộng MySQLi được bật trên máy chủ
Sự kết luận
Tóm lại Lỗi chủ yếu là do thiếu MySQLi extension trong php. tập tin ini. Hôm nay, chúng tôi đã xem cách Kỹ sư hỗ trợ của chúng tôi giải quyết lỗi thiếu tiện ích MySQLi trên PHPMyAdmin và các cách khác nhau để bật tiện ích MySQLi
Tiện ích mở rộng MySQLi [MySQL được cải tiến] là trình điều khiển cơ sở dữ liệu quan hệ được sử dụng trong ngôn ngữ kịch bản PHP để cung cấp giao diện với cơ sở dữ liệu MySQL
Có ba tùy chọn API chính khi xem xét kết nối với máy chủ cơ sở dữ liệu MySQL
- Phần mở rộng MySQL của PHP
- Phần mở rộng MySQLi của PHP
- Đối tượng dữ liệu PHP [PDO]
Mã PHP bao gồm một lõi, với các phần mở rộng tùy chọn cho chức năng cốt lõi. Các phần mở rộng liên quan đến MySQL của PHP, chẳng hạn như phần mở rộng MySQLi và phần mở rộng MySQL, được triển khai bằng cách sử dụng khung mở rộng PHP. Tiện ích mở rộng thường hiển thị API cho nhà phát triển PHP, để cho phép các tiện ích của nó được sử dụng theo chương trình. Tuy nhiên, một số tiện ích mở rộng sử dụng khung tiện ích mở rộng PHP không hiển thị API cho nhà phát triển PHP
Ví dụ: phần mở rộng trình điều khiển PDO MySQL không hiển thị API cho nhà phát triển PHP, nhưng cung cấp giao diện cho lớp PDO phía trên nó
MySQLi là phiên bản cải tiến của trình điều khiển PHP MySQL cũ hơn, mang lại nhiều lợi ích khác nhau. [1]
Các tác giả của ngôn ngữ kịch bản PHP khuyên bạn nên sử dụng MySQLi khi xử lý máy chủ MySQL phiên bản 4. 1. 3 và mới hơn [tận dụng chức năng mới]. [1]
Chi tiết kỹ thuật[sửa]
Tiện ích mở rộng MySQLi cung cấp nhiều lợi ích khác nhau so với phiên bản tiền nhiệm của nó, trong đó nổi bật nhất [theo trang web PHP[1]] là
- Giao diện hướng đối tượng
- Hỗ trợ cho báo cáo chuẩn bị
- Hỗ trợ cho nhiều câu lệnh
- Hỗ trợ giao dịch
- Hỗ trợ sửa lỗi nâng cao
So sánh các tính năng [1][sửa]
Phần mở rộng MySQLi của PHPPhiên bản PHP Phần mở rộng MySQL của PHP được giới thiệu5. 05. 0pre-3. 0Được bao gồm trong PHP 5. xYesYesYesĐược bao gồm trong PHP 7. xYesYesNoTrạng thái phát triểnĐang phát triểnĐang phát triển kể từ PHP 5. 3Không dùng nữa kể từ PHP 5. 5Đã xóa trong PHP 7. 0Được MySQL đề xuất cho các dự án mớiCó - tùy chọn ưu tiênCóKhôngAPI hỗ trợ Bộ ký tựCóCóKhôngAPI hỗ trợ các câu lệnh đã chuẩn bị phía máy chủCóCóKhôngAPI hỗ trợ các câu lệnh đã chuẩn bị phía máy kháchKhôngCóKhôngAPI hỗ trợ các thủ tục được lưu trữCóCóKhôngAPI hỗ trợ nhiều câu lệnhCóHầu hếtKhôngHỗ trợ tất cả MySQL 4. 1+ chức năngCóHầu hếtKhông
Giao diện kép[sửa]
Tiện ích mở rộng MySQLi có giao diện kép - nó hỗ trợ cả mô hình lập trình hướng đối tượng và thủ tục
Người dùng di chuyển từ tiện ích mở rộng MySQL cũ có thể thích giao diện thủ tục hơn. Giao diện thủ tục tương tự như giao diện của phần mở rộng MySQL cũ. Trong nhiều trường hợp, tên hàm chỉ khác nhau bởi tiền tố. Một số hàm MySQLi lấy điều khiển kết nối làm đối số đầu tiên của chúng, trong khi các hàm khớp trong giao diện MySQL cũ lấy nó làm đối số cuối cùng tùy chọn
Các lệnh gọi hàm gốc mới và cũ
Kết nối[sửa]
Máy chủ MySQL hỗ trợ sử dụng các lớp vận chuyển khác nhau cho các kết nối. Các kết nối sử dụng TCP/IP, ổ cắm tên miền Unix hoặc đường ống có tên Windows
Tên máy chủ
connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; $mysqli = new mysqli["127.0.0.1", "user", "password", "database", 3306]; if [$mysqli->connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; ?>2 có một ý nghĩa đặc biệt. Nó bị ràng buộc với việc sử dụng ổ cắm tên miền Unix. Không thể mở kết nối TCP/IP bằng tên máy chủ
connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; $mysqli = new mysqli["127.0.0.1", "user", "password", "database", 3306]; if [$mysqli->connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; ?>2, thay vào đó bạn phải sử dụng
connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; $mysqli = new mysqli["127.0.0.1", "user", "password", "database", 3306]; if [$mysqli->connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; ?>4
Thí dụ. Ý nghĩa đặc biệt của localhost
connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; $mysqli = new mysqli["127.0.0.1", "user", "password", "database", 3306]; if [$mysqli->connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; ?>
đầu ra
#extension=php_mysqli.so
1Các tuyên bố thực thi[sửa]
Các câu lệnh có thể được thực thi với các hàm mysqli_query[], mysqli_real_query[] và mysqli_multi_query[]. Hàm mysqli_query[] là phổ biến nhất và kết hợp câu lệnh thực thi với tìm nạp vào bộ đệm tập kết quả của nó, nếu có, trong một lệnh gọi. Gọi mysqli_query[] giống như gọi mysqli_real_query[] theo sau là mysqli_store_result[]
Thí dụ. Kết nối với MySQL
#extension=php_mysqli.so
2Bộ đệm kết quả
Sau khi kết quả thực hiện câu lệnh có thể được truy xuất ngay lập tức để được lưu vào bộ đệm của máy khách hoặc bằng cách đọc từng hàng. Bộ đệm tập kết quả phía máy khách cho phép máy chủ giải phóng tài nguyên được liên kết với kết quả câu lệnh càng sớm càng tốt. Nói chung, khách hàng là tập hợp kết quả tiêu thụ chậm. Do đó, nên sử dụng bộ kết quả đệm. mysqli_query[] kết hợp thực thi câu lệnh và bộ đệm tập kết quả
Các ứng dụng PHP có thể điều hướng tự do thông qua các kết quả được đệm. Điều hướng nhanh vì tập hợp kết quả được giữ trong bộ nhớ máy khách. Xin lưu ý rằng việc mở rộng quy mô theo máy khách thường dễ dàng hơn là mở rộng quy mô máy chủ
Thí dụ. Điều hướng qua các kết quả được đệm
#extension=php_mysqli.so
3Ví dụ trên sẽ xuất ra
#extension=php_mysqli.so
4Tập hợp kết quả không có bộ đệm
Nếu bộ nhớ máy khách là một tài nguyên ngắn và không cần giải phóng tài nguyên máy chủ càng sớm càng tốt để giữ cho máy chủ tải ở mức thấp, thì có thể sử dụng các kết quả không có bộ đệm. Không thể cuộn qua các kết quả không có bộ đệm trước khi tất cả các hàng đã được đọc
Thí dụ. Điều hướng qua các kết quả không có bộ đệm
#extension=php_mysqli.so
5Loại dữ liệu giá trị tập hợp kết quả
Các hàm mysqli_query[], mysqli_real_query[] và mysqli_multi_query[] được sử dụng để thực thi các câu lệnh không chuẩn bị trước. Ở cấp độ của Giao thức máy chủ máy khách MySQL, lệnh COM_QUERY và giao thức văn bản được sử dụng để thực thi câu lệnh. Với giao thức văn bản, máy chủ MySQL chuyển đổi tất cả dữ liệu của tập kết quả thành chuỗi trước khi gửi. Chuyển đổi này được thực hiện bất kể kiểu dữ liệu cột tập hợp kết quả SQL. Các thư viện máy khách MySQL nhận tất cả các giá trị cột dưới dạng chuỗi. Không có quá trình truyền phía máy khách nào được thực hiện để chuyển đổi các cột trở lại kiểu gốc của chúng. Thay vào đó, tất cả các giá trị được cung cấp dưới dạng chuỗi PHP
Thí dụ. Giao thức văn bản trả về chuỗi theo mặc định
#extension=php_mysqli.so
6Ví dụ trên sẽ xuất ra
#extension=php_mysqli.so
7Có thể chuyển đổi các cột số nguyên và số float trở lại số PHP bằng cách đặt tùy chọn kết nối MYSQLI_OPT_INT_AND_FLOAT_NATIVE, nếu sử dụng thư viện mysqlnd. Nếu được đặt, thư viện mysqlnd sẽ kiểm tra các loại cột siêu dữ liệu của tập kết quả và chuyển đổi các cột SQL dạng số thành số PHP, nếu phạm vi giá trị của loại dữ liệu PHP cho phép. Bằng cách này, ví dụ, các cột SQL INT được trả về dưới dạng số nguyên
Thí dụ. Các kiểu dữ liệu gốc với mysqlnd và tùy chọn kết nối
#extension=php_mysqli.so
8Ví dụ trên sẽ xuất ra
connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; $mysqli = new mysqli["127.0.0.1", "user", "password", "database", 3306]; if [$mysqli->connect_errno] { echo "Failed to connect to MySQL: [" . $mysqli->connect_errno . "] " . $mysqli->connect_error; } echo $mysqli->host_info . "\n"; ?>0
Báo cáo chuẩn bị [ chỉnh sửa ]
Cơ sở dữ liệu MySQL hỗ trợ các câu lệnh đã chuẩn bị. Một câu lệnh đã chuẩn bị hoặc một câu lệnh được tham số hóa được sử dụng để thực hiện lặp đi lặp lại cùng một câu lệnh với hiệu quả cao
quy trình làm việc cơ bản
Việc thực hiện câu lệnh chuẩn bị bao gồm hai giai đoạn. chuẩn bị và thực hiện. Ở giai đoạn chuẩn bị, một mẫu câu lệnh được gửi đến máy chủ cơ sở dữ liệu. Máy chủ thực hiện kiểm tra cú pháp và khởi tạo tài nguyên nội bộ của máy chủ để sử dụng sau này
Máy chủ MySQL hỗ trợ sử dụng trình giữ chỗ ẩn danh, có vị trí với ?
Xem ví dụ trong. [3]
Các thủ tục được lưu trữ [4][sửa]
Cơ sở dữ liệu MySQL hỗ trợ thủ tục lưu sẵn. Một thủ tục được lưu trữ là một chương trình con được lưu trữ trong danh mục cơ sở dữ liệu. Các ứng dụng có thể gọi và thực thi thủ tục lưu sẵn. Câu lệnh CALL SQL được sử dụng để thực thi thủ tục lưu sẵn
Tham số
Các thủ tục được lưu trữ có thể có các tham số IN, INOUT và OUT, tùy thuộc vào phiên bản MySQL. Giao diện MySQLi không có khái niệm đặc biệt cho các loại tham số khác nhau
tham số TRONG
Tham số đầu vào được cung cấp với câu lệnh CALL. Vui lòng đảm bảo các giá trị được thoát chính xác
Xem các ví dụ trong. [4]
Nhiều câu [5][sửa]
MySQL tùy chọn cho phép có nhiều câu lệnh trong một chuỗi câu lệnh. Gửi nhiều câu lệnh cùng một lúc làm giảm các chuyến đi khứ hồi giữa máy khách và máy chủ nhưng yêu cầu xử lý đặc biệt
Nhiều câu lệnh hoặc nhiều truy vấn phải được thực thi với mysqli_multi_query[]. Các câu lệnh riêng lẻ của chuỗi câu lệnh được phân tách bằng dấu chấm phẩy. Sau đó, tất cả các tập kết quả được trả về bởi các câu lệnh đã thực hiện phải được tìm nạp
Máy chủ MySQL cho phép có các câu lệnh trả về tập kết quả và câu lệnh không trả về tập kết quả trong một câu lệnh nhiều lần
Xem các ví dụ trong [5]
Hỗ trợ API cho giao dịch [6][sửa]
Máy chủ MySQL hỗ trợ các giao dịch tùy thuộc vào công cụ lưu trữ được sử dụng. Kể từ MySQL 5. 5, công cụ lưu trữ mặc định là InnoDB. InnoDB có hỗ trợ giao dịch ACID đầy đủ
Giao dịch có thể được kiểm soát bằng lệnh gọi SQL hoặc API. Bạn nên sử dụng lệnh gọi API để bật và tắt chế độ tự động cam kết cũng như để cam kết và khôi phục các giao dịch
Ví dụ ở đây. [6]
Tập kết quả MySQL chứa siêu dữ liệu. Siêu dữ liệu mô tả các cột được tìm thấy trong tập hợp kết quả. Tất cả siêu dữ liệu được gửi bởi MySQL đều có thể truy cập thông qua giao diện MySQLi. Tiện ích mở rộng không thực hiện hoặc thay đổi không đáng kể đối với thông tin mà nó nhận được. Sự khác biệt giữa các phiên bản máy chủ MySQL không được căn chỉnh
Dữ liệu meta được truy cập thông qua giao diện mysqli_result
Xem thêm tại đây. [7]
Phần mở rộng MySQLi và các kết nối liên tục [1][sửa]
Hỗ trợ kết nối liên tục đã được giới thiệu trong PHP 5. 3 cho phần mở rộng MySQLi. Hỗ trợ đã có trong PDO MYSQL và ext/mysql. Ý tưởng đằng sau các kết nối liên tục là kết nối giữa quy trình máy khách và cơ sở dữ liệu có thể được sử dụng lại bởi quy trình máy khách, thay vì được tạo và hủy nhiều lần. Điều này làm giảm chi phí tạo kết nối mới mỗi khi cần một kết nối, vì các kết nối không sử dụng được lưu vào bộ đệm và sẵn sàng để sử dụng lại
Không giống như phần mở rộng MySQL, MySQLi không cung cấp chức năng riêng để mở các kết nối liên tục. Để mở một kết nối liên tục, bạn phải thêm p. đến tên máy chủ khi kết nối
Vấn đề với các kết nối liên tục là chúng có thể bị khách hàng bỏ lại ở trạng thái không thể đoán trước. Ví dụ: khóa bảng có thể được kích hoạt trước khi máy khách kết thúc đột ngột. Một quy trình máy khách mới sử dụng lại kết nối liên tục này sẽ nhận được kết nối "nguyên trạng". Bất kỳ quá trình dọn dẹp nào cũng cần phải được thực hiện bởi quy trình máy khách mới trước khi nó có thể tận dụng tốt kết nối liên tục, làm tăng gánh nặng cho lập trình viên
Tuy nhiên, kết nối liên tục của tiện ích mở rộng MySQLi cung cấp mã xử lý dọn dẹp tích hợp. Việc dọn dẹp được thực hiện bởi MySQLi bao gồm
- Phục hồi các giao dịch đang hoạt động
- Đóng và thả các bảng tạm thời
- Mở khóa các bảng
- Đặt lại các biến phiên
- Đóng các câu lệnh đã chuẩn bị sẵn [luôn xảy ra với PHP]
- Đóng xử lý
- Phát hành khóa thu được với GET_LOCK[]
Điều này đảm bảo rằng các kết nối liên tục ở trạng thái sạch khi được trả về từ nhóm kết nối, trước khi quy trình máy khách sử dụng chúng
Tiện ích mở rộng MySQLi thực hiện việc dọn dẹp này bằng cách tự động gọi hàm C-API mysql_change_user[]
Tính năng dọn dẹp tự động có những ưu điểm và nhược điểm. Ưu điểm là nhà phát triển không còn phải lo lắng về việc thêm mã dọn dẹp vì nó được gọi tự động. Tuy nhiên, nhược điểm là mã có thể chậm hơn một chút, vì mã để thực hiện dọn dẹp cần chạy mỗi khi kết nối được trả về từ nhóm kết nối
Có thể tắt mã dọn dẹp tự động bằng cách biên dịch PHP với MYSQLI_NO_CHANGE_USER_ON_PCONNECT được xác định