Làm thế nào để thực hiện một truy vấn trong PHP?

Hầu như mọi ứng dụng Web đều có nhu cầu lưu trữ dữ liệu bằng cách nào đó. Dữ liệu này có thể là thông tin về giỏ hàng, báo giá hoặc bất kỳ thứ gì khác mà bạn có thể tưởng tượng. Trong các chương trước, chúng tôi đã bỏ qua vấn đề này hoặc sử dụng các tệp văn bản thuần túy để lưu trữ lượng dữ liệu tối thiểu. Mặc dù có chức năng nhưng nó cũng hạn chế đáng kể khả năng của tập lệnh của bạn

Trong các ứng dụng Web thực tế, hầu hết tất cả dữ liệu được lưu trữ theo một cách nào đó trong một hệ thống cơ sở dữ liệu quan hệ như MySQL. Trong chương trước, tôi đã giới thiệu với các bạn về hệ thống cơ sở dữ liệu MySQL bên ngoài PHP và cách ngôn ngữ SQL có thể được sử dụng để lưu trữ và truy xuất dữ liệu từ nó. Trong chương này, chúng tôi sẽ xây dựng kiến ​​thức đó và giới thiệu cách bạn có thể tận dụng các khả năng của MySQL từ bên trong các tập lệnh PHP của mình bằng tiện ích mở rộng MySQLi. Để làm theo các ví dụ trong chương này, bạn sẽ cần một máy chủ MySQL đang hoạt động, khả năng tạo bảng trong cơ sở dữ liệu bên trong máy chủ đó và phần mở rộng MySQLi được cài đặt. Để được hỗ trợ làm cho MySQL hoạt động trong PHP, hãy xem Phụ lục A, "Cài đặt PHP 5 và MySQL. "

Khái niệm cơ bản về MySQLi

Tiện ích mở rộng MySQLi, giống như bản thân MySQL, là một tiện ích mở rộng rất mạnh mẽ cho phép bạn làm việc với hầu hết mọi khía cạnh của máy chủ MySQL. Do đó, thoạt nhìn tiện ích mở rộng và việc sử dụng nó có thể hơi khó hiểu. Tuy nhiên, giống như hầu hết mọi thứ, khi nó được chia thành những phần nhỏ hơn, dễ tiêu thụ (đó là những gì chúng ta sẽ làm trong chương này), thì việc xử lý nó khá đơn giản.

Để bắt đầu, hãy xem qua các bước cơ bản để truy cập cơ sở dữ liệu MySQL từ bên trong tập lệnh PHP

Kết nối với cơ sở dữ liệu MySQL

Chọn cơ sở dữ liệu để sử dụng

Thực hiện các truy vấn SQL mong muốn

Truy xuất bất kỳ dữ liệu nào được trả về từ các truy vấn SQL

Đóng kết nối với cơ sở dữ liệu

Lưu ý rằng các bước này không khác nhiều so với những gì được mong đợi khi làm việc với máy khách MySQL, như trong chương trước. Trên thực tế, một chức năng duy nhất có thể được liên kết với từng bước này

Kết nối với cơ sở dữ liệu

Bước đầu tiên trong bất kỳ giao dịch cơ sở dữ liệu nào từ PHP là kết nối với cơ sở dữ liệu. Khi bạn đang sử dụng MySQL trực tiếp, điều này tương tự như việc thực thi ứng dụng khách MySQL; . Cú pháp của hàm này như sau

mysqli_connect([$hostname [, $username [, $password 
               [, $dbname [, $port [, $socket]]]]]]);

Như bạn có thể thấy, hàm mysqli_connect() nhận một số tham số, tất cả đều là tùy chọn và hầu hết đều khá dễ hiểu. Bắt đầu từ bên trái, tham số đầu tiên là tham số $hostname, đại diện cho tên máy chủ nơi đặt máy chủ. Bởi vì thường xảy ra trường hợp máy chủ MySQL được đặt trên cùng một máy với máy chủ Web của bạn, nên đây thường là giá trị "localhost". Hai tham số tiếp theo, $username và $password, đại diện cho tên người dùng và mật khẩu sẽ sử dụng khi xác thực với máy chủ MySQL. Tham số thứ ba, $dbname, là một chuỗi đại diện cho tên của cơ sở dữ liệu được sử dụng theo mặc định. Hai tham số cuối cùng, $port và $socket, được sử dụng cùng với tham số $hostname để chỉ định một cổng hoặc ổ cắm cụ thể sẽ được sử dụng cho kết nối

Khi được thực thi, hàm mysqli_connect() sẽ cố gắng kết nối với máy chủ MySQL bằng các tham số được cung cấp. Khi thành công, chức năng này sẽ trả về một tài nguyên đại diện cho một kết nối đến cơ sở dữ liệu hoặc sai khi thất bại

Không được loại bỏ tài nguyên liên kết được trả về bởi mysqli_connect(). Không giống như các phiên bản trước của PHP, tài nguyên liên kết được yêu cầu làm tham số cho mọi hoạt động

Nói chung, ở mức tối thiểu, chức năng này yêu cầu ba tham số ($hostname, $username và $password);

Chọn cơ sở dữ liệu

Mặc dù chúng ta đang nói về chủ đề chọn cơ sở dữ liệu để sử dụng, nên chỉ ra rằng cơ sở dữ liệu không nhất thiết phải được chọn thông qua hàm mysqli_connect(). Sau khi tạo kết nối, hàm mysqli_select_db() có thể được sử dụng để chọn cơ sở dữ liệu hiện tại giống như cách sử dụng lệnh USE SQL từ máy khách. Cú pháp của hàm mysqli_select_db() như sau

mysqli_select_db($link, $dbname);

$link là tài nguyên kết nối cơ sở dữ liệu được trả về từ hàm mysqli_connect() và $dbname là một chuỗi đại diện cho tên của cơ sở dữ liệu để chọn. Hàm này sẽ trả về giá trị Boolean TRue nếu cơ sở dữ liệu mới được chọn thành công hoặc sai nếu không thành công

Thực hiện một truy vấn cơ bản

Bây giờ chúng ta đã biết cách kết nối với máy chủ MySQL và chọn cơ sở dữ liệu để sử dụng, đã đến lúc bắt đầu thực hiện các truy vấn SQL đối với cơ sở dữ liệu đó. Để thực hiện truy vấn, chúng ta sẽ sử dụng hàm mysqli_query() với cú pháp như sau

mysqli_query($link, $query [, $resultmode]);

$link là kết nối cơ sở dữ liệu và $query là một chuỗi chứa một truy vấn SQL duy nhất không có dấu chấm phẩy kết thúc (;) hoặc (\g). Tham số tùy chọn thứ ba, $resultmode, xác định cách tập kết quả từ truy vấn sẽ được chuyển trở lại PHP. Tham số này là hằng số MYSQLI_USE_RESULT hoặc MYSQLI_STORE_RESULT (giá trị mặc định). Tham số này được sử dụng để cho biết liệu tiện ích mở rộng MySQLi có nên sao chép toàn bộ tập kết quả vào bộ nhớ sau một truy vấn (MYSQLI_STORE_RESULT) hay chỉ hàng hiện tại trong tập kết quả. Về mặt thực tế, việc lưu trữ toàn bộ tập kết quả trong bộ nhớ cho phép tập lệnh của bạn truy cập tùy ý vào bất kỳ hàng nào trong tập kết quả khi nếu không thì mỗi hàng chỉ có thể được đọc tuần tự. Trừ khi bạn đang làm việc với các tập dữ liệu đặc biệt lớn, thông thường có thể bỏ qua tham số này. Khi thành công, mysqli_query() sẽ trả về một tài nguyên đại diện cho kết quả của truy vấn hoặc một giá trị Boolean sai khi thất bại

Tìm nạp các hàng trong tập kết quả

Khi thực hiện các truy vấn sửa đổi các bảng trong cơ sở dữ liệu, chẳng hạn như CHÈN và CẬP NHẬT, thường không có dữ liệu để trả về từ cơ sở dữ liệu. Tuy nhiên, các truy vấn như CHỌN, truy xuất dữ liệu từ cơ sở dữ liệu, yêu cầu dữ liệu đó phải được truy cập bằng cách nào đó từ bên trong PHP. Khi trả lại kết quả từ tập kết quả vào PHP, sẽ có nhiều tùy chọn khác nhau, mỗi tùy chọn cung cấp một tính hữu dụng riêng tùy thuộc vào hoàn cảnh

Tổng quát nhất trong các hàm lấy kết quả là hàm mysqli_fetch_array(). Cú pháp của hàm này như sau

mysqli_fetch_array($result [, $array_type])

$result là tài nguyên đại diện cho kết quả truy vấn được trả về từ lệnh gọi hàm mysqli_query() và tham số tùy chọn $array_type là một trong các hằng số sau

MYSQLI_ASSOC

Trả về một mảng kết hợp

MYSQLI_NUM

Trả về một mảng liệt kê

MYSQLI_BOTH

Trả về cả một mảng liệt kê và kết hợp

Nếu không có giá trị nào được cung cấp, hằng số MYSQLI_BOTH là giá trị mặc định

Áp dụng chức năng này cho tập lệnh của bạn là một nhiệm vụ khá đơn giản. Sau khi một truy vấn đã được thực hiện bằng hàm mysqli_query(), kết quả của truy vấn đó được chuyển đến một hàm chẳng hạn như hàm mysqli_fetch_array(), hàm này sẽ trả về một hàng của bảng kết quả. Đối với mỗi lệnh gọi tiếp theo, mysqli_fetch_array() sẽ trả về một hàng khác từ bảng kết quả cho đến khi không còn hàng nào nữa, trong trường hợp đó, mysqli_fetch_array() sẽ trả về giá trị Boolean false

Đúng như tên gọi của nó, hàm mysqli_fetch_array() sẽ trả về mỗi hàng dưới dạng một mảng. Tuy nhiên, chi tiết về cách định dạng mảng đó phụ thuộc vào tham số $array_type tùy chọn. Nếu hằng số MYSQLI_ASSOC được sử dụng, thì hàm mysqli_fetch_array() sẽ trả về một mảng kết hợp có các khóa biểu thị tên cột của tập kết quả và các giá trị biểu thị giá trị thích hợp cho mỗi cột của hàng hiện tại. Mặt khác, nếu hằng số MYSQLI_NUM được sử dụng, mysqli_fetch_array() sẽ trả về một mảng liệt kê đại diện cho hàng hiện tại, trong đó chỉ số 0 là cột đầu tiên, 1 là cột thứ hai, v.v. Hằng số cuối cùng (và mặc định) MYSQLI_BOTH, như tên gọi của nó, trả về một mảng chứa cả khóa và giá trị kết hợp và liệt kê cho tập kết quả hiện tại

Cùng với hàm mysqli_fetch_array(), PHP cũng cung cấp các hàm mysqli_fetch_row() và mysqli_fetch_assoc(). Các hàm này nhận một tham số duy nhất, tài nguyên kết quả được trả về từ mysqli_query() và trả về một mảng liệt kê hoặc mảng kết hợp. Về mặt chức năng, hàm mysqli_fetch_row() giống hệt với cách gọi hàm mysqli_fetch_array() bằng hằng số MYSQLI_NUM cho tham số $array_type. Tương tự như vậy, hàm mysqli_fetch_assoc() giống với cách gọi mysqi_fetch_array() sử dụng tham số MYSQLI_ASSOC

Để minh họa việc sử dụng hàm mysqli_fetch_array(), hãy xem xét ví dụ sau, nó sẽ truy xuất tất cả các kết quả từ một truy vấn giả định vào một bảng HTML đơn giản (xem Liệt kê 24. 4)

Liệt kê 24. 4. Sử dụng Hàm mysqli_fetch_array()
First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>

Như bạn có thể thấy trong Liệt kê 24. 4, chúng tôi bắt đầu bằng cách kết nối với cơ sở dữ liệu MySQL của mình bằng hàm mysqli_connect() và sau đó tiến hành chọn cơ sở dữ liệu đã giải phóng bằng hàm mysqli_select_db(). Sau khi cơ sở dữ liệu đã được chọn, một truy vấn CHỌN có thể được thực hiện (trong trường hợp này để truy xuất họ và tên từ các thành viên bảng giả định) bằng cách sử dụng hàm mysqli_query()

Tại thời điểm này, biến $result chứa một tài nguyên đại diện cho tập kết quả của truy vấn CHỌN trước, sau cùng TỪ thành viên. Để lấy dữ liệu từ tập kết quả đó, chúng ta sử dụng hàm mysqli_fetch_array() để trả về hàng đầu tiên của tập kết quả và lưu trữ nó dưới dạng một mảng trong biến $row. Kết quả cho hàng đó sau đó được in và quá trình tiếp tục cho đến khi toàn bộ tập kết quả được duyệt qua

Trong một số trường hợp nhất định, có thể có lợi khi có thể truy cập ngẫu nhiên vào bất kỳ hàng cụ thể nào trong tập kết quả thay vì theo trình tự như đã được giới thiệu cho đến nay. Để thực hiện điều này, hàng "hiện tại" mà MySQLi sẽ truy xuất bằng một hàm chẳng hạn như mysqli_fetch_array() phải được điều chỉnh bằng hàm mysqli_data_seek(). Cú pháp của hàm này như sau

mysqli_data_seek($result, $row_num);

$result là tài nguyên tập kết quả MySQLi và $row_nu là số hàng không được lập chỉ mục để di chuyển đến

Như đã chỉ ra trước đó, hàm mysqli_data_seek() chỉ khả dụng khi tập kết quả được lưu trữ trong bộ nhớ bằng cách chuyển hằng số MYSQLI_STORE_RESULT cho mysqli_query() hoặc tương đương


Đếm hàng và cột

Thông thường, rất hữu ích khi biết có bao nhiêu hàng hoặc cột tồn tại cho một tập kết quả nhất định. Với những mục đích này, MySQLi cung cấp các hàm mysql_num_rows() và mysqli_num_fields() với cú pháp như sau

mysqli_num_rows($result)
mysqli_num_fields($result)

Trong mỗi hàm, $result là tài nguyên đại diện cho tập kết quả. Mỗi hàm trong số này sẽ trả về tổng số hàng hoặc cột tương ứng của nó cho tập kết quả được cung cấp. Nếu không có hàng nào được trả về hoặc xảy ra lỗi, các hàm này sẽ trả về giá trị Boolean false

Giải phóng kết quả

Sau khi một truy vấn được thực hiện, tập kết quả cho truy vấn đó được lưu trữ trong bộ nhớ cho đến khi tập lệnh PHP thực hiện truy vấn kết thúc. Mặc dù nói chung điều này có thể chấp nhận được, nhưng khi bạn đang làm việc với tập kết quả lớn, điều quan trọng là phải giải phóng tập kết quả trong bộ nhớ. Điều này có thể được thực hiện bằng hàm mysqli_free_result() như sau

mysqli_free_result($result)

$result là tài nguyên đại diện cho tập kết quả từ một truy vấn. Như tôi đã nói trước đây, mặc dù không phải lúc nào cũng cần giải phóng bộ nhớ khỏi tập kết quả, nhưng cách tốt nhất là làm như vậy khi không cần tập kết quả nữa

Sử dụng hàm unset() sẽ không giải phóng kết quả. Bạn phải sử dụng hàm mysqli_free_result()


Truy xuất thông báo lỗi

Bây giờ chúng ta đã xem qua một số nguyên tắc cơ bản của việc sử dụng tiện ích mở rộng MySQLi, trước khi tiếp tục, điều quan trọng là phải thảo luận về các công cụ có sẵn khi xảy ra sự cố (khi xảy ra lỗi)

Bước đầu tiên trong việc xử lý lỗi là nhận ra rằng đã xảy ra lỗi. Mặc dù đôi khi điều này có thể rõ ràng (một thông báo lỗi hiển thị được hiển thị), nhưng trong hầu hết các trường hợp, chức năng thực tế xảy ra lỗi không tạo ra bất kỳ cảnh báo hoặc lỗi hiển thị nào. Thay vào đó, hàm MySQLi được đề cập sẽ trả về giá trị Boolean false thay vì tài nguyên mong muốn hoặc giá trị mong đợi. Khi tình huống như vậy xảy ra, tiện ích mở rộng MySQLi sẽ cung cấp cho tập lệnh mã lỗi số nguyên cũng như chuỗi mô tả lỗi. Để truy xuất các giá trị này, chúng tôi sử dụng các hàm mysqli_errno() và mysqli_error(). Cú pháp của các hàm này như sau

________số 8

Trong cả hai trường hợp, $link là tài nguyên đại diện cho kết nối cơ sở dữ liệu. Hai hàm này sẽ trả về mã lỗi và mô tả gần đây nhất liên quan đến kết nối cơ sở dữ liệu được cung cấp

Như bạn có thể nhận thấy, chức năng báo cáo lỗi trong tiện ích mở rộng MySQLi yêu cầu kết nối cơ sở dữ liệu thực sự tồn tại để hoạt động. Do đó, các lỗi xảy ra trong khi gọi hàm mysqli_connect() không thể sử dụng các chức năng báo cáo lỗi này để xác định nguyên nhân gây ra lỗi. Thay vào đó, hãy sử dụng các hàm mysqli_connect_errno() và mysqli_connect_error() không chấp nhận tham số

Để minh họa việc sử dụng các chức năng báo cáo lỗi của phần mở rộng MySQLi, hãy xem xét một ví dụ về việc sử dụng chúng trong Liệt kê 24. 5

Liệt kê 24. 5. Sử dụng mysqli_error() và mysqli_errno()

Trong ví dụ được tìm thấy trong Liệt kê 24. 2, lưu ý rằng có hai vị trí tiềm ẩn có thể xảy ra lỗi. Đầu tiên là trong khi gọi hàm mysqli_connect(). Vì một lỗi ở giai đoạn đó sẽ khiến tập lệnh không có tài nguyên cơ sở dữ liệu hợp lệ, nên phải sử dụng mysqli_connect_error() và mysqli_connect_errno(). Tuy nhiên, trong lần kiểm tra lỗi thứ hai cho hàm mysqli_query(), các hàm báo cáo lỗi có thể được sử dụng để xác định lý do tại sao truy vấn không thành công

Đóng kết nối cơ sở dữ liệu

Mặc dù PHP sẽ tự động xử lý việc đóng bất kỳ kết nối cơ sở dữ liệu chưa xử lý nào (nếu thích hợp), kết nối tới cơ sở dữ liệu có thể được đóng một cách rõ ràng bằng cách sử dụng hàm mysqli_close() với cú pháp sau

mysqli_select_db($link, $dbname);
0

$link là tài nguyên đại diện cho kết nối cơ sở dữ liệu để đóng

Thực hiện nhiều truy vấn

Một trong những tính năng thiếu nhất trong phần mở rộng MySQL cũ là khả năng thực hiện nhiều truy vấn từ một lệnh PHP. Trong MySQLi, một hành động như vậy hiện có thể thực hiện được thông qua việc sử dụng hàm mysqli_multi_query(). Cú pháp của hàm này như sau

mysqli_select_db($link, $dbname);
1

$link là kết nối cơ sở dữ liệu MySQLi hợp lệ và $queries là một hoặc nhiều truy vấn SQL được phân tách bằng ký tự dấu chấm phẩy. Khi được thực thi, hàm mysqli_multi_query() trả về Boolean cho biết thao tác thành công

Không giống như hàm mysqli_query(), lưu ý rằng hàm mysqli_multi_query() không trả về kết quả trực tiếp. Để truy xuất tập kết quả đầu tiên của thao tác đa truy vấn, phải sử dụng hàm mysqli_store_result() hoặc mysqli_use_result(). Như trường hợp tham số $resultmode của hàm mysqli_query(), các hàm này xác định cách máy khách MySQL sẽ truy cập dữ liệu có trong tập kết quả. Cú pháp của các hàm này như sau

mysqli_select_db($link, $dbname);
2

$link là liên kết cơ sở dữ liệu MySQLi. Khi được thực thi, hàm này sẽ trả về tài nguyên kết quả cho tập kết quả. Tập kết quả này sau đó có thể được sử dụng theo cách thông thường bằng API MySQLi để truy xuất các hàng riêng lẻ

Vì hàm mysqli_multi_query() thực hiện tuần tự nhiều truy vấn khác nhau nên có thể truy xuất một hoặc nhiều tập kết quả. Tập kết quả đầu tiên sẽ có ngay sau khi hàm mysqli_multi_query() được thực thi. Để chuyển sang tập kết quả tiếp theo, hai chức năng được cung cấp để hỗ trợ bạn. Hàm đầu tiên trong số này là hàm mysqli_more_results() với cú pháp sau

mysqli_select_db($link, $dbname);
3

$link là liên kết cơ sở dữ liệu MySQLi. Hàm này sẽ trả về một giá trị Boolean cho biết liệu có nhiều tập kết quả khác đang chờ xử lý hay không. Để truy cập tập kết quả có sẵn tiếp theo, hàm mysqli_next_result() được sử dụng

mysqli_select_db($link, $dbname);
4

$link lại là liên kết cơ sở dữ liệu MySQLi. Hàm này sẽ chuyển tập kết quả hiện tại sang tập kết quả tiếp theo, sau đó có thể truy xuất tập kết quả này bằng cách sử dụng hàm mysqli_store_result() hoặc mysqli_use_result()

Để chứng minh việc thực thi nhiều truy vấn, hãy xem Liệt kê 24. 6

Liệt kê 24. 6. Nhiều truy vấn sử dụng MySQLi
mysqli_select_db($link, $dbname);
5

Tạo hệ thống theo dõi khách truy cập

Bây giờ chúng tôi đã giới thiệu các chức năng cơ bản được sử dụng khi tương tác với cơ sở dữ liệu từ tiện ích mở rộng MySQLi, một ví dụ thực tế theo thứ tự. Mục đích đằng sau ví dụ này là tạo ra một hệ thống theo dõi khách truy cập minh bạch cho trang web của bạn. Hệ thống này sẽ có thể theo dõi nơi một khách truy cập cụ thể đến từ đâu (nghĩa là trang họ truy cập lần đầu tiên), nơi họ truy cập vào trang web, cũng như một số thống kê khác

Bước đầu tiên để tạo bất kỳ ứng dụng Web dựa trên cơ sở dữ liệu nào là thiết kế cơ sở dữ liệu bên dưới sẽ được sử dụng. Đối với ứng dụng cụ thể này, chúng tôi sẽ cần hai bảng trong cơ sở dữ liệu. tracker, sẽ chứa thông tin theo dõi cụ thể cho từng khách truy cập và tracker_ips, sẽ liên kết ID phiên cho từng khách truy cập với địa chỉ IP của họ. Cấu trúc của các bảng này được xác định bởi các câu lệnh CREATE SQL sau đây

mysqli_select_db($link, $dbname);
6

Bây giờ các bảng đã được tạo, hãy sắp xếp một số tập lệnh PHP sẽ được sử dụng trong chương trình này. Tập lệnh đầu tiên trong số này là tập lệnh cấu hình mà tôi gọi là kết nối. inc, chứa thông tin đăng nhập và kết nối cho cơ sở dữ liệu MySQL. Sau đây là một ví dụ về kết nối. inc trong Liệt kê 24. 7

Liệt kê 24. 7. kết nối. tập tin inc

kết nối. bản thân tệp inc không hữu ích lắm. Tệp này được thiết kế để đưa vào tập lệnh tiếp theo, trình theo dõi. inc, như được hiển thị trong Liệt kê 24. 8

Liệt kê 24. 8. người theo dõi. tập tin inc

Trong tập lệnh này, tôi đã định nghĩa hai hàm là hàm query_array() và hàm connect_db(). Các chức năng này chỉ là các trình bao bọc cho chức năng MySQLi mà tôi đã thảo luận và được thiết kế để đóng gói chức năng sẽ được sử dụng tại nhiều điểm trong toàn bộ tập lệnh

Điều quan trọng đầu tiên mà mỗi tập lệnh thực hiện là kết nối với cơ sở dữ liệu. Do đó, tôi đã cuộn tất cả logic liên quan đến việc kết nối với cơ sở dữ liệu vào hàm connect_db(). Hàm này tận dụng mảng toàn cầu $mysql như được xác định bởi connect. inc, được bao gồm ở đầu tệp

Cùng với việc kết nối với cơ sở dữ liệu, thực hiện một truy vấn và truy xuất tập kết quả dưới dạng một mảng là một nhiệm vụ phổ biến khác mà hàm query_array() được thiết kế. Hàm này được cung cấp một truy vấn SQL (tham số $query) và một liên kết đến cơ sở dữ liệu (tham số $link) và trả về một mảng nhiều chiều chứa toàn bộ tập kết quả

Tập lệnh tiếp theo mà chúng tôi quan tâm cung cấp chức năng theo dõi mọi người khi họ truy cập trang web. Mã cho tệp này (được gọi là trình theo dõi. php) như sau (xem Liệt kê 24. 9)

Liệt kê 24. 9. người theo dõi. tệp php

Như bạn có thể thấy, tệp này sử dụng trình theo dõi. inc đã thảo luận trước đây. Tập lệnh này được thiết kế để đưa vào mọi trang mà bạn muốn bật tính năng theo dõi và cung cấp tất cả chức năng thực tế của hệ thống theo dõi

Nhìn lại hai bảng cơ sở dữ liệu trong hệ thống này, chúng ta có bảng TRacker và TRacker_ips. Để hệ thống này hoạt động, đối với mỗi trang yêu cầu, địa chỉ IP của ứng dụng khách yêu cầu phải được tìm kiếm trong bảng tracker_ips. Nếu IP không có bản ghi trong bảng, nó phải được thêm vào. Trong cả hai trường hợp, trang thực mà IP đã truy cập cũng phải được thêm vào cơ sở dữ liệu vào bảng TRacker. Quá trình này được phản ánh trong Liệt kê 24. 9. Giả sử ba tệp tôi đã thảo luận nằm trong đường dẫn bao gồm của bạn, giờ đây bạn có thể theo dõi từng trang mà người dùng truy cập chỉ bằng cách bao gồm trình theo dõi. php trên những trang mà bạn muốn theo dõi người dùng

Vì lý do bảo mật, chúng tôi khuyên bạn nên kết nối. inc được lưu trữ ở đâu đó bên ngoài gốc tài liệu của máy chủ Web của bạn và sau đó được đưa vào từ bên trong PHP. Mặt khác, có thể bất kỳ máy khách nào cũng có thể yêu cầu tệp từ máy chủ Web và lấy thông tin đăng nhập của bạn

Mặc dù chúng tôi đã tạo chức năng cần thiết để điền dữ liệu cần thiết vào cơ sở dữ liệu để theo dõi người dùng, nhưng sẽ không có tác dụng gì nếu không có biểu diễn thích hợp của dữ liệu đó. Để sử dụng hợp lý tập lệnh này, bạn phải có khả năng hiển thị dữ liệu này ở định dạng dễ hiểu. Giao diện này được cung cấp bởi hai tập lệnh PHP bổ sung mà tôi sẽ thảo luận ngay bây giờ, bắt đầu với Liệt kê 24. 10

Liệt kê 24. 10. số liệu thống kê. tập lệnh php
mysqli_query($link, $query [, $resultmode]);
0

Tập lệnh này, được đặt tên là số liệu thống kê. php, được sử dụng để cung cấp giao diện cấp cao nhất cho hai bảng lưu trữ tất cả thông tin theo dõi mà tôi đã thảo luận trước đó. Tập lệnh này thực hiện ba truy vấn riêng biệt, mỗi truy vấn cung cấp một bộ dữ liệu khác nhau sau đó được hiển thị trong tài liệu HTML

Truy vấn đầu tiên là dễ nhất. Nó tính toán tổng số khách truy cập duy nhất bằng cách thực hiện truy vấn sau đối với bảng tracker_ips

mysqli_query($link, $query [, $resultmode]);
1

Vì tập lệnh này trả về một cột và một hàng nên quá trình truy xuất giá trị này có thể được đơn giản hóa bằng cách trả về tập kết quả dưới dạng một đối tượng. Bởi vì các đối tượng có thể được tham chiếu trực tiếp từ giá trị trả về, nên dòng mã sau đây được sử dụng để điền vào biến $total_visitors các kết quả từ truy vấn

mysqli_query($link, $query [, $resultmode]);
2

Truy vấn tiếp theo được thực hiện được sử dụng để xác định có bao nhiêu khách truy cập tồn tại trên mỗi trang và có dạng như sau

mysqli_query($link, $query [, $resultmode]);
3

Vì tập kết quả của truy vấn này nhiều hơn một hàng và một cột nên phải sử dụng các phương pháp truy xuất tập kết quả tiêu chuẩn. Ở đây cuối cùng chúng ta cũng tận dụng được hàm query_array() mà tôi đã giới thiệu trước đó trong Liệt kê 24. 8

Truy vấn cuối cùng được thực hiện trên trang này được sử dụng để tính toán một phần thông tin hữu ích khác là mỗi người truy cập trang web đã xem bao nhiêu trang. Điều này được thực hiện bằng cách thực hiện truy vấn sau đối với cơ sở dữ liệu

mysqli_query($link, $query [, $resultmode]);
4

Bây giờ chúng tôi đã thu thập tất cả dữ liệu sẽ được hiển thị, phần còn lại của tập lệnh khá dễ hiểu. Trang HTML kết quả được tạo hiển thị giống như trong Hình 24. 1

Hình 24. 1. Trang HTML mẫu
Làm thế nào để thực hiện một truy vấn trong PHP?

Mặc dù thế hệ này là tất cả các phép duyệt mảng và HTML đơn giản, nhưng một khía cạnh đáng được thảo luận là bảng cuối cùng được tạo (bảng Số lần xem trang trên mỗi địa chỉ IP). Lưu ý rằng mỗi địa chỉ IP được hiển thị dưới dạng liên kết đến tập lệnh PHP thứ hai có tên ip_stats. php. Liên kết này được sử dụng để đi sâu vào dữ liệu trong cơ sở dữ liệu và cung cấp giao diện cho phép bạn xác định chính xác trang web của bạn được duyệt theo thứ tự nào và theo thứ tự nào

Nhìn vào số liệu thống kê. php, bạn có thể thấy rằng liên kết HTML cho mỗi IP chuyển địa chỉ IP qua phương thức GET tới ip_stats. php, trông giống như sau (xem Liệt kê 24. 11)

Liệt kê 24. 11. ip_stats. tập lệnh php
mysqli_query($link, $query [, $resultmode]);
5

Như trường hợp của số liệu thống kê. tập lệnh php, ip_stats. tập lệnh php thực hiện một số truy vấn sau đó được định dạng bằng HTML và hiển thị cho người dùng. Cụ thể, tập lệnh này thực hiện hai truy vấn. Đầu tiên là như sau, xác định số lần địa chỉ IP đã cho đã truy cập một trang cụ thể

mysqli_query($link, $query [, $resultmode]);
6

Truy vấn thứ hai cung cấp một loại chi tiết khác bằng cách hiển thị chế độ xem thời gian trôi qua về cách mỗi địa chỉ IP duyệt trang web

mysqli_query($link, $query [, $resultmode]);
7

Như trường hợp trong số liệu thống kê. php, mỗi truy vấn này được thực thi và kết quả được lưu trữ dưới dạng mảng, sau đó được duyệt và hiển thị. Mặc dù tập lệnh này không nhằm mục đích thực thi trực tiếp, nhưng nó có thể được chứng minh bằng cách nhấp vào một trong các liên kết địa chỉ IP từ số liệu thống kê. tập lệnh php. Một ví dụ về đầu ra có thể được tìm thấy trong Hình 24. 2

Hình 24. 2. Trang đầu ra mẫu
Làm thế nào để thực hiện một truy vấn trong PHP?

báo cáo chuẩn bị

Khái niệm về một tuyên bố chuẩn bị không phải là mới đối với thế giới cơ sở dữ liệu. Nhiều gói cơ sở dữ liệu cấp doanh nghiệp hỗ trợ chúng và MySQL 4. 1 là không khác nhau. Hành động thực hiện truy vấn trên máy chủ cơ sở dữ liệu từ xa là một quy trình tương đối tốn kém cho cả máy chủ cơ sở dữ liệu và tập lệnh PHP của bạn. Mỗi khi một truy vấn được thực hiện, nó phải được biên dịch và gửi đến máy chủ, được thực thi và sau đó trả lại kết quả cho máy khách. Bởi vì mỗi khi tập lệnh PHP của bạn được thực thi, quá trình này phải được lặp lại, chi phí liên quan đến kết nối cơ sở dữ liệu của bạn có thể trở nên khá lớn. Các câu lệnh đã chuẩn bị rất hữu ích để giảm chi phí liên quan đến chính xác tình huống này bằng cách chỉ gửi dữ liệu thay đổi giữa hai truy vấn SQL giống hệt nhau

Có hai loại báo cáo chuẩn bị. những cái bị ràng buộc bởi các tham số của chúng và những cái bị ràng buộc bởi kết quả. Chúng ta sẽ xem xét từng cái sau

Báo cáo tham số ràng buộc

Hãy xem xét câu lệnh SQL này từ Liệt kê 24. 11, được sử dụng trong tập lệnh theo dõi IP

mysqli_query($link, $query [, $resultmode]);
8

Trong truy vấn SQL này, biến duy nhất là địa chỉ IP. Tuy nhiên, mỗi khi truy vấn này được thực thi, nó phải được máy chủ cơ sở dữ liệu biên dịch, truyền và xử lý. Thay vì chịu tất cả chi phí không cần thiết cho mỗi truy vấn, thay vào đó, các câu lệnh tham số bị ràng buộc sẽ gửi một truy vấn mẫu tới cơ sở dữ liệu sẽ được lưu trữ. Sau đó, mẫu này chỉ được biên dịch một lần và thay vào đó, các truy vấn trong tương lai chỉ cần gửi các tham số thực tế. Sau đó, các tham số này được kết hợp với truy vấn SQL đã sẵn sàng sử dụng trên máy chủ và kết quả được trả về. Vì bản thân truy vấn chỉ được gửi và biên dịch một lần bởi máy chủ, hiệu suất đạt được có thể là đáng kể

Các truy vấn SQL đã chuẩn bị không khác với bất kỳ truy vấn nào khác, ngoại trừ thay vì xác định chính các tham số của truy vấn, một dấu chấm hỏi?

mysqli_query($link, $query [, $resultmode]);
9

Lưu ý rằng trong truy vấn đã chuẩn bị của chúng tôi, các trích dẫn cần thiết cho phiên bản gốc đã bị xóa. Điều này làm nổi bật một tính năng rất tích cực khác của các câu lệnh đã chuẩn bị, chúng không cần phải trích dẫn, cũng như không cần phải thoát để ngăn chặn các cuộc tấn công SQL injection. Thay vào đó, các chi tiết như vậy được xử lý nội bộ bởi tiện ích mở rộng MySQLi và máy chủ cơ sở dữ liệu tương ứng, khi cần thiết

Thực hiện một tuyên bố đã chuẩn bị là một quá trình gồm ba bước. việc truyền mẫu truy vấn đến máy chủ, liên kết truy vấn đã chuẩn bị với các biến trong PHP và việc thực thi chính truy vấn đó. Nhiệm vụ đầu tiên trong số này, chuẩn bị mẫu truy vấn MySQL, được xử lý bằng cách sử dụng hàm mysqli_prepare() có cú pháp như minh họa

mysqli_fetch_array($result [, $array_type])
0

$link là liên kết cơ sở dữ liệu mysqli và $prepared_query là mẫu truy vấn SQL để chuẩn bị. Khi thực thi, hàm mysqli_prepare() trả về một câu lệnh biểu thị truy vấn đã chuẩn bị

Sau khi một câu lệnh đã chuẩn bị được tạo, các tham số được chỉ định trong mẫu có thể được liên kết với các biến PHP bằng cách sử dụng hàm mysqli_bind_param(). Cú pháp của hàm này như sau

mysqli_fetch_array($result [, $array_type])
1

$stmt đại diện cho tài nguyên được trả về từ câu lệnh mysqli_prepare(). Hàm này chấp nhận bất kỳ số lượng tham số nào và được sử dụng để chỉ định các giá trị sẽ được sử dụng trong câu lệnh đã chuẩn bị. Bắt đầu từ trái sang phải trong truy vấn SQL đã chuẩn bị, tham số $types là một chuỗi biểu thị loại dữ liệu mà tham số truy vấn SQL tương ứng chứa. Các loại được chấp nhận như trong Bảng 24. 1

Bảng 24. 1. Các loại tham số báo cáo đã chuẩn bị

i

Các loại số nguyên (tất cả chúng)

d

Số dấu phẩy động hoặc dấu phẩy động

b

đốm màu

s

Tất cả các loại khác

Do đó, nếu câu lệnh đã chuẩn bị của bạn chứa hai VARCHAR và một loại FLOAT, thì chuỗi "ssd" sẽ được sử dụng cho tham số $types

Ngay sau tham số $types là tất cả các giá trị sẽ bị ràng buộc. Các tham số này phải được trình bày theo thứ tự như trong chính câu lệnh đã chuẩn bị, tham số $types

Điều cực kỳ quan trọng cần lưu ý là khi một biến được liên kết với một câu lệnh đã chuẩn bị, mọi thay đổi được thực hiện đối với biến đó trong PHP sẽ ảnh hưởng đến tham số được sử dụng trong truy vấn. Xem xét truy vấn sau

mysqli_fetch_array($result [, $array_type])
2

và câu lệnh chuẩn bị/ràng buộc sau đây

Khi các biến $bookname, $bookisbn và $bookprice được liên kết với câu lệnh, các giá trị mà các biến này chứa không thực sự được sử dụng cho đến khi câu lệnh được thực thi. Do đó, việc thay đổi biến $bookname sau câu lệnh mysqli_bind_param() sẽ thay đổi giá trị được sử dụng trong chính truy vấn đó. Trên thực tế, các biến được cung cấp cho hàm mysqli_bind_param() thậm chí không tồn tại khi chúng được liên kết với truy vấn. Do đó, những điều sau đây cũng sẽ tạo ra một câu lệnh chuẩn bị giống hệt nhau

Bước thứ ba và cũng là bước cuối cùng khi làm việc với một câu lệnh chuẩn bị có giới hạn tham số là thực thi câu lệnh. Điều này được thực hiện bằng cách sử dụng câu lệnh mysqli_stmt_execute(), câu lệnh chấp nhận câu lệnh để thực thi dưới dạng tham số duy nhất của nó

mysqli_fetch_array($result [, $array_type])
5

Thay vì mysqli_stmt_execute(), cũng có thể sử dụng bí danh mysqli_execute().

Khi được thực thi, các giá trị hiện tại cho các tham số bị ràng buộc sẽ được sử dụng trong truy vấn và một Boolean sẽ được trả về cho biết thành công của truy vấn. Sau khi một câu lệnh đã được thực thi và không còn cần thiết nữa, nó có thể bị hủy bằng cách sử dụng hàm mysqli_stmt_close()

mysqli_fetch_array($result [, $array_type])
6

Liệt kê 24. 12 trình bày một ví dụ đầy đủ về việc sử dụng liên kết tham số trong MySQLi

Liệt kê 24. 12. Ràng buộc tham số trong MySQLi

Giá trị kết quả ràng buộc

Trong phần trước, tôi đã thảo luận về việc tạo các câu lệnh chuẩn bị bằng cách sử dụng liên kết tham số. Trong phần này, chúng ta sẽ xem xét việc sử dụng liên kết kết quả để truy cập kết quả của một truy vấn SQL. Nhớ lại từ phần trước rằng việc sửa đổi nội dung của tham số liên kết đã ảnh hưởng đến tham số trong truy vấn (ngay cả khi biến đã được sửa đổi sau khi liên kết của nó). Khi làm việc với các kết quả, một hành vi tương tự tồn tại, ngoại trừ lần này nó xử lý các kết quả được trả về. Xem xét truy vấn sau

mysqli_fetch_array($result [, $array_type])
8

Như được hiển thị, khi truy vấn này được thực hiện, một bảng kết quả ba cột sẽ được trả về cho những hàng phù hợp với truy vấn. Như trường hợp liên kết tham số, ba cột tập kết quả này cũng có thể được liên kết với các biến PHP. Điều này được thực hiện bằng hàm mysqli_stmt_bind_result()

Hàm mysqli_stmt_bind_result() có bí danh ngắn hơn là mysqli_bind_result()

mysqli_fetch_array($result [, $array_type])
9

$stmt là tài nguyên câu lệnh đã được thực thi. Mỗi tham số bổ sung được chỉ định trong hàm mysqli_stmt_bind_result() sẽ được liên kết với một cột tập kết quả tương ứng. Do đó, số lượng biến được chỉ định được kết nối trực tiếp với số lượng cột trong tập kết quả

Bây giờ bạn đã hiểu cách liên kết các biến PHP với các cột tập kết quả, dữ liệu riêng lẻ từ mỗi hàng được trích xuất như thế nào? . Hàm này chấp nhận một tham số duy nhất đại diện cho câu lệnh để tìm nạp từ

First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
0

Khi được thực thi, hàm mysqli_stmt_fetch() truy xuất một hàng từ tập kết quả và điền vào các biến liên kết tương ứng với các giá trị từ nó. Hàm mysqli_stmt_fetch() trả về true nếu tìm nạp được thực thi, false nếu xảy ra lỗi hoặc NULL nếu không còn hàng nào tồn tại

đừng quên. Mặc dù false và NULL là hai kiểu khác nhau, nhưng cả hai sẽ đánh giá là Boolean false trừ khi một trong các toán tử so sánh kiểm tra kiểu (chẳng hạn như ===) được sử dụng

Liệt kê 24. 13 minh họa việc sử dụng ràng buộc kết quả

Liệt kê 24. 13. Ràng buộc kết quả trong báo cáo đã chuẩn bị
First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
1

Giao dịch

Giao dịch là một tính năng chính có sẵn trong tiện ích mở rộng MySQLi mới, cho phép các tập lệnh PHP của bạn đảm bảo rằng một loạt các thao tác SQL thực thi hoàn toàn hoặc hoàn toàn không. Mặc dù bản thân các giao dịch đã có sẵn từ MySQL 4. 0 trở lên, phần mở rộng MySQLi là phần mở rộng đầu tiên cung cấp một loạt lệnh gọi hàm để làm việc với chúng từ bên trong PHP

Để sử dụng các giao dịch trong MySQL, bạn phải tạo một bảng tương thích với giao dịch trong cơ sở dữ liệu của mình. Để làm như vậy, nó phải là loại bảng InnoDB hoặc BDB. Điều này được thực hiện bằng cách chỉ định một tham số kiểu cho câu lệnh SQL CREATE của bạn, như được hiển thị

First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
2

Để sử dụng các giao dịch trong MySQLi, ba chức năng được cung cấp. Hàm đầu tiên trong số này là hàm mysqli_autocommit(). Chức năng này xác định hành vi của MySQL khi xử lý cơ sở dữ liệu tương thích với giao dịch bằng cách xác định xem, theo mặc định, tất cả các truy vấn SQL sẽ ngay lập tức có hiệu lực. Cú pháp của hàm này như hình

First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
3

$link là tài nguyên liên kết cơ sở dữ liệu MySQLi và $mode là Boolean cho biết liệu các chế độ tự động có được bật hay không. Khi được thực thi, hàm này trả về Boolean cho biết thao tác có được thực hiện thành công hay không. Để xác định trạng thái hiện tại của autocommits trên máy chủ, câu lệnh SQL sau có thể được thực thi

First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
4

Nó trả về một hàng và một cột, sẽ là 1 nếu được bật hoặc 0 nếu không

Để thực sự sử dụng các giao dịch, điều quan trọng là phải tắt tính năng tự động cam kết bằng cách gọi mysqli_autocommit() với giá trị sai. Sau khi nó bị vô hiệu hóa, bất kỳ thay đổi nào được thực hiện đối với các bảng tương thích với giao dịch phải được cam kết trước khi các thay đổi có hiệu lực. Để thực hiện thay đổi đối với một bảng, hàm mysqli_commit() được sử dụng, chỉ chuyển tài nguyên liên kết cơ sở dữ liệu $link, như được hiển thị

First NameLast Name";
     while($row = mysqli_fetch_array($result)) {
          echo "";
          echo "{$row['first']}{$row['last']}";
          echo "";
     }
     echo ";
     mysqli_close($link);

?>
5

Như tôi đã trình bày ở phần đầu của phần này, các giao dịch cho phép bạn đảm bảo rằng một loạt các thao tác SQL đều được thực thi hoặc hoàn toàn không. Trước một lệnh gọi hàm mysqli_commit(), bất kỳ và tất cả các hoạt động diễn ra trước lệnh gọi mysqli_commit() cuối cùng có thể được hoàn nguyên (hoặc "khôi phục") bằng một lệnh gọi hàm mysqli_rollback(). Cú pháp của hàm này như sau

Làm cách nào để thực hiện truy vấn trong PHP?

Chúng ta có thể thực hiện truy vấn đối với cơ sở dữ liệu bằng cách sử dụng phương thức mysqli_query() của PHP . cú pháp. Chúng ta có thể sử dụng phương thức mysqli_query() theo hai cách. Phong cách hướng đối tượng. phong cách thủ tục.

Làm thế nào để thực hiện một truy vấn đơn giản trong PHP với ví dụ?

Trong mọi trường hợp, hàm PHP để thực hiện truy vấn là mysql_query(). $result = mysql_query($query); Đối với các truy vấn đơn giản như CHÈN, CẬP NHẬT, XÓA, v.v. (không trả về bản ghi), biến $result sẽ là TRUE hoặc FALSE dựa trên việc thực hiện thành công truy vấn trên cơ sở dữ liệu.

Làm cách nào để thực hiện truy vấn đối với cơ sở dữ liệu trong PHP?

Hàm query() / mysqli_query() thực hiện truy vấn cơ sở dữ liệu.

Làm cách nào để chạy truy vấn cơ sở dữ liệu trong PHP?

Đầu tiên, chúng tôi thiết lập một truy vấn SQL để chọn các cột id, tên và họ từ bảng MyGuests. Dòng mã tiếp theo chạy truy vấn và đặt dữ liệu kết quả vào một biến có tên $result. Sau đó, hàm num_rows() kiểm tra xem có nhiều hơn 0 hàng được trả về không