Dữ liệu được lưu trữ trong cơ sở dữ liệu SQL bằng HTML như thế nào?

Hướng dẫn này có tất cả những gì bạn cần cho điều đó. http. //www. asp. mạng/biểu mẫu web/hướng dẫn/truy cập dữ liệu/giới thiệu/tạo-một-truy cập-dữ liệu-lớp-cs

Như bạn có thể thấy từ các liên kết chính trên asp. net, có nhiều cách khác nhau để sử dụng. mạng lưới. Trang web, Biểu mẫu web và MVC

Sử dụng phần giới thiệu bên dưới để giúp bạn quyết định nên sử dụng phần nào. Mỗi người có tài liệu hướng dẫn về truy cập dữ liệu.  

Tôi nghĩ bạn sẽ thấy rằng Entity Framework là một lớp truy cập dữ liệu khá hữu ích nếu bạn chọn sử dụng nó

Bài viết sau đây là một đoạn trích từ PHP & MySQL. Novice to Ninja, Phiên bản thứ 7, hướng dẫn thực hành để tìm hiểu tất cả các công cụ, nguyên tắc và kỹ thuật cần thiết để xây dựng một ứng dụng web chuyên nghiệp. Trong hướng dẫn cuối cùng của loạt bài này, bạn sẽ học cách lấy thông tin được lưu trữ trong cơ sở dữ liệu MySQL và hiển thị nó trên một trang web để mọi người cùng xem.

  • Thiết lập môi trường phát triển PHP của bạn với Docker
  • Hướng dẫn cho người mới bắt đầu về PHP
  • Giới thiệu MySQL. Hướng dẫn cho người mới bắt đầu
  • Hiển thị dữ liệu từ MySQL trên Web. một lời giới thiệu

Đây là nó - nội dung bạn đã đăng ký. Trong chương này, bạn sẽ học cách lấy thông tin được lưu trữ trong cơ sở dữ liệu MySQL và hiển thị nó trên một trang web để mọi người cùng xem.

Cho đến giờ, bạn đã viết mã PHP đầu tiên của mình và học những kiến ​​thức cơ bản về MySQL, một công cụ cơ sở dữ liệu quan hệ và PHP, một ngôn ngữ kịch bản phía máy chủ

Bây giờ bạn đã sẵn sàng tìm hiểu cách sử dụng các công cụ này cùng nhau để tạo trang web nơi người dùng có thể xem dữ liệu từ cơ sở dữ liệu và thậm chí thêm dữ liệu của riêng họ

Ghi chú. như trong Chương 3, tôi đang sử dụng “MySQL” ở đây để chỉ giao thức cơ sở dữ liệu. Các tập lệnh PHP của bạn sẽ làm như vậy. Có rất nhiều tài liệu tham khảo trong chương này — và trong mã PHP mà bạn sẽ viết — đến “MySQL”, mặc dù chúng ta thực sự đang kết nối với cơ sở dữ liệu MariaDB

Bức tranh lớn

Trước khi tiến về phía trước, bạn nên lùi lại một bước để có một bức tranh rõ ràng về mục tiêu cuối cùng của mình. Chúng tôi có hai công cụ mạnh mẽ theo ý của chúng tôi. ngôn ngữ kịch bản PHP và công cụ cơ sở dữ liệu MySQL. Điều quan trọng là phải hiểu những thứ này sẽ khớp với nhau như thế nào

Mục đích của việc sử dụng MySQL cho trang web của chúng tôi là cho phép lấy động nội dung từ cơ sở dữ liệu để tạo các trang web để xem trong trình duyệt thông thường. Vì vậy, ở một đầu của hệ thống, bạn có một khách truy cập vào trang web của mình bằng trình duyệt web để yêu cầu một trang. Trình duyệt đó mong muốn nhận lại một tài liệu HTML tiêu chuẩn. Ở đầu bên kia, bạn có nội dung trang web của mình, nằm trong một hoặc nhiều bảng trong cơ sở dữ liệu MySQL chỉ hiểu cách trả lời các truy vấn SQL [lệnh]

Như thể hiện trong hình trên, ngôn ngữ kịch bản PHP là ngôn ngữ trung gian nói cả hai ngôn ngữ. Nó xử lý yêu cầu trang và tìm nạp dữ liệu từ cơ sở dữ liệu MySQL bằng cách sử dụng các truy vấn SQL giống như những truy vấn bạn đã sử dụng để tạo một bảng truyện cười trong Chương 3. Sau đó, nó tự động đưa nó ra dưới dạng trang HTML được định dạng đẹp mắt mà trình duyệt mong đợi

Để bạn luôn rõ ràng và mới mẻ, đây là điều sẽ xảy ra khi có khách truy cập vào một trang trên trang web của bạn

  1. Trình duyệt web của khách truy cập yêu cầu trang web từ máy chủ web của bạn
  2. Phần mềm máy chủ web [thường là Apache hoặc NGINX] nhận ra rằng tệp được yêu cầu là tập lệnh PHP, vì vậy máy chủ sẽ kích hoạt trình thông dịch PHP để thực thi mã có trong tệp
  3. Một số lệnh PHP [sẽ là trọng tâm của chương này] kết nối với cơ sở dữ liệu MySQL và yêu cầu nội dung thuộc về trang web
  4. Cơ sở dữ liệu MySQL phản hồi bằng cách gửi nội dung được yêu cầu tới tập lệnh PHP
  5. Tập lệnh PHP lưu nội dung vào một hoặc nhiều biến PHP, sau đó sử dụng câu lệnh
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    1 để xuất nội dung dưới dạng một phần của trang web
  6. Trình thông dịch PHP kết thúc bằng cách gửi một bản sao HTML mà nó đã tạo cho máy chủ web
  7. Máy chủ web gửi HTML tới trình duyệt web dưới dạng tệp HTML thuần túy, ngoại trừ việc thay vì đến trực tiếp từ tệp HTML, trang này là đầu ra được cung cấp bởi trình thông dịch PHP. Trình duyệt không có cách nào để biết điều này, tuy nhiên. Đối với trình duyệt, nó yêu cầu và nhận một trang web giống như bất kỳ trang web nào khác.

Tạo tài khoản người dùng MySQL

Để PHP kết nối với máy chủ cơ sở dữ liệu MySQL của bạn, nó sẽ cần sử dụng tên người dùng và mật khẩu. Cho đến nay, tất cả những gì cơ sở dữ liệu trò đùa của bạn chứa là một số điều thú vị, nhưng chẳng bao lâu nó có thể chứa thông tin nhạy cảm như địa chỉ email và các chi tiết riêng tư khác về người dùng trang web của bạn. Vì lý do này, MySQL được thiết kế rất an toàn, cho phép bạn kiểm soát chặt chẽ những kết nối nào nó sẽ chấp nhận và những kết nối đó được phép làm gì

Môi trường Docker đã chứa người dùng MySQL trong Chương 3, mà bạn đã sử dụng để đăng nhập vào máy chủ MySQL

Bạn có thể kết nối với cơ sở dữ liệu từ tập lệnh PHP của mình bằng cùng tên người dùng [

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
2] và mật khẩu [
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
2], nhưng sẽ rất hữu ích nếu bạn tạo một tài khoản mới — bởi vì nếu bạn có máy chủ web, bạn có thể muốn sử dụng nó để lưu trữ nhiều hơn . Bằng cách cung cấp cho mỗi trang web tài khoản người dùng của riêng mình, bạn sẽ có nhiều quyền kiểm soát hơn đối với những người có quyền truy cập vào dữ liệu cho bất kỳ trang web cụ thể nào. Nếu bạn đang làm việc với các nhà phát triển khác, bạn có thể cấp cho họ quyền truy cập vào các trang web mà họ đang làm việc, nhưng không còn nữa

Bạn nên tạo một tài khoản người dùng mới chỉ với các đặc quyền cụ thể mà nó cần để hoạt động trên cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4 mà trang web của bạn phụ thuộc vào. Hãy làm điều đó ngay bây giờ

Để tạo người dùng, hãy mở MySQL Workbench và kết nối với máy chủ của bạn. Sau đó chạy các truy vấn sau


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';

Truy vấn đầu tiên khá dễ hiểu. Nó tạo một người dùng có tên là

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
5 với mật khẩu
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
6. Dấu hiệu
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
7 sau tên người dùng cho biết cơ sở dữ liệu có thể được kết nối từ bất kỳ vị trí nào. Truy vấn thứ hai cung cấp cho người dùng quyền truy cập đầy đủ vào lược đồ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4, kết quả là người dùng này có thể xem và sửa đổi tất cả các bảng, cột và dữ liệu trong lược đồ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4 nhưng không có quyền truy cập vào bất kỳ thứ gì bên ngoài nó

Bây giờ người dùng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
5 đã được tạo, chúng ta có thể sử dụng nó để kết nối với cơ sở dữ liệu. Có thể thiết lập kết nối trong MySQL Workbench với người dùng này, nhưng vì quyền hạn bị hạn chế nên tốt hơn hết là giữ MySQL Workbench bằng tài khoản
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
2. Thay vào đó, chúng tôi sẽ sử dụng người dùng mới khi kết nối từ tập lệnh PHP

Kết nối với MySQL bằng PHP

Trước khi bạn có thể truy xuất nội dung từ cơ sở dữ liệu MySQL của mình để đưa vào trang web, bạn phải biết cách thiết lập kết nối với MySQL từ bên trong tập lệnh PHP. Cho đến giờ, bạn đã sử dụng một ứng dụng có tên là MySQL Workbench để kết nối với cơ sở dữ liệu của mình. Giống như MySQL Workbench có thể kết nối trực tiếp với máy chủ MySQL đang chạy, các tập lệnh PHP của riêng bạn cũng vậy

Mặc dù chương này hoàn toàn nói về việc kết nối với MySQL từ PHP, nhưng chúng tôi thực sự đang kết nối với cơ sở dữ liệu MariaDB đã thảo luận trong chương trước. PHP không thể thấy bất kỳ sự khác biệt nào giữa MySQL và MariaDB, vì chúng có thể hoán đổi cho nhau. Tôi sẽ gọi cơ sở dữ liệu là MySQL xuyên suốt, bởi vì tất cả các lệnh được sử dụng có thể được sử dụng để kết nối với máy chủ cơ sở dữ liệu MySQL hoặc MariaDB

Cơ sở dữ liệu MySQL ban đầu đã cung cấp một phương pháp tiêu chuẩn hóa cho các máy khách như MySQL Workbench và PHP để giao tiếp với máy chủ. MariaDB đã sao chép tiêu chuẩn đó và tất cả các lệnh trong PHP đều sử dụng tên MySQL, vì vậy để đơn giản, tôi sẽ sử dụng thuật ngữ MySQL trong suốt chương này để chỉ cơ sở dữ liệu

Có ba phương pháp kết nối với máy chủ MySQL từ PHP

  • thư viện MySQL
  • thư viện mysqli
  • thư viện PDO

Về cơ bản, tất cả đều thực hiện cùng một công việc — kết nối với cơ sở dữ liệu và gửi truy vấn đến nó — nhưng chúng sử dụng mã khác nhau để đạt được điều đó

Thư viện MySQL là phương pháp kết nối cơ sở dữ liệu lâu đời nhất và được giới thiệu trong PHP 2. 0. Các tính năng mà nó chứa là tối thiểu và nó đã được thay thế bởi MySQLi kể từ PHP 5. 0 [phát hành năm 2004]

Để kết nối và truy vấn cơ sở dữ liệu bằng thư viện MySQL cũ, các chức năng như

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
22 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
23 được sử dụng. Các chức năng này không được dùng nữa — nghĩa là nên tránh sử dụng chúng — kể từ PHP 5. 5 và đã bị xóa hoàn toàn khỏi PHP kể từ PHP 7. 0

Mặc dù hầu hết các nhà phát triển đã thấy lý do của sự thay đổi ngay khi PHP 5. 0 đã được phát hành, vẫn còn hàng trăm bài báo và ví dụ mã trên Web sử dụng các hàm

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
24 hiện không tồn tại này - mặc dù thực tế là MySQLi đã thực sự là thư viện ưa thích trong mười lăm năm

Nếu bạn bắt gặp một ví dụ mã có chứa dòng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
22, hãy kiểm tra ngày của bài báo. Có thể là từ đầu những năm 2000, và trong lập trình, bạn không bao giờ nên tin bất cứ thứ gì cũ kỹ như vậy. Mọi thứ luôn thay đổi - đó là lý do tại sao cuốn sách này được tái bản lần thứ bảy

Trong PHP5. 0, thư viện MySQLi — viết tắt của “MySQL Cải tiến” — đã được phát hành để giải quyết một số hạn chế trong thư viện MySQL gốc. Bạn có thể dễ dàng xác định việc sử dụng MySQLi, vì mã sẽ sử dụng các chức năng như

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
26 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
27

Ngay sau khi phát hành thư viện MySQLi trong PHP 5. 0, PHP5. 1 đã được phát hành, với một số thay đổi đáng kể giúp định hình cách chúng ta viết PHP ngày nay [chủ yếu liên quan đến lập trình hướng đối tượng, mà bạn sẽ thấy nhiều ở phần sau của cuốn sách này]. Một trong những thay đổi lớn trong PHP 5. Thứ nhất là nó đã giới thiệu một thư viện thứ ba, PDO [PHP Data Objects], để kết nối với cơ sở dữ liệu MySQL

Có một số khác biệt giữa PDO và MySQLi, nhưng điểm chính là bạn có thể sử dụng thư viện PDO để kết nối với hầu hết mọi máy chủ cơ sở dữ liệu — chẳng hạn như máy chủ Oracle hoặc Microsoft SQL Server. Đối với các nhà phát triển, lợi thế lớn nhất của cách tiếp cận chung này là khi bạn đã học cách sử dụng thư viện để tương tác với cơ sở dữ liệu MySQL, thì việc tương tác với một máy chủ cơ sở dữ liệu khác sẽ rất đơn giản.

Có thể cho rằng, việc viết mã cho PDO đơn giản hơn và có một số sắc thái có thể làm cho mã PDO dễ đọc hơn — các tham số được đặt tên trong các câu lệnh đã chuẩn bị là lợi ích chính. [Đừng lo lắng, tôi sẽ giải thích điều đó có nghĩa là gì sau. ]

Vì những lý do này, hầu hết các dự án PHP gần đây đều sử dụng thư viện PDO và đó là thư viện mà tôi sẽ chỉ cho bạn cách sử dụng trong cuốn sách này. Để biết thêm thông tin về sự khác biệt, hãy xem bài viết của SitePoint “Giới thiệu lại PDO – Cách phù hợp để truy cập cơ sở dữ liệu trong PHP”

Sau bài học lịch sử nhỏ đó, có lẽ bạn rất muốn quay lại viết mã. Đây là cách bạn sử dụng PDO để thiết lập kết nối với máy chủ MySQL

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
8

Bây giờ, hãy coi

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 như một hàm tích hợp sẵn, giống như hàm
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
29 mà chúng ta đã sử dụng trong Chương 2. Nếu bạn đang nghĩ “Này, các hàm không thể có khoảng trắng trong tên của chúng. ”, bạn thông minh hơn con gấu trung bình và tôi sẽ giải thích chính xác điều gì đang xảy ra ở đây trong giây lát. Trong mọi trường hợp, phải mất ba đối số

  • một chuỗi chỉ định loại cơ sở dữ liệu [
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    800], tên máy chủ của máy chủ [
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    801] và tên của cơ sở dữ liệu [
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    802]
  • tên người dùng MySQL mà bạn muốn PHP sử dụng
  • mật khẩu MySQL cho tên người dùng đó

Bạn có thể nhớ từ Chương 2 rằng các hàm PHP thường trả về một giá trị khi chúng được gọi. “Hàm”

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 này trả về một giá trị được gọi là đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 xác định kết nối đã được thiết lập. Vì chúng tôi dự định sử dụng kết nối, chúng tôi nên giữ giá trị này bằng cách lưu trữ nó trong một biến. Đây là giao diện của nó, với các giá trị cần thiết được điền vào để kết nối với cơ sở dữ liệu của bạn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
6

Bạn có thể thấy điều gì đang xảy ra với hai đối số cuối cùng. chúng là tên người dùng và mật khẩu bạn đã tạo trước đó trong chương này

Đối số đầu tiên phức tạp hơn một chút. Phần

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
805 yêu cầu PDO sử dụng cơ sở dữ liệu [còn được gọi là lược đồ] có tên là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4. Mọi truy vấn chạy từ PHP sẽ mặc định là các bảng trong lược đồ đó.
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
807 sẽ chọn các bản ghi từ bảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
808 trong lược đồ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4

Ngay cả khi bạn đã quen thuộc với PHP, PDO và MySQL, phần

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
810 vẫn có vẻ khó hiểu. Thông thường, đây sẽ là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
811 [chỉ máy tính cục bộ, cùng một máy chạy PHP] hoặc trỏ đến một tên miền cụ thể nơi cơ sở dữ liệu được lưu trữ, chẳng hạn như
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
812

Tại sao lại là

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
810 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
814 đề cập đến điều gì ở đây? . Nếu bạn kiểm tra tệp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
815 cấu hình máy chủ, dịch vụ cơ sở dữ liệu được gọi là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
814 và trong Docker, một dịch vụ có thể kết nối với dịch vụ khác bằng tên của dịch vụ kia

Đối số sang một bên, điều quan trọng cần thấy ở đây là giá trị được trả về bởi

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 được lưu trữ trong một biến có tên
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
818

Máy chủ MySQL là một phần mềm hoàn toàn riêng biệt với máy chủ web. Do đó, chúng tôi phải xem xét khả năng máy chủ có thể không khả dụng hoặc không thể truy cập được do mạng ngừng hoạt động hoặc do tổ hợp tên người dùng/mật khẩu bạn cung cấp bị máy chủ từ chối hoặc do bạn quên khởi động máy chủ MySQL của mình. Trong những trường hợp như vậy,

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 sẽ không chạy và sẽ đưa ra một ngoại lệ PHP

Ghi chú. ít nhất là theo mặc định, PHP có thể được cấu hình sao cho không có ngoại lệ nào được ném ra và đơn giản là nó sẽ không kết nối. Đây không phải là hành vi mong muốn nói chung, vì nó khiến việc tìm ra lỗi sai trở nên khó khăn hơn nhiều

Nếu bạn đang thắc mắc "ném một ngoại lệ PHP" có nghĩa là gì, hãy chuẩn bị tinh thần. Bạn sắp khám phá thêm một số tính năng của ngôn ngữ PHP

Ngoại lệ PHP là điều xảy ra khi bạn yêu cầu PHP thực hiện một tác vụ và nó không thể thực hiện được. PHP sẽ cố gắng làm những gì nó được yêu cầu, nhưng sẽ thất bại; . Một ngoại lệ ít hơn PHP chỉ bị lỗi với một thông báo lỗi cụ thể. Khi một ngoại lệ được đưa ra, PHP dừng lại. Không có dòng mã nào sau lỗi sẽ được thực thi

Là một nhà phát triển có trách nhiệm, công việc của bạn là nắm bắt ngoại lệ đó và làm gì đó để chương trình có thể tiếp tục

Ghi chú. nếu bạn không nắm bắt được một ngoại lệ, PHP sẽ ngừng chạy tập lệnh PHP của bạn và hiển thị một thông báo lỗi cực kỳ xấu xí. Thông báo lỗi đó thậm chí sẽ tiết lộ mã của tập lệnh của bạn đã gây ra lỗi. Trong trường hợp này, mã đó chứa tên người dùng và mật khẩu MySQL của bạn, vì vậy điều đặc biệt quan trọng là tránh để người dùng nhìn thấy thông báo lỗi

Để bắt ngoại lệ, bạn nên bao quanh mã có thể ném ngoại lệ bằng câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
3

Bạn có thể coi câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 giống như câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
822, ngoại trừ khối mã thứ hai là điều sẽ xảy ra nếu khối mã đầu tiên không chạy được

Bối rối chưa?


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
6

Như bạn có thể thấy, đoạn mã này là một câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820. Trong khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824 ở trên cùng, chúng tôi cố gắng kết nối với cơ sở dữ liệu bằng cách sử dụng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28. Nếu điều này thành công, chúng tôi lưu trữ đối tượng PDO kết quả trong
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
818 để chúng tôi có thể làm việc với kết nối cơ sở dữ liệu mới của mình. Nếu kết nối thành công, biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 được đặt thành thông báo sẽ hiển thị sau

Điều quan trọng, bên trong câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820, bất kỳ mã nào sau khi ném ngoại lệ sẽ không được thực thi. Trong trường hợp này, nếu kết nối với cơ sở dữ liệu đưa ra một ngoại lệ [có thể mật khẩu sai hoặc máy chủ không phản hồi], biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 sẽ không bao giờ được đặt thành “Đã thiết lập kết nối cơ sở dữ liệu”

Nếu nỗ lực kết nối cơ sở dữ liệu của chúng tôi không thành công, PHP sẽ ném một

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
830, đây là loại ngoại lệ mà
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 ném ra. Do đó, khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
832 của chúng tôi nói rằng nó sẽ bắt một PDOException [và lưu trữ nó trong một biến có tên là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
833]. Bên trong khối đó, chúng tôi đặt biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 để chứa thông báo về những gì đã xảy ra

Tuy nhiên, thông báo lỗi này không đặc biệt hữu ích. Tất cả những gì nó cho chúng tôi biết là PDO không thể kết nối với máy chủ cơ sở dữ liệu. Sẽ tốt hơn nếu có một số thông tin về lý do tại sao lại như vậy — ví dụ: vì tên người dùng và mật khẩu không hợp lệ

Biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
833 chứa thông tin chi tiết về ngoại lệ đã xảy ra, bao gồm thông báo lỗi mô tả sự cố. Chúng ta có thể thêm phần này vào biến đầu ra bằng cách sử dụng phép nối

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
0

Ghi chú. biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
833 không phải là một chuỗi, mà là một đối tượng. Chúng ta sẽ sớm hiểu điều đó có nghĩa là gì. Tuy nhiên, hiện tại, tất cả những gì bạn cần biết là mã
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
837 nhận thông báo lỗi dựa trên ngoại lệ cụ thể đã xảy ra

Giống như câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
822, một trong hai nhánh của câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 được đảm bảo chạy. Mã trong khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824 sẽ thực thi thành công hoặc mã trong khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
832 sẽ chạy. Bất kể kết nối cơ sở dữ liệu có thành công hay không, sẽ có một thông báo trong biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 — thông báo lỗi hoặc thông báo cho biết kết nối thành công

Cuối cùng, bất kể khối

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824 thành công hay khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
832 chạy, mẫu
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
845 đều được bao gồm. Đây là một mẫu chung chỉ hiển thị một số văn bản trên trang

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
1

Mã hoàn chỉnh có thể được tìm thấy trong Ví dụ. MySQL-Kết nối

Khi mẫu được bao gồm, nó sẽ hiển thị thông báo lỗi hoặc thông báo “Đã thiết lập kết nối cơ sở dữ liệu”

Tôi hy vọng mã nói trên hiện có ý nghĩa với bạn. Vui lòng quay lại phần đầu của phần này và đọc lại tất cả nếu bạn bị lạc, vì có một số khái niệm phức tạp trong đó. Tuy nhiên, khi bạn đã nắm vững mã, có thể bạn sẽ nhận ra rằng tôi vẫn còn để lại một bí ẩn chưa giải thích được. PDO. Chính xác thì

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 là gì, và khi tôi nói nó trả về một “đối tượng PDO”, chính xác thì một đối tượng là gì?

Ghi chú. tất cả mã mẫu đã tải xuống bao gồm một lược đồ có tên là ________ 1847 và một người dùng có tên là ________ 1847, vì vậy bạn có thể chạy nó bất kể bạn gọi là lược đồ và người dùng của mình là gì. Một tệp chứa cơ sở dữ liệu được cung cấp dưới dạng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
849, bạn có thể nhập tệp này

Nếu bạn sử dụng trình xem mã mẫu dựa trên web được cung cấp, cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
850 sẽ được tạo khi bạn tải một mẫu nhưng mọi thay đổi đối với giản đồ này sẽ bị mất khi bạn xem một mẫu khác. [Bạn có thể làm mọi thứ rối tung lên và chuyển sang một mẫu khác và quay lại sẽ đặt lại nó, nhưng nếu bạn muốn giữ bất kỳ thay đổi nào bạn đã thực hiện, hãy thực hiện chúng trong lược đồ bạn đã tạo. ]

Nếu bạn muốn tải dữ liệu mẫu vào lược đồ của mình bằng MySQL Workbench, hãy nhập

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
849 từ thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
852 bằng cách chọn Nhập/Khôi phục dữ liệu. Sau đó, chọn Nhập từ tệp độc lập, duyệt đến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
849 và chọn tên lược đồ của bạn trong lược đồ đích mặc định. Nếu bạn đã tạo bất kỳ bảng nào có cùng tên, chúng sẽ bị ghi đè và tất cả các bản ghi sẽ bị mất

Khóa học cấp tốc về lập trình hướng đối tượng

Bạn có thể nhận thấy từ “đối tượng” bắt đầu len lỏi vào vốn từ vựng của tôi trong phần trước. PDO là phần mở rộng Đối tượng dữ liệu PHP và

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 trả về một đối tượng PDO. Trong phần này, tôi muốn giải thích tất cả các đối tượng là gì

Có lẽ bạn đã bắt gặp thuật ngữ lập trình hướng đối tượng [OOP] trong quá trình khám phá PHP hoặc lập trình nói chung của riêng bạn. OOP là một phong cách lập trình tiên tiến đặc biệt phù hợp để xây dựng các chương trình thực sự phức tạp với nhiều phần. Hầu hết các ngôn ngữ lập trình đang sử dụng hiện nay đều hỗ trợ OOP. Một số trong số họ thậm chí yêu cầu bạn làm việc theo kiểu OOP. PHP dễ tính hơn một chút và để nhà phát triển quyết định có viết tập lệnh của họ theo kiểu OOP hay không

Cho đến nay, chúng ta đã viết mã PHP của mình theo một phong cách đơn giản hơn được gọi là lập trình thủ tục và hiện tại chúng ta sẽ tiếp tục làm như vậy, với một cái nhìn chi tiết hơn về các đối tượng sau này. Phong cách thủ tục rất phù hợp với các dự án tương đối đơn giản mà chúng tôi đang giải quyết vào lúc này. Tuy nhiên, hầu hết tất cả các dự án phức tạp mà bạn gặp đều sử dụng OOP, và tôi sẽ trình bày chi tiết hơn ở phần sau của cuốn sách này

Điều đó nói rằng, phần mở rộng PDO mà chúng ta sẽ sử dụng để kết nối và làm việc với cơ sở dữ liệu MySQL được thiết kế theo phong cách lập trình hướng đối tượng. Điều này có nghĩa là, thay vì chỉ gọi một hàm để kết nối với MySQL và sau đó gọi các hàm khác sử dụng kết nối đó, trước tiên chúng ta phải tạo một đối tượng PDO sẽ đại diện cho kết nối cơ sở dữ liệu của chúng ta, sau đó sử dụng các tính năng của đối tượng đó để làm việc với

Tạo một đối tượng cũng giống như gọi một hàm. Trên thực tế, bạn đã thấy cách thực hiện

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
6

Từ khóa

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
855 cho PHP biết rằng bạn muốn tạo một đối tượng mới. Sau đó, bạn để lại một khoảng trắng và chỉ định tên lớp, tên này sẽ cho PHP biết loại đối tượng bạn muốn tạo. Một lớp là một tập hợp các hướng dẫn mà PHP sẽ tuân theo để tạo một đối tượng. Bạn có thể coi một lớp là một công thức, chẳng hạn như một chiếc bánh và một đối tượng là chiếc bánh thực tế được tạo ra từ việc làm theo công thức. Các lớp khác nhau có thể tạo ra các đồ vật khác nhau, giống như các công thức nấu ăn khác nhau có thể tạo ra các món ăn khác nhau

Giống như PHP đi kèm với một loạt các hàm dựng sẵn mà bạn có thể gọi, PHP đi kèm với một thư viện các lớp mà bạn có thể tạo các đối tượng từ đó. Do đó,

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 yêu cầu PHP tạo một đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 mới — nghĩa là một đối tượng mới của lớp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 tích hợp

Trong PHP, một đối tượng là một giá trị, giống như một chuỗi, số hoặc mảng. Bạn có thể lưu trữ một đối tượng trong một biến hoặc chuyển đối tượng đó vào một hàm dưới dạng đối số — tất cả những điều tương tự mà bạn có thể thực hiện với các giá trị PHP khác. Tuy nhiên, các đối tượng có một số tính năng bổ sung hữu ích

Trước hết, một đối tượng hoạt động rất giống một mảng, ở chỗ nó đóng vai trò là nơi chứa các giá trị khác. Như chúng ta đã thấy trong Chương 2, bạn có thể truy cập một giá trị bên trong một mảng bằng cách chỉ định chỉ mục của nó [ví dụ:

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
859]. Khi nói đến các đối tượng, các khái niệm tương tự nhau nhưng tên và mã khác nhau. Thay vì truy cập giá trị được lưu trữ trong một chỉ mục mảng, chúng tôi nói rằng chúng tôi đang truy cập một thuộc tính của đối tượng. Thay vì sử dụng dấu ngoặc vuông để chỉ định tên của thuộc tính chúng tôi muốn truy cập, chúng tôi sử dụng ký hiệu mũi tên [
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
860] — ví dụ:
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
861

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value

Trong khi mảng thường được sử dụng để lưu trữ danh sách các giá trị tương tự [chẳng hạn như mảng ngày sinh], các đối tượng được sử dụng để lưu trữ danh sách các giá trị có liên quan [ví dụ: thuộc tính của kết nối cơ sở dữ liệu]. Tuy nhiên, nếu đó là tất cả các đối tượng đã làm, sẽ không có nhiều điểm cho chúng. chúng ta cũng có thể sử dụng một mảng để lưu trữ các giá trị này, phải không?

Ngoài việc lưu trữ một tập hợp các thuộc tính và giá trị của chúng, các đối tượng có thể chứa một nhóm các chức năng được thiết kế để mang lại cho chúng ta nhiều tính năng hữu ích hơn. Một hàm được lưu trữ trong một đối tượng được gọi là một phương thức [một trong những cái tên khó hiểu hơn trong thế giới lập trình, nếu bạn hỏi tôi]. Một phương thức chỉ là một chức năng bên trong một lớp. Khó hiểu hơn, khi chúng ta bắt đầu viết các lớp của riêng mình, các phương thức được định nghĩa bằng từ khóa

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
862. Ngay cả những nhà phát triển có kinh nghiệm cũng thường sử dụng sai hàm và phương thức thay thế cho nhau

Để gọi một phương thức, chúng ta lại sử dụng ký hiệu mũi tên —

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
863

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
2

Cũng giống như các hàm độc lập, các phương thức có thể nhận đối số và trả về giá trị

Ở giai đoạn này, điều này có lẽ nghe hơi phức tạp và vô nghĩa, nhưng hãy tin tôi. tập hợp các tập hợp biến [thuộc tính] và hàm [phương thức] lại với nhau thành các gói nhỏ được gọi là đối tượng dẫn đến mã gọn gàng hơn và dễ đọc hơn cho một số tác vụ nhất định - làm việc với cơ sở dữ liệu chỉ là một trong số chúng. Một ngày nào đó, bạn thậm chí có thể muốn phát triển các lớp tùy chỉnh mà bạn có thể sử dụng để tạo các đối tượng do chính bạn nghĩ ra.

Tuy nhiên, hiện tại, chúng tôi sẽ gắn bó với các lớp đi kèm với PHP. Hãy tiếp tục làm việc với đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 mà chúng ta đã tạo và xem chúng ta có thể làm gì bằng cách gọi một trong các phương thức của nó

Định cấu hình kết nối

Cho đến giờ, tôi đã chỉ cho bạn cách tạo đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 để thiết lập kết nối với cơ sở dữ liệu MySQL của bạn và cách hiển thị thông báo lỗi có ý nghĩa khi xảy ra sự cố

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
80

Tuy nhiên, giả sử kết nối thành công, bạn cần định cấu hình trước khi sử dụng. Bạn có thể định cấu hình kết nối của mình bằng cách gọi một số phương thức của đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 mới của bạn

Trước khi gửi truy vấn đến cơ sở dữ liệu, chúng tôi sẽ cần định cấu hình mã hóa ký tự của kết nối cơ sở dữ liệu của chúng tôi. Như tôi đã đề cập ngắn gọn trong Chương 2, bạn nên sử dụng văn bản được mã hóa UTF-8 trong trang web của mình để tối đa hóa phạm vi ký tự mà người dùng có thể tùy ý sử dụng khi điền vào biểu mẫu trên trang web của bạn. Theo mặc định, khi PHP kết nối với MySQL, nó sử dụng mã hóa ISO-8859-1 [hoặc Latin-1] đơn giản hơn thay vì UTF-8. Nếu chúng tôi để nó như vậy, chúng tôi sẽ không thể dễ dàng chèn các ký tự tiếng Trung, tiếng Ả Rập hoặc hầu hết các ký tự không phải tiếng Anh

Ngay cả khi bạn chắc chắn 100% rằng trang web của bạn sẽ chỉ được sử dụng bởi những người nói tiếng Anh, vẫn có những vấn đề khác do không đặt bộ ký tự. Nếu trang web của bạn không được đặt thành UTF-8, bạn sẽ gặp sự cố khi mọi người viết một số ký tự như dấu ngoặc kép

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
867 vào hộp văn bản, vì chúng sẽ xuất hiện trong cơ sở dữ liệu dưới dạng một ký tự khác

Do đó, bây giờ chúng ta cần đặt đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 mới của mình để sử dụng mã hóa UTF-8

Chúng ta có thể hướng dẫn PHP sử dụng UTF-8 khi truy vấn cơ sở dữ liệu bằng cách thêm

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
869 vào chuỗi kết nối. Không có nhược điểm nào khi thực hiện việc này, miễn là tập lệnh PHP của bạn cũng đang được gửi tới trình duyệt dưới dạng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
870 [là mặc định trong các phiên bản PHP gần đây]

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
81

Ghi chú. nếu bạn tìm kiếm, bạn sẽ tìm thấy nhiều cách khác nhau để đặt bộ ký tự và các ấn bản trước của cuốn sách này đã hướng dẫn bạn sử dụng mã này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
82

Điều này là do, cho đến PHP 5. 3. 6, tùy chọn bộ ký tự không được PHP áp dụng chính xác. Vì điều này đã được khắc phục trong bất kỳ phiên bản PHP nào mà bạn thực sự sẽ sử dụng, nên việc đặt bộ ký tự như một phần của chuỗi kết nối là tùy chọn ưu tiên

Mã hoàn chỉnh mà chúng tôi sử dụng để kết nối với MySQL và sau đó định cấu hình kết nối đó, do đó, được hiển thị bên dưới

Thí dụ. MySQL-Kết nối-Hoàn thành

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
83

Kích hoạt ví dụ này trong trình duyệt của bạn. [Nếu bạn đã đặt mã cơ sở dữ liệu của mình vào

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
871 bên trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
872 và tệp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
845 trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
874, thì URL của trang sẽ là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
875. ]

Nếu máy chủ của bạn đang hoạt động và mọi thứ đều hoạt động bình thường, bạn sẽ thấy thông báo cho biết thành công

Nếu PHP không thể kết nối với máy chủ MySQL của bạn hoặc nếu tên người dùng và mật khẩu bạn cung cấp không chính xác, thay vào đó, bạn sẽ thấy một màn hình tương tự như hiển thị bên dưới. Để đảm bảo mã xử lý lỗi của bạn hoạt động bình thường, bạn có thể cố ý viết sai chính tả mật khẩu của mình để kiểm tra mật khẩu

Nhờ khối

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
832 của chúng tôi, thông báo lỗi từ cơ sở dữ liệu đã được đưa vào trang

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
84

Phương thức

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
877 trả về một thông báo mô tả ngoại lệ đã xảy ra. Có một số phương thức khác — bao gồm
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
878 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
879 — để trả về tên tệp và số dòng mà ngoại lệ đã được ném vào. Bạn có thể tạo một thông báo lỗi rất chi tiết như thế này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
85

Điều này cực kỳ hữu ích nếu bạn có một trang web lớn với hàng tá tệp bao gồm. Thông báo lỗi sẽ cho bạn biết chính xác tập tin nào cần xem và lỗi xảy ra trên dòng nào

Nếu bạn tò mò, hãy thử chèn một số lỗi khác vào mã kết nối cơ sở dữ liệu của bạn [ví dụ: tên cơ sở dữ liệu sai chính tả] và quan sát các thông báo lỗi chi tiết dẫn đến. Khi bạn hoàn tất và kết nối cơ sở dữ liệu của bạn hoạt động bình thường, hãy quay lại thông báo lỗi đơn giản. Bằng cách này, khách truy cập của bạn sẽ không bị tấn công bởi kỹ thuật gobbledygook nếu có sự cố thực sự xảy ra với máy chủ cơ sở dữ liệu của bạn

Với kết nối được thiết lập và cơ sở dữ liệu được chọn, bạn đã sẵn sàng bắt đầu sử dụng dữ liệu được lưu trữ trong cơ sở dữ liệu

Bạn có thể thắc mắc điều gì sẽ xảy ra với kết nối với máy chủ MySQL sau khi tập lệnh thực thi xong. Nếu bạn thực sự muốn, bạn có thể buộc PHP ngắt kết nối khỏi máy chủ bằng cách loại bỏ đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 đại diện cho kết nối của bạn. Bạn làm điều này bằng cách đặt biến chứa đối tượng thành
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
881

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
86

Điều đó nói rằng, PHP sẽ tự động đóng mọi kết nối cơ sở dữ liệu đang mở khi nó chạy xong tập lệnh của bạn, vì vậy bạn thường có thể để PHP dọn dẹp sau khi bạn

Gửi truy vấn SQL bằng PHP

Trong Chương 3, chúng tôi đã kết nối với máy chủ cơ sở dữ liệu MySQL bằng MySQL Workbench, cho phép chúng tôi nhập các truy vấn SQL [lệnh] và xem kết quả của các truy vấn đó ngay lập tức. Đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804 cung cấp một cơ chế tương tự — phương thức exec

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
87

Ở đây,

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
883 là một chuỗi chứa bất kỳ truy vấn SQL nào bạn muốn thực hiện

Như bạn đã biết, nếu có sự cố khi thực thi truy vấn [ví dụ: nếu bạn mắc lỗi đánh máy trong truy vấn SQL của mình], phương thức này sẽ đưa ra một

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
830 để bạn bắt

Xem xét ví dụ sau, ví dụ này cố gắng tạo ra bảng trò đùa mà chúng ta đã tạo trong Chương 3

Thí dụ. MySQL-Tạo

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
88

Lưu ý rằng chúng tôi sử dụng cùng một kỹ thuật câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 để xử lý các lỗi có thể do truy vấn tạo ra. Có thể sử dụng nhiều khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 để hiển thị các thông báo lỗi khác nhau — một cho kết nối và một cho truy vấn — nhưng điều này có thể dẫn đến một lượng mã bổ sung đáng kể

Thay vào đó, tôi đã chọn sử dụng cùng một câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824 để chứa cả kết nối và truy vấn. Khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 sẽ ngừng thực thi mã sau khi xảy ra lỗi, vì vậy nếu xảy ra lỗi trong quá trình kết nối cơ sở dữ liệu, dòng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
889 sẽ không bao giờ chạy, đảm bảo rằng, nếu một truy vấn được gửi đến cơ sở dữ liệu, kết nối phải được thiết lập

Cách tiếp cận này giúp chúng tôi kiểm soát ít hơn một chút đối với thông báo lỗi được hiển thị nhưng tiết kiệm được việc nhập câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820 cho mỗi thao tác cơ sở dữ liệu. Ở phần sau của cuốn sách này, chúng ta sẽ chia chúng thành các khối khác nhau, nhưng hiện tại, hãy giữ tất cả các thao tác cơ sở dữ liệu trong cùng một khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824

Ví dụ này cũng sử dụng phương thức

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
892 để truy xuất thông báo lỗi chi tiết từ máy chủ MySQL. Hình ảnh sau đây cho thấy lỗi được hiển thị, chẳng hạn như khi bảng trò đùa đã tồn tại

Đối với các truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
893,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
894 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
895 [dùng để sửa đổi dữ liệu được lưu trữ], phương thức
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
896 trả về số lượng hàng của bảng [mục nhập] bị ảnh hưởng bởi truy vấn. Hãy xem xét lệnh SQL sau, mà chúng ta đã sử dụng trong Chương 3 để đặt ngày của tất cả các trò đùa có chứa từ “lập trình viên”

Thí dụ. Cập nhật MySQL

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
89

Bằng cách lưu trữ giá trị được trả về từ phương thức exec trong

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
897, chúng ta có thể sử dụng biến trong biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 để in trong mẫu

Hình ảnh bên dưới hiển thị đầu ra của ví dụ này, giả sử chỉ có một trò đùa "lập trình viên" trong cơ sở dữ liệu của bạn

Nếu bạn làm mới trang để chạy lại cùng một truy vấn, bạn sẽ thấy thông báo thay đổi, như thể hiện trong hình ảnh sau. Nó chỉ ra rằng không có hàng nào được cập nhật, vì ngày mới được áp dụng cho truyện cười giống với ngày hiện tại

Truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899 được xử lý hơi khác một chút, vì chúng có thể truy xuất rất nhiều dữ liệu và PHP cung cấp các cách để xử lý thông tin đó

Xử lý Tập kết quả
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899

Đối với hầu hết các truy vấn SQL, phương pháp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
896 hoạt động tốt. Truy vấn thực hiện điều gì đó với cơ sở dữ liệu của bạn và bạn nhận được số hàng bị ảnh hưởng [nếu có] từ giá trị trả về của phương thức. Tuy nhiên, các truy vấn của
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899 yêu cầu thứ gì đó phức tạp hơn một chút so với
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
896. Bạn sẽ nhớ lại rằng truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899 được sử dụng để xem dữ liệu được lưu trữ trong cơ sở dữ liệu. Thay vì chỉ ảnh hưởng đến cơ sở dữ liệu, truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899 có kết quả — và chúng tôi cần một phương thức để trả về chúng

Phương thức truy vấn trông giống như

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
896, ở chỗ nó chấp nhận truy vấn SQL làm đối số để gửi đến máy chủ cơ sở dữ liệu. Tuy nhiên, những gì nó trả về là một đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607, đại diện cho một tập hợp kết quả chứa danh sách tất cả các hàng [mục nhập] được trả về từ truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
60

Với điều kiện là không gặp lỗi trong quá trình xử lý truy vấn, mã này sẽ lưu trữ một tập kết quả [ở dạng đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607] vào biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
609. Tập hợp kết quả này chứa văn bản của tất cả các truyện cười được lưu trữ trong bảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
808. Vì không có giới hạn thực tế về số lượng truyện cười trong cơ sở dữ liệu nên tập hợp kết quả có thể khá lớn

Tôi đã đề cập ở Chương 2 rằng vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 là một cấu trúc điều khiển hữu ích khi chúng ta cần lặp nhưng không biết bao nhiêu lần. Chúng tôi không thể sử dụng vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
612 vì chúng tôi không biết truy vấn đã trả về bao nhiêu bản ghi. Thật vậy, bạn có thể sử dụng vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 tại đây để xử lý từng hàng trong tập kết quả

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
61

Điều kiện cho vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 có thể khác với các điều kiện mà bạn đã từng sử dụng, vì vậy hãy để tôi giải thích cách thức hoạt động của nó. Hãy coi điều kiện là một tuyên bố của chính nó

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
62

Phương thức

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
615 của đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 trả về hàng tiếp theo trong tập kết quả dưới dạng một mảng [chúng ta đã thảo luận về mảng trong Chương 2]. Khi không còn hàng nào trong tập kết quả, thay vào đó,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
615 trả về
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
618. [Đây là một trường hợp khi yêu cầu một đối tượng PDO làm điều gì đó mà nó không thể làm - vì
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
615 không thể trả về hàng tiếp theo khi không còn hàng nào trong tập kết quả - sẽ không đưa ra kết quả
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
830. Nếu đúng như vậy, chúng ta sẽ không thể sử dụng phương thức
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
615 trong điều kiện vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 như cách chúng ta làm ở đây. ]

Bây giờ, câu lệnh trên gán một giá trị cho biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
623, nhưng đồng thời, toàn bộ câu lệnh sẽ nhận cùng giá trị đó. Đây là điều cho phép bạn sử dụng câu lệnh như một điều kiện trong vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611. Vì vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 sẽ tiếp tục lặp cho đến khi điều kiện của nó ước tính thành
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
618, vòng lặp này sẽ xảy ra nhiều lần khi có các hàng trong tập kết quả, với
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
623 nhận giá trị của hàng tiếp theo mỗi khi vòng lặp thực thi. Tất cả những gì còn lại để tìm ra là làm thế nào để lấy các giá trị ra khỏi biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
623 mỗi khi vòng lặp chạy

Các hàng của tập kết quả được trả về bởi

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
615 được biểu diễn dưới dạng mảng kết hợp, với các chỉ số được đặt tên theo các cột của bảng trong tập kết quả. Nếu
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
623 là một hàng trong tập hợp kết quả của chúng tôi, thì
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
631 là giá trị trong cột
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632 của hàng đó

Mục tiêu của chúng tôi trong mã này là lưu trữ văn bản của tất cả các câu chuyện cười để chúng tôi có thể hiển thị chúng trong một mẫu PHP. Cách tốt nhất để làm điều này là lưu trữ mỗi trò đùa dưới dạng một mục mới trong một mảng,

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
63

Với những câu chuyện cười được lấy ra khỏi cơ sở dữ liệu, giờ đây chúng ta có thể chuyển chúng sang một mẫu PHP

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634

Tóm lại, đây là mã của bộ điều khiển cho ví dụ này cho đến nay

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
64

Biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 là một mảng lưu trữ danh sách các truyện cười. Nếu bạn viết ra nội dung của mảng trong PHP, nó sẽ giống như thế này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
65

Tuy nhiên, dữ liệu đã được lấy từ cơ sở dữ liệu chứ không phải được nhập thủ công trong mã

Bạn sẽ nhận thấy rằng có hai biến khác nhau đang được đặt —

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
637 — tùy thuộc vào việc khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824 có được thực thi thành công hay không

Trong template

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634, chúng ta cần hiển thị nội dung của mảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 hoặc thông báo lỗi chứa trong biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
637

Để kiểm tra xem một biến đã được gán giá trị hay chưa, chúng ta có thể sử dụng hàm

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
642 mà chúng ta đã sử dụng trước đó để kiểm tra xem một biểu mẫu đã được gửi hay chưa. Mẫu có thể bao gồm một câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 để xác định xem hiển thị lỗi hay danh sách truyện cười

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
66

Không có gì mới ở đây, nhưng để hiển thị các câu chuyện cười, chúng ta cần hiển thị nội dung của mảng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633. Không giống như các biến khác mà chúng tôi đã sử dụng cho đến thời điểm này, mảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 không chỉ chứa một giá trị đơn lẻ

Cách phổ biến nhất để xử lý mảng trong PHP là sử dụng vòng lặp. Chúng ta đã thấy các vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 và vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
612. Vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 đặc biệt hữu ích để xử lý mảng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
67

Thay vì một điều kiện, các dấu ngoặc đơn ở đầu vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 chứa một mảng, theo sau là từ khóa
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
650, sau đó là tên của một biến mới sẽ lần lượt được sử dụng để lưu trữ từng mục của mảng. Phần thân của vòng lặp sau đó được thực hiện một lần cho mỗi mục trong mảng. Mỗi khi mục đó được lưu trữ trong biến đã chỉ định, để mã có thể truy cập trực tiếp vào mục đó

Người ta thường sử dụng vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 trong mẫu PHP để hiển thị lần lượt từng mục của một mảng. Đây là cách nó có thể tìm kiếm mảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 của chúng ta

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
68

Với sự pha trộn giữa mã PHP để mô tả vòng lặp và mã HTML để hiển thị nó, mã trông khá lộn xộn. Do đó, người ta thường sử dụng một cách khác để viết vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 khi nó được sử dụng trong một mẫu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
69

Hai đoạn mã giống hệt nhau về mặt chức năng, nhưng phần sau trông thân thiện hơn khi trộn với mã HTML. Đây là hình thức mã này trông như thế nào trong một mẫu


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
30

Điều tương tự cũng có thể được thực hiện với câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643, làm cho nó đẹp hơn khi xem các mẫu HTML bên trong bằng cách tránh các dấu ngoặc nhọn


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
31

Với những công cụ mới này trong tay, chúng ta có thể viết mẫu của mình để hiển thị danh sách truyện cười

Thí dụ. Danh sách MySQLTruyện cười


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
32

Văn bản

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
637 được hiển thị trên trang hoặc mỗi câu chuyện cười được hiển thị trong một đoạn văn [
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
656] có trong một trích dẫn khối [
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
657], vì chúng tôi đang trích dẫn tác giả của mỗi câu chuyện cười trong trang này một cách hiệu quả

Bởi vì truyện cười có thể chứa các ký tự có thể được hiểu là mã HTML [ví dụ:

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
658,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
659 hoặc
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
660], chúng tôi phải sử dụng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
661 để đảm bảo chúng được dịch sang các thực thể ký tự HTML [nghĩa là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
662,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
663 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
664]

Hình ảnh sau đây cho thấy trang này trông như thế nào khi bạn đã thêm một vài câu chuyện cười vào cơ sở dữ liệu

Hãy nhớ cách chúng tôi sử dụng vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 trong bộ điều khiển của mình để tìm nạp từng hàng một trong tập kết quả
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607?


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
33

Hóa ra các đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 được thiết kế để hoạt động giống như các mảng khi bạn chuyển chúng vào vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648. Do đó, bạn có thể đơn giản hóa một chút mã xử lý cơ sở dữ liệu của mình bằng cách sử dụng vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 thay vì vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
34

Tôi sẽ sử dụng biểu mẫu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 gọn gàng hơn này trong phần còn lại của cuốn sách này

Một công cụ gọn gàng khác mà PHP cung cấp là một cách viết tắt để gọi lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
1 — như bạn đã thấy, chúng ta cần sử dụng thường xuyên. Câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
1 của chúng tôi trông như thế này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
35

Thay vào đó, chúng ta có thể sử dụng cái này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
36

Điều này làm chính xác điều tương tự.

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
674 có nghĩa là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
1 và cung cấp cho bạn cách in biến ngắn hơn một chút. Có một hạn chế đối với điều này, mặc dù. nếu bạn sử dụng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
674, bạn chỉ có thể in. Bạn không thể bao gồm các câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643, câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
612, v.v., mặc dù bạn có thể sử dụng phép nối và có thể theo sau nó bằng một lệnh gọi hàm

Đây là một mẫu được cập nhật bằng cách sử dụng tiếng vang tốc ký

Thí dụ. MySQL-ListJokes-Viết tắt


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
37

Tôi sẽ sử dụng ký hiệu tốc ký khi nó được áp dụng từ thời điểm này trở đi

Ghi chú. trong các phiên bản PHP trước 5. 4, ký hiệu tốc ký này yêu cầu bật cài đặt PHP khá phổ biến, do đó, nó không được khuyến khích vì lý do tương thích. Việc sử dụng ký hiệu tốc ký có thể khiến mã của bạn ngừng hoạt động khi di chuyển từ máy chủ đã bật tính năng này sang máy chủ không bật

Kể từ PHP 5. 4 [vì vậy bất kỳ phiên bản nào bạn thực sự sẽ gặp trong những ngày này], tiếng vang tốc ký hoạt động bất kể cài đặt PHP, vì vậy bạn có thể sử dụng nó một cách an toàn mà không phải lo lắng rằng nó có thể không hoạt động trên tất cả các máy chủ

suy nghĩ trước

Trong ví dụ chúng ta vừa xem, chúng ta đã tạo một mẫu,

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634, chứa tất cả HTML cần thiết để hiển thị trang. Tuy nhiên, khi trang web của chúng tôi phát triển, chúng tôi sẽ thêm nhiều trang hơn. Chúng tôi chắc chắn sẽ muốn có một trang để mọi người có thể thêm các câu chuyện cười vào trang web và chúng tôi cũng sẽ cần một trang chủ với một số văn bản giới thiệu, một trang có chi tiết liên hệ của chủ sở hữu và khi trang web phát triển, thậm chí có thể

Tôi đang đi trước một chút ở đây, nhưng nó luôn đáng để xem xét một dự án sẽ phát triển như thế nào. Nếu chúng tôi áp dụng cách tiếp cận mà chúng tôi vừa sử dụng cho

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634 cho các mẫu còn lại — ________ 2681, ________ 2682, ________ 2683, _______ 2684, v.v. — chúng ta sẽ có rất nhiều mã lặp lại

Mỗi trang trên trang web sẽ yêu cầu một mẫu trông giống như thế này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
38

Là một lập trình viên, lặp lại mã là một trong những điều tồi tệ nhất bạn có thể làm. Trên thực tế, các lập trình viên thường nhắc đến nguyên tắc DRY, viết tắt của cụm từ “Don’t repeat yourself”. Nếu bạn thấy mình lặp lại các đoạn mã, gần như chắc chắn có một giải pháp tốt hơn

Tất cả các lập trình viên giỏi nhất đều lười biếng và lặp lại mã có nghĩa là lặp lại công việc. Sử dụng phương pháp sao chép/dán này cho các mẫu khiến trang web rất khó duy trì. Hãy tưởng tượng có một phần chân trang và phần điều hướng mà chúng tôi muốn xuất hiện trên mỗi trang. Các mẫu của chúng tôi bây giờ sẽ trông như thế này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
39

Chúng ta sẽ gặp sự cố vào năm 2022. Nếu các mẫu cho tất cả các trang trên trang web — ví dụ:

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
681,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
682,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
683 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
684 — chứa mã theo cấu trúc trên, thì để cập nhật năm trong thông báo bản quyền thành “2022”, bạn cần mở từng mẫu trong số đó.

Chúng tôi có thể thông minh và đọc ngày tự động từ đồng hồ của máy chủ [

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
690 nếu bạn tò mò. ] để tránh sự cố này, nhưng nếu chúng tôi muốn thêm thẻ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
691 vào mỗi trang thì sao?

Thay đổi năm hoặc sáu mẫu có thể hơi khó chịu, nhưng nó sẽ không gây ra nhiều vấn đề. Tuy nhiên, nếu website phát triển lên hàng chục, hàng trăm trang thì sao?

Vấn đề này có thể được giải quyết bằng một loạt các câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692. Ví dụ


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
60

Nhưng phương pháp này đòi hỏi phải có khả năng thấu thị. chúng tôi cần dự đoán chính xác những thay đổi nào có thể cần thực hiện trong tương lai và sử dụng các câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692 có liên quan ở những nơi chúng tôi thấy trước những thay đổi sẽ xảy ra

Ví dụ, trong ví dụ trên, thật dễ dàng để thêm các mục nhập menu mới bằng cách thêm chúng vào

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
694, nhưng thêm thẻ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
691 vào mọi trang hoặc thậm chí một việc nhỏ nhặt như thêm một lớp CSS vào thành phần
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
696, vẫn có nghĩa là mở mọi mẫu

Không có cách nào để dự đoán chính xác tất cả những thay đổi có thể cần thiết trong suốt thời gian tồn tại của trang web, vì vậy, thay vào đó, phương pháp tôi đã chỉ cho bạn ở đầu chương này thực sự tốt hơn


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
61

Nếu chúng tôi luôn bao gồm mẫu này, mà chúng tôi sẽ gọi là

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697, thì có thể đặt biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 thành một số mã HTML và để nó xuất hiện trên trang có điều hướng và chân trang. Lợi ích của việc này là để thay đổi ngày trên mọi trang của trang web, chúng tôi chỉ cần thay đổi ngày ở một vị trí

Tôi cũng đã thêm một biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
699 để mỗi bộ điều khiển có thể xác định một giá trị xuất hiện giữa các thẻ

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
300 và

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
301 cùng với một số CSS [có sẵn dưới dạng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
302 trong mã mẫu] để làm cho trang đẹp hơn một chút

Bất kỳ bộ điều khiển nào hiện có thể sử dụng


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
303 và cung cấp các giá trị cho
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
699


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306 của chúng tôi sử dụng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697 được mã hóa như hình bên dưới

Thí dụ. MySQL-ListJokes-Layout-1


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
62

Nhưng đợi đã. Điều gì đang xảy ra với

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 trong khối
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
824? . vòng lặp xây dựng một chuỗi chứa mã HTML cho danh sách truyện cười

Về nguyên tắc, đây là những gì chúng tôi muốn xảy ra. biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 chứa mã HTML sẽ được chèn vào giữa phần điều hướng và chân trang trong
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697, nhưng tôi nghĩ bạn sẽ đồng ý rằng mã này cực kỳ xấu

Tôi đã chỉ cho bạn cách tránh trộn mã HTML và PHP thông qua câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692. Giống như chúng tôi đã làm trước đó, sẽ rất tốt nếu chuyển HTML để hiển thị truyện cười vào tệp riêng của nó — nhưng lần này, chỉ mã HTML duy nhất cho trang danh sách truyện cười

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634 trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
874 phải chứa mã này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
63

Điều quan trọng, đây chỉ là mã để hiển thị các câu chuyện cười. Nó không chứa điều hướng, chân trang, thẻ


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
316 hoặc bất kỳ thứ gì chúng tôi muốn lặp lại trên mỗi trang;

Để sử dụng mẫu này, bạn có thể thử như sau


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
64

Hoặc nếu bạn rất thông minh


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
65

Với cách tiếp cận này, logic của bạn sẽ hoàn toàn hợp lý. Chúng ta cần bao gồm

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634. Thật không may, câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692 chỉ thực thi mã từ tệp được bao gồm tại điểm được gọi là. Nếu bạn chạy mã ở trên, đầu ra thực sự sẽ giống như thế này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
66

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634 được đưa vào trước nên nó được gửi tới trình duyệt trước. Những gì chúng ta cần làm là tải
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634, nhưng thay vì gửi kết quả đầu ra thẳng đến trình duyệt, chúng ta cần nắm bắt và lưu trữ nó trong biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 để sau này
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697 có thể sử dụng nó

Câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692 không trả về giá trị, vì vậy

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
324 không có tác dụng mong muốn và PHP không có câu lệnh thay thế để thực hiện điều đó. Tuy nhiên, điều đó không có nghĩa là không thể

PHP có một tính năng hữu ích được gọi là “bộ đệm đầu ra”. Nghe có vẻ phức tạp, nhưng khái niệm này thực sự rất đơn giản. khi bạn sử dụng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
1 để in nội dung nào đó hoặc
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
692 để bao gồm tệp chứa HTML, thông thường tệp đó sẽ được gửi trực tiếp tới trình duyệt. Bằng cách sử dụng bộ đệm đầu ra, thay vì đầu ra được gửi thẳng đến trình duyệt, mã HTML được lưu trữ trên máy chủ trong một “bộ đệm”, về cơ bản chỉ là một chuỗi chứa mọi thứ đã được in cho đến nay

Thậm chí tốt hơn, PHP cho phép bạn bật bộ đệm và đọc nội dung của nó bất cứ lúc nào

Có hai chức năng chúng ta cần

  • 
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    327, khởi động bộ đệm đầu ra. Sau khi gọi chức năng này, mọi thứ được in qua
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    1 hoặc HTML được in qua
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    692 sẽ được lưu trữ trong bộ đệm thay vì được gửi tới trình duyệt
  • 
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    330, trả về nội dung của bộ đệm và xóa nó

Như bạn có thể đoán, “ob” trong tên hàm là viết tắt của “bộ đệm đầu ra”

Để nắm bắt nội dung của một tệp được bao gồm, chúng ta chỉ cần sử dụng hai chức năng này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
67

Khi mã này chạy, biến

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 sẽ chứa HTML được tạo trong mẫu
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634

Chúng tôi sẽ sử dụng phương pháp này từ bây giờ. Mỗi trang sẽ được tạo thành từ hai mẫu

  • $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    697, chứa tất cả HTML phổ biến cần thiết cho mỗi trang
  • một mẫu duy nhất chỉ chứa mã HTML duy nhất cho trang cụ thể đó


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306 hoàn chỉnh trông như thế này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
68

Hãy làm cho liên kết “Trang chủ” hoạt động bằng cách thêm tệp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
871. Chúng tôi có thể đặt bất cứ điều gì trên trang này. truyện cười mới nhất, truyện cười hay nhất trong tháng hoặc bất cứ thứ gì chúng tôi thích. Tuy nhiên, hiện tại, chúng tôi sẽ giữ cho nó đơn giản và chỉ có một thông báo có nội dung “Chào mừng bạn đến với Cơ sở dữ liệu trò đùa trên Internet”

Tạo một tệp có tên

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
682 trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
874


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
69

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
871 của chúng tôi đơn giản hơn đáng kể so với
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634. Nó không nhận được bất kỳ thông tin nào từ cơ sở dữ liệu, vì vậy nó không cần kết nối cơ sở dữ liệu và chúng tôi không cần câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
820, vì vậy chúng tôi sẽ chỉ tải hai mẫu và đặt các biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
699 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827

Thí dụ. MySQL-ListJokes-Layout-3

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
00

Ghi chú. thực hành tốt là chỉ kết nối với cơ sở dữ liệu nếu bạn cần. Cơ sở dữ liệu là nút cổ chai hiệu suất phổ biến nhất trên nhiều trang web, do đó, ưu tiên tạo càng ít kết nối càng tốt

Kiểm tra xem cả hai trang có hoạt động trong trình duyệt của bạn không. Bạn nên có một danh sách các câu chuyện cười khi truy cập vào


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
343 và thông điệp chào mừng trên

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
343. Cả hai trang phải chứa điều hướng và chân trang

Hãy thử sửa đổi

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697. Những thay đổi bạn thực hiện sẽ xuất hiện trên cả hai trang. Nếu trang web có hàng tá trang, những thay đổi đối với bố cục sẽ ảnh hưởng đến mọi trang

Chèn dữ liệu vào cơ sở dữ liệu

Trong phần này, tôi sẽ trình bày cách sử dụng các công cụ theo ý của bạn để cho phép khách truy cập trang web thêm các câu chuyện cười của riêng họ vào cơ sở dữ liệu

Nếu bạn muốn cho phép khách truy cập trang web của mình nhập các câu chuyện cười mới, rõ ràng bạn sẽ cần một biểu mẫu. Đây là một mẫu cho một biểu mẫu sẽ phù hợp với hóa đơn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
01

Lưu cái này với tên

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
681 trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
874

Phần quan trọng nhất của phần tử


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
348 là thuộc tính

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
349. Thuộc tính

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
349 cho trình duyệt biết nơi gửi dữ liệu sau khi biểu mẫu được gửi. Đây có thể là tên của một tệp, chẳng hạn như

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
351

Tuy nhiên, nếu bạn để trống thuộc tính bằng cách đặt nó thành


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
352, thì dữ liệu do người dùng cung cấp sẽ được gửi trở lại trang bạn đang xem. Nếu URL của trình duyệt hiển thị trang là

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353, thì đó là dữ liệu sẽ được gửi khi người dùng nhấn nút Thêm

Hãy liên kết biểu mẫu này với ví dụ trước, hiển thị danh sách truyện cười trong cơ sở dữ liệu. Mở

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697 và thêm một URL vào liên kết “Add a new Joke” dẫn đến

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
02

Trong khi bạn mở

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
697, hãy bao gồm biểu định kiểu

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
357 từ Chương 2 như tôi có ở trên. Bây giờ, bất kỳ biểu mẫu nào được hiển thị bên trong bố cục sẽ có các kiểu chúng tôi đã sử dụng trước đây

Khi biểu mẫu này được gửi, yêu cầu sẽ bao gồm một biến —

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632 — chứa văn bản của trò đùa được nhập vào vùng văn bản. Biến này sau đó sẽ xuất hiện trong mảng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
359 được tạo bởi PHP

Hãy tạo


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353 trong thư mục
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
872. Logic cơ bản cho bộ điều khiển này là

  • Nếu không có biến
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    632 POST nào được đặt, hãy hiển thị một biểu mẫu
  • Nếu không, hãy chèn trò đùa được cung cấp vào cơ sở dữ liệu

Tạo bộ xương này


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
03

Câu lệnh mở đầu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 này kiểm tra xem mảng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
359 có chứa biến có tên là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632 không. Nếu nó được đặt, biểu mẫu đã được gửi. Mặt khác, biểu mẫu từ
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
681 được tải vào biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
827 để hiển thị trong trình duyệt

Nếu bạn mở


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353 trong trình duyệt của mình vào thời điểm này, bạn sẽ thấy biểu mẫu, nhưng nhập một trò đùa và nhấn Thêm sẽ không hoạt động, vì chúng tôi chưa làm gì với dữ liệu có trong

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
370

Để chèn câu chuyện cười đã gửi vào cơ sở dữ liệu, chúng ta phải thực hiện truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
894 sử dụng giá trị được lưu trữ trong

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
370 để điền vào cột
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632 của bảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
808. Điều này có thể khiến bạn viết một số mã như thế này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
04

Tuy nhiên, có một vấn đề nghiêm trọng với mã này. nội dung của


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
370 hoàn toàn nằm dưới sự kiểm soát của người dùng đã gửi biểu mẫu. Nếu một người dùng độc hại nhập một số mã SQL khó chịu vào biểu mẫu, thì tập lệnh này sẽ cung cấp nó cho máy chủ MySQL của bạn mà không cần thắc mắc. Kiểu tấn công này được gọi là tấn công SQL injection và trong những ngày đầu của PHP, đây là một trong những lỗ hổng bảo mật phổ biến nhất mà tin tặc tìm thấy và khai thác trong các trang web dựa trên PHP. [Trong nhiều lĩnh vực lập trình, các cuộc tấn công SQL injection vẫn hiệu quả một cách đáng ngạc nhiên, vì các nhà phát triển không mong đợi chúng. Hãy xem xét nỗ lực đáng chú ý này để khiến các camera giao thông loại bỏ cơ sở dữ liệu của chúng. “Biển số SQL injection hy vọng sẽ phá vỡ camera giao thông châu Âu”. ]

Người dùng có thể nhập nội dung này vào hộp văn bản

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
05

Truy vấn được gửi đến cơ sở dữ liệu sẽ như sau

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
06

Nhưng nếu người dùng gõ như sau

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
07

Trong trường hợp này, truy vấn được gửi đến cơ sở dữ liệu sẽ là

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
08

Bởi vì trò đùa có chứa ký tự trích dẫn, MySQL sẽ trả về lỗi, vì nó sẽ thấy phần trích dẫn trước “get” ở cuối chuỗi

Để biến đây thành một truy vấn hợp lệ, chúng ta cần thoát tất cả các trích dẫn trong văn bản để truy vấn được gửi tới cơ sở dữ liệu trở thành truy vấn này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
09

Dữ liệu không được chèn nếu nó chứa một trích dẫn là một vấn đề gây khó chịu cho người dùng. Họ sẽ mất bất cứ thứ gì họ đã nhập. Nhưng người dùng độc hại có thể lạm dụng điều này. Trong các phiên bản PHP cũ hơn, có thể chạy nhiều truy vấn từ PHP bằng cách tách chúng bằng dấu chấm phẩy [


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
376]

Hãy tưởng tượng nếu người dùng nhập cái này vào hộp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
10

Điều này sẽ gửi các truy vấn sau đến cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
11


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
377 là một nhận xét một dòng trong MySQL, vì vậy dòng cuối cùng sẽ bị bỏ qua và truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
894 sẽ chạy, tiếp theo là truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
893 mà người dùng đã nhập vào hộp. Trên thực tế, người dùng có thể nhập bất kỳ truy vấn nào họ thích vào hộp và nó sẽ được chạy trên cơ sở dữ liệu

Báo giá ma thuật

Trong những ngày đầu của PHP, các cuộc tấn công SQL injection rất đáng sợ đến nỗi nhóm đằng sau PHP đã thêm một số biện pháp bảo vệ tích hợp chống lại việc tiêm SQL vào ngôn ngữ. Thứ nhất, họ đã vô hiệu hóa khả năng gửi nhiều truy vấn cùng một lúc. Thứ hai, họ đã thêm một thứ gọi là trích dẫn ma thuật. Tính năng bảo vệ này của PHP đã tự động phân tích tất cả các giá trị do trình duyệt gửi và chèn dấu gạch chéo ngược [


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
380] trước bất kỳ ký tự “nguy hiểm” nào như dấu nháy đơn — điều này có thể gây ra sự cố nếu chúng vô tình được đưa vào truy vấn SQL

Vấn đề với tính năng trích dẫn ma thuật là nó gây ra nhiều vấn đề như nó đã ngăn chặn. Trước hết, các ký tự mà nó phát hiện và phương pháp được sử dụng để khử trùng chúng [đặt trước chúng bằng dấu gạch chéo ngược], chỉ hợp lệ trong một số trường hợp. Tùy thuộc vào mã hóa ký tự của trang web của bạn và máy chủ cơ sở dữ liệu bạn đang sử dụng, các biện pháp này có thể hoàn toàn không hiệu quả

Thứ hai, khi một giá trị đã gửi được sử dụng cho một số mục đích khác ngoài việc tạo truy vấn SQL, những dấu gạch chéo ngược đó có thể thực sự khó chịu. Tính năng trích dẫn ma thuật sẽ chèn dấu gạch chéo ngược giả vào họ của người dùng nếu nó chứa dấu nháy đơn

Nói tóm lại, tính năng trích dẫn ma thuật là một ý tưởng tồi - đến mức nó đã bị xóa khỏi PHP từ phiên bản 5. 4. Tuy nhiên, do tuổi đời của PHP và số lượng mã hiện có, bạn có thể bắt gặp một số tài liệu tham khảo về nó, vì vậy, bạn nên hiểu cơ bản về chức năng của tính năng trích dẫn ma thuật.

Khi các trích dẫn ma thuật được xác định là một ý tưởng tồi, lời khuyên từ các nhà phát triển PHP là tắt nó đi. Tuy nhiên, điều này có nghĩa là có một số máy chủ web bị tắt và những máy chủ khác được bật. Đây là một vấn đề đau đầu cho các nhà phát triển. họ hoặc phải hướng dẫn tất cả những người sẽ sử dụng mã của họ để tắt nó đi — điều này không thể thực hiện được trên một số máy chủ dùng chung — hoặc viết thêm mã để giải thích cho việc đó

Hầu hết các nhà phát triển đã chọn cái sau và bạn có thể bắt gặp một số mã như thế này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
12

Nếu bạn thấy một câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 như thế này trong mã kế thừa mà bạn được giao làm việc, thì bạn có thể xóa toàn bộ khối một cách an toàn, vì sẽ không có mã nào bên trong câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 được thực thi trên các phiên bản PHP gần đây

Nếu bạn thấy mã như thế này, điều đó có nghĩa là nhà phát triển ban đầu đã hiểu vấn đề với dấu ngoặc kép ma thuật và đang cố gắng hết sức để ngăn chặn điều đó. Kể từ PHP 5. 4 [mà bạn sẽ không bao giờ gặp phải, vì nó không còn được hỗ trợ],


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
383 sẽ luôn trả về
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
618 và mã sẽ không bao giờ được thực thi

Tất cả những gì bạn thực sự cần biết về trích dẫn ma thuật là nó là một giải pháp tồi cho vấn đề hiện tại. Tất nhiên, không có trích dẫn ma thuật, bạn cần tìm một giải pháp khác cho vấn đề. May mắn thay, lớp PDO có thể làm tất cả công việc khó khăn cho bạn, bằng cách sử dụng thứ gọi là “câu lệnh chuẩn bị sẵn”

báo cáo chuẩn bị

Một câu lệnh đã chuẩn bị là một loại truy vấn SQL đặc biệt mà bạn đã gửi trước đến máy chủ cơ sở dữ liệu của mình, giúp máy chủ có cơ hội chuẩn bị để thực thi — nhưng không thực sự thực thi nó. Hãy nghĩ về nó giống như viết một kịch bản


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
385. Mã ở đó, nhưng nó không thực sự chạy cho đến khi bạn truy cập trang trong trình duyệt web của mình. Mã SQL trong các câu lệnh đã chuẩn bị có thể chứa các trình giữ chỗ mà bạn sẽ cung cấp các giá trị cho sau này, khi truy vấn được thực thi. Khi điền vào các chỗ dành sẵn này, PDO đủ thông minh để tự động bảo vệ chống lại các ký tự “nguy hiểm”

Đây là cách chuẩn bị một truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
894 và sau đó thực hiện truy vấn đó một cách an toàn với

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
370 làm văn bản của trò đùa

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
13

Hãy phá vỡ điều này, một tuyên bố tại một thời điểm. Đầu tiên, chúng tôi viết truy vấn SQL của mình dưới dạng chuỗi PHP và lưu trữ nó trong một biến [


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
388] như bình thường. Tuy nhiên, điều bất thường về truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
894 này là không có giá trị nào được chỉ định cho cột
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632. Thay vào đó, nó chứa một trình giữ chỗ cho giá trị này [______4391]. Đừng lo lắng về trường

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
392 vừa rồi;

Tiếp theo, chúng tôi gọi phương thức chuẩn bị của đối tượng PDO [

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
818], chuyển truy vấn SQL của chúng tôi dưới dạng đối số. Điều này sẽ gửi truy vấn đến máy chủ MySQL, yêu cầu nó chuẩn bị chạy truy vấn. MySQL chưa thể chạy nó, vì không có giá trị cho cột
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632. Phương thức

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
395 trả về một đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 [vâng, cùng loại đối tượng cung cấp cho chúng tôi kết quả từ truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899], mà chúng tôi lưu trữ trong

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
398

Bây giờ MySQL đã chuẩn bị câu lệnh của chúng ta để thực thi, chúng ta có thể gửi [các] giá trị còn thiếu cho nó bằng cách gọi phương thức


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
399 của đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 [

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
398]. Chúng tôi gọi phương thức này một lần cho mỗi giá trị được cung cấp [trong trường hợp này, chúng tôi chỉ cần cung cấp một giá trị - văn bản trò đùa], chuyển dưới dạng đối số trình giữ chỗ mà chúng tôi muốn điền vào [

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
602] và giá trị chúng tôi muốn điền . Vì MySQL biết chúng tôi đang gửi cho nó một giá trị riêng biệt, thay vì mã SQL cần được phân tích cú pháp, nên không có nguy cơ các ký tự trong giá trị được hiểu là mã SQL. Khi sử dụng các câu lệnh đã chuẩn bị, các lỗ hổng SQL injection đơn giản là không thể

Cuối cùng, chúng tôi gọi phương thức


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
605 của đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 để yêu cầu MySQL thực hiện truy vấn với [các] giá trị mà chúng tôi đã cung cấp. [Có, phương thức
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 này được gọi là

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
605, không giống như phương thức tương tự của các đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804, được gọi là
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
896. PHP có nhiều điểm mạnh, nhưng tính nhất quán không phải là một trong số đó. ]

Một điều thú vị mà bạn sẽ nhận thấy về mã này là chúng tôi không bao giờ đặt dấu ngoặc kép xung quanh văn bản trò đùa.


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
391 tồn tại bên trong truy vấn mà không có bất kỳ dấu ngoặc kép nào và khi chúng tôi gọi

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
399, chúng tôi đã chuyển cho nó văn bản trò đùa đơn giản từ mảng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
359. Khi sử dụng các câu lệnh đã chuẩn bị, bạn không cần trích dẫn vì cơ sở dữ liệu [trong trường hợp của chúng tôi là MySQL] đủ thông minh để biết rằng văn bản là một chuỗi và nó sẽ được xử lý như vậy khi truy vấn được thực thi

Câu hỏi còn sót lại trong mã này là cách gán ngày hôm nay cho trường


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
392. Chúng ta có thể viết một số mã PHP ưa thích để tạo ngày hôm nay ở định dạng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
614 mà MySQL yêu cầu, nhưng hóa ra chính MySQL cũng có chức năng để làm điều này —

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
615

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
14

Hàm MySQL


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
615 được sử dụng ở đây để gán ngày hiện tại làm giá trị của cột

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
392. MySQL thực sự có hàng chục chức năng này, nhưng tôi sẽ chỉ giới thiệu chúng khi cần thiết

Bây giờ chúng tôi đã có truy vấn của mình, chúng tôi có thể hoàn thành câu lệnh

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 mà chúng tôi đã bắt đầu trước đó để xử lý việc gửi biểu mẫu “Thêm trò đùa”

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
15

Nhưng đợi đã. Tuyên bố

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 này có thêm một mánh khóe nữa. Khi chúng tôi đã thêm câu chuyện cười mới vào cơ sở dữ liệu, thay vì hiển thị mẫu PHP như trước đây, chúng tôi muốn chuyển hướng trình duyệt của người dùng trở lại danh sách các câu chuyện cười. Bằng cách đó, người dùng có thể thấy trò đùa mới được thêm vào giữa họ. Đó là tác dụng của hai dòng ở cuối câu lệnh
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
643 ở trên

Để đạt được kết quả mong muốn, bản năng đầu tiên của bạn có thể là cho phép bộ điều khiển chỉ cần tìm nạp danh sách truyện cười từ cơ sở dữ liệu sau khi thêm truyện cười mới và hiển thị danh sách bằng cách sử dụng mẫu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634 như bình thường. Vấn đề khi làm điều này là danh sách truyện cười, theo quan điểm của trình duyệt, sẽ là kết quả của việc gửi biểu mẫu “Thêm truyện cười”. Nếu sau đó người dùng làm mới trang, trình duyệt sẽ gửi lại biểu mẫu đó, khiến một bản sao khác của trò đùa mới được thêm vào cơ sở dữ liệu. Đây hiếm khi là hành vi mong muốn

Thay vào đó, chúng tôi muốn trình duyệt coi danh sách truyện cười được cập nhật như một trang web bình thường có thể tải lại mà không cần gửi lại biểu mẫu. Cách để thực hiện việc này là trả lời biểu mẫu gửi của trình duyệt bằng chuyển hướng HTTP — một phản hồi đặc biệt yêu cầu trình duyệt điều hướng đến một trang khác. [HTTP là viết tắt của HyperText Transfer Protocol, và là ngôn ngữ mô tả thông tin liên lạc yêu cầu/phản hồi được trao đổi giữa trình duyệt web của khách truy cập và máy chủ web của bạn. ]

Hàm PHP


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
622 cung cấp phương tiện gửi các phản hồi máy chủ đặc biệt như thế này, bằng cách cho phép bạn chèn các tiêu đề cụ thể vào phản hồi được gửi tới trình duyệt. Để báo hiệu chuyển hướng, bạn phải gửi tiêu đề

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
623 với URL của trang mà bạn muốn hướng trình duyệt tới

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
16

Trong trường hợp này, chúng tôi muốn gửi trình duyệt tới


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306. Đây là hai dòng chuyển hướng trình duyệt trở lại bộ điều khiển của chúng tôi sau khi thêm trò đùa mới vào cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
17

Dưới đây là mã hoàn chỉnh của bộ điều khiển


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
353

Thí dụ. MySQL-AddJoke

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
18

Khi bạn xem xét điều này để đảm bảo rằng tất cả đều hợp lý với bạn, hãy lưu ý rằng mã kết nối với cơ sở dữ liệu bằng cách tạo một đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
28 phải xuất hiện trước bất kỳ mã nào chạy truy vấn cơ sở dữ liệu. Nhưng không cần kết nối cơ sở dữ liệu để hiển thị biểu mẫu “Thêm trò đùa”. Kết nối chỉ được thực hiện khi biểu mẫu đã được gửi

Tải cái này lên và thêm một hoặc hai câu chuyện cười mới vào cơ sở dữ liệu thông qua trình duyệt của bạn

Ở đó bạn có nó. bạn có thể xem các truyện cười hiện có trong — và thêm các truyện cười mới vào — cơ sở dữ liệu MySQL của bạn

Xóa dữ liệu khỏi cơ sở dữ liệu

Trong phần này, chúng tôi sẽ thực hiện một cải tiến cuối cùng cho trang web cơ sở dữ liệu trò đùa của chúng tôi. Bên cạnh mỗi trò đùa trên trang chuyện cười [


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306], chúng tôi sẽ đặt một nút có nhãn Xóa. Khi click vào sẽ xóa truyện cười đó khỏi cơ sở dữ liệu và hiển thị danh sách truyện cười đã cập nhật

Nếu bạn thích một thử thách, bạn có thể muốn tự mình viết tính năng này trước khi đọc tiếp để xem giải pháp của tôi. Mặc dù chúng tôi đang triển khai một tính năng hoàn toàn mới, nhưng chủ yếu chúng tôi sẽ sử dụng các công cụ giống như được sử dụng trong các ví dụ trước trong chương này. Dưới đây là một vài gợi ý để bạn bắt đầu

  • Bạn sẽ cần một bộ điều khiển mới [
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    628]
  • Lệnh SQL
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    893 sẽ được yêu cầu, mà tôi đã giới thiệu trong Chương 3
  • Để xóa một trò đùa cụ thể trong bộ điều khiển của bạn, bạn sẽ cần xác định duy nhất trò đùa đó. Cột
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    630 trong bảng
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    808 được tạo ra để phục vụ mục đích này. Bạn sẽ phải chuyển ID của trò đùa để xóa với yêu cầu xóa một trò đùa. Cách dễ nhất để thực hiện việc này là sử dụng trường biểu mẫu ẩn

Ít nhất, hãy dành một chút thời gian để suy nghĩ về cách bạn tiếp cận điều này. Khi bạn đã sẵn sàng để xem giải pháp, hãy đọc tiếp

Để bắt đầu, chúng ta cần sửa đổi truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
899 lấy danh sách truyện cười từ cơ sở dữ liệu. Ngoài cột
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632, chúng tôi cũng phải tìm nạp cột

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
630 để chúng tôi có thể xác định từng trò đùa một cách độc đáo

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
19

Chúng tôi cũng phải sửa đổi vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 lưu kết quả cơ sở dữ liệu vào mảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633. Thay vì chỉ lưu trữ văn bản của mỗi trò đùa dưới dạng một mục trong mảng, chúng tôi lưu trữ cả ID và văn bản của mỗi trò đùa. Một cách để làm điều này là biến mỗi mục trong mảng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 thành một mảng theo đúng nghĩa của nó

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
60

Ghi chú. nếu bạn đã chuyển sang sử dụng vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 để xử lý các hàng kết quả trong cơ sở dữ liệu của mình, điều đó cũng sẽ hoạt động tốt

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
61

Khi vòng lặp này chạy hết, chúng ta sẽ có mảng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633, mỗi mục trong đó là một mảng kết hợp có hai mục. ID của trò đùa và văn bản của nó. Đối với mỗi trò đùa [

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
640], do đó, chúng tôi có thể truy xuất ID của nó [

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
641] và văn bản của nó [

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
642]

Bước tiếp theo của chúng tôi là cập nhật mẫu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
634 để truy xuất văn bản của mỗi câu chuyện cười từ cấu trúc mảng mới này, cũng như cung cấp nút Xóa cho mỗi câu chuyện cười

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
62

Dưới đây là những điểm nổi bật của mã cập nhật này

  • Mỗi trò đùa sẽ được hiển thị với một biểu mẫu, nếu được gửi, trò đùa đó sẽ bị xóa. Chúng tôi báo hiệu điều này cho bộ điều khiển mới,
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    628, sử dụng thuộc tính
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    349 của biểu mẫu
  • Vì mỗi trò đùa trong mảng
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    633 hiện được biểu diễn bằng một mảng hai mục thay vì một chuỗi đơn giản, chúng tôi phải cập nhật dòng này để truy xuất văn bản của trò đùa. Chúng tôi làm điều này bằng cách sử dụng
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    647 thay vì chỉ
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    648
  • Khi chúng tôi gửi biểu mẫu để xóa trò đùa này, chúng tôi sẽ gửi kèm theo ID của trò đùa sẽ bị xóa. Để làm điều này, chúng tôi cần một trường biểu mẫu chứa ID của trò đùa, nhưng chúng tôi muốn ẩn trường này khỏi người dùng; . Tên của trường này là
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    630 và giá trị của nó là ID của trò đùa sẽ bị xóa [
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    651]. Không giống như nội dung của trò đùa, ID không phải là giá trị do người dùng gửi, vì vậy không cần phải lo lắng về việc làm cho nó an toàn với HTML với
    $myObject = new SomeClass[];    // create an object
    $myObject->someProperty = 123;  // set a property's value
    echo $myObject->someProperty;   // get a property's value
    
    661. Chúng ta có thể yên tâm rằng nó sẽ là một con số, vì nó được MySQL tạo tự động cho cột
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    630 khi trò đùa được thêm vào cơ sở dữ liệu
  • Nút gửi [
    
    CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
    GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
    
    654] gửi biểu mẫu khi được nhấp. Thuộc tính giá trị của nó mang lại cho nó một nhãn Xóa
  • Cuối cùng, chúng tôi đóng biểu mẫu cho trò đùa này

Ghi chú. nếu bạn biết HTML của mình, có lẽ bạn đang nghĩ rằng các thẻ biểu mẫu và đầu vào nằm ngoài phần tử blockquote, vì chúng không phải là một phần của văn bản được trích dẫn [trò đùa]

Nói đúng ra, đó là sự thật. biểu mẫu và đầu vào của nó thực sự phải ở trước hoặc sau blockquote. Thật không may, làm cho cấu trúc thẻ đó hiển thị rõ ràng đòi hỏi một chút mã CSS [cascading style sheet] thực sự nằm ngoài phạm vi của cuốn sách này

Thay vì dạy bạn các kỹ thuật bố cục CSS trong một cuốn sách về PHP và MySQL, tôi đã quyết định sử dụng cách đánh dấu không hoàn hảo này. Nếu bạn dự định sử dụng mã này trong thế giới thực, bạn nên đầu tư một chút thời gian vào việc học CSS [hoặc ít nhất là bảo mật các dịch vụ của chuyên gia CSS]. Bằng cách đó, bạn có thể kiểm soát hoàn toàn đánh dấu HTML của mình mà không phải lo lắng về CSS cần thiết để làm cho nó trông đẹp mắt. Nếu bạn muốn tìm hiểu thêm về bố cục CSS, hãy xem CSS Master, Phiên bản thứ 3, của Tiffany Brown

Thêm CSS sau vào


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
302 để làm cho các nút xuất hiện ở bên phải của truyện cười và vẽ một đường thẳng giữa chúng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
63

Hình ảnh sau đây cho thấy danh sách trò đùa trông như thế nào khi thêm các nút Xóa

Nhưng đợi đã. Trước khi chúng ta tiếp tục làm cho nút Xóa hoạt động, hãy nhanh chóng lùi lại và xem xét cẩn thận dòng này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
64

Ở đây, chúng tôi đang lặp qua đối tượng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607, cung cấp cho chúng tôi một biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
623 chứa các khóa

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
630 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
632 cùng với các giá trị tương ứng và chúng tôi đang sử dụng điều đó để tạo một mảng khác có cùng khóa và giá trị

Bạn có thể đã nhận ra điều này cực kỳ kém hiệu quả. Chúng ta có thể đạt được điều tương tự bằng cách sử dụng mã này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
65

Nhưng như chúng ta đã biết, điều này cũng có thể đạt được với vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
66

Trong trường hợp này, chúng tôi đang sử dụng

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 để lặp lại các bản ghi từ cơ sở dữ liệu và tạo một mảng. Sau đó, chúng tôi sẽ lặp qua mảng bằng một vòng lặp
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
648 khác trong mẫu. Chúng ta chỉ có thể viết điều này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
67

Bây giờ, khi

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633 được lặp lại trong mẫu, nó không phải là một mảng mà là một đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607. Tuy nhiên, điều đó không ảnh hưởng đến đầu ra và giúp chúng tôi tiết kiệm một số mã. Trên thực tế, chúng ta có thể bỏ qua hoàn toàn biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
609 và tải trực tiếp đối tượng
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607 vào biến
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
633. Bộ điều khiển

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306 hoàn chỉnh bây giờ trông như thế này

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
68

Giờ đây, chúng tôi thậm chí không có vòng lặp

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
611 lặp qua các bản ghi trong bộ điều khiển mà chỉ lặp lại các bản ghi trực tiếp trong mẫu, tiết kiệm một số mã và làm cho trang thực thi nhanh hơn một chút, vì giờ đây nó chỉ lặp qua các bản ghi một lần

Quay lại nút Xóa mới của chúng tôi. tất cả những gì còn lại để làm cho tính năng mới này hoạt động là thêm một


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
628 có liên quan để đưa ra truy vấn
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
893 cho cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
69

Mã hoàn chỉnh cho


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
306 và

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
628 được cập nhật có sẵn dưới dạng Ví dụ. MySQL-DeleteTrò đùa

Đoạn mã này hoạt động chính xác như đoạn mã chúng tôi đã thêm vào để xử lý mã “Thêm trò đùa” trước đó trong chương. Chúng tôi bắt đầu bằng cách chuẩn bị truy vấn

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
893 với trình giữ chỗ cho ID trò đùa mà chúng tôi muốn xóa

Mẹo. bạn có thể nghĩ rằng một câu lệnh đã chuẩn bị là không cần thiết trong trường hợp này để bảo vệ cơ sở dữ liệu của chúng ta khỏi các cuộc tấn công SQL injection, vì ID trò đùa được cung cấp bởi một trường biểu mẫu ẩn mà người dùng không nhìn thấy được. Trên thực tế, tất cả các trường biểu mẫu - kể cả những trường ẩn - cuối cùng đều nằm dưới sự kiểm soát của người dùng. Chẳng hạn, có các tiện ích bổ sung cho trình duyệt được phân phối rộng rãi sẽ làm cho các trường biểu mẫu ẩn hiển thị và có sẵn để người dùng chỉnh sửa. Nhớ lại. bất kỳ giá trị nào do trình duyệt gửi cuối cùng đều bị nghi ngờ khi nói đến việc bảo vệ an ninh trang web của bạn

Sau đó, chúng tôi liên kết giá trị đã gửi của


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
675 với trình giữ chỗ đó và thực hiện truy vấn. Khi đạt được truy vấn đó, chúng tôi sử dụng chức năng PHP

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
622 để yêu cầu trình duyệt gửi yêu cầu mới để xem danh sách truyện cười được cập nhật

Ghi chú. nếu bạn tự giải quyết ví dụ này, bản năng đầu tiên của bạn có thể là cung cấp siêu liên kết Xóa cho mỗi trò đùa, thay vì gặp rắc rối khi viết toàn bộ biểu mẫu HTML có chứa nút Xóa cho mỗi trò đùa trên trang. Thật vậy, mã cho một liên kết như vậy sẽ đơn giản hơn nhiều

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
0

Nói tóm lại, không bao giờ được sử dụng các siêu liên kết để thực hiện các hành động [chẳng hạn như xóa một trò đùa]. Chúng chỉ được sử dụng để cung cấp liên kết đến một số nội dung có liên quan. Điều tương tự cũng xảy ra với các biểu mẫu có


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
677, biểu mẫu này chỉ nên được sử dụng để thực hiện các truy vấn dữ liệu hiện có. Các hành động chỉ được thực hiện khi một biểu mẫu có

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
678 được gửi

Lý do cho điều này là các biểu mẫu có


CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
678 được các trình duyệt và phần mềm liên quan xử lý khác nhau. Ví dụ: nếu bạn gửi biểu mẫu bằng

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
678 và sau đó nhấp vào nút làm mới trong trình duyệt của mình, trình duyệt sẽ hỏi bạn có chắc chắn muốn gửi lại biểu mẫu không. Các trình duyệt không có biện pháp bảo vệ tương tự đối với việc gửi lại khi nói đến các liên kết và biểu mẫu có

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
677

Các công cụ tìm kiếm và trình thu thập dữ liệu web khác cũng sẽ theo tất cả các liên kết trên trang web của bạn để tìm ra thời điểm hiển thị các trang của trang web của bạn trong kết quả tìm kiếm

Nếu trang web của bạn đã xóa một trò đùa do một siêu liên kết được theo dõi, thì bạn có thể thấy những câu chuyện cười của mình bị xóa bất cứ khi nào một công cụ tìm kiếm tìm thấy trang web của bạn

nhiệm vụ đã hoàn thành

Trong chương này, bạn đã tìm hiểu tất cả về Đối tượng dữ liệu PHP [PDO], một tập hợp các lớp PHP dựng sẵn [

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
804,
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
830 và
$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
607] cho phép bạn giao tiếp với máy chủ cơ sở dữ liệu MySQL bằng cách tạo các đối tượng và sau đó gọi các phương thức của chúng. . Trong khi học, bạn cũng đã nắm được kiến ​​thức cơ bản về lập trình hướng đối tượng [OOP] — điều này không có nghĩa là kỳ tích đối với người mới bắt đầu PHP

Sử dụng các đối tượng PDO, bạn đã xây dựng trang web dựa trên cơ sở dữ liệu đầu tiên của mình, trang này đã xuất bản cơ sở dữ liệu

$myObject = new SomeClass[];    // create an object
$myObject->someProperty = 123;  // set a property's value
echo $myObject->someProperty;   // get a property's value
4 trực tuyến và cho phép khách truy cập thêm và xóa các câu chuyện cười

Theo một cách nào đó, bạn có thể nói chương này đã đạt được sứ mệnh đã nêu của cuốn sách này. để hướng dẫn bạn cách xây dựng một trang web dựa trên cơ sở dữ liệu. Tất nhiên, ví dụ trong chương này chỉ bao gồm những điều cơ bản nhất. Trong phần còn lại của cuốn sách, tôi sẽ chỉ cho bạn cách tạo ra bộ xương mà bạn đã học cách xây dựng trong chương này

Trong Chương 5, chúng ta sẽ quay lại cửa sổ Truy vấn SQL trong MySQL Workbench. Chúng ta sẽ tìm hiểu cách sử dụng các nguyên tắc cơ sở dữ liệu quan hệ và các truy vấn SQL nâng cao để thể hiện các loại thông tin phức tạp hơn và ghi công cho khách truy cập của chúng tôi về những trò đùa mà họ thêm vào

Chúng tôi hy vọng bạn thích đoạn trích này từ PHP & MySQL. Tập làm Ninja, Phiên bản thứ 7. Cuốn sách đầy đủ có sẵn trên SitePoint Premium và từ các nhà bán lẻ sách và sách điện tử yêu thích của bạn

Chia sẻ bài viết này

tom quản gia

Tom Butler là một nhà phát triển web và giảng viên đại học. Anh ấy có bằng tiến sĩ trong lĩnh vực thực hành tốt nhất về công nghệ phần mềm và thích đánh giá các cách tiếp cận khác nhau đối với các vấn đề lập trình

Dữ liệu được lưu trữ trong MySQL bằng HTML như thế nào?

Đối với điều này, bạn cần làm theo các bước sau. .
Bước 1. Lọc các yêu cầu về biểu mẫu HTML của bạn cho trang web liên hệ với chúng tôi. .
Bước 2. Tạo cơ sở dữ liệu và bảng trong MySQL. .
Bước 3. Tạo biểu mẫu HTML để kết nối với cơ sở dữ liệu. .
Bước 4. Tạo một trang PHP để lưu dữ liệu từ dạng HTML vào cơ sở dữ liệu MySQL của bạn. .
Bước 5. Tất cả đã được làm xong

Dữ liệu được lưu trữ trong cơ sở dữ liệu SQL như thế nào?

Cơ sở dữ liệu SQL Server được lưu trữ trong hệ thống tệp trong các tệp . Các tệp có thể được nhóm thành các nhóm tệp. Để biết thêm thông tin về tệp và nhóm tệp, hãy xem Tệp Cơ sở dữ liệu và Nhóm tệp. Khi mọi người có quyền truy cập vào một phiên bản của SQL Server, họ được xác định là thông tin đăng nhập.

Làm cách nào để lưu trữ dữ liệu ở dạng HTML?

Lưu trữ web HTML cung cấp hai đối tượng để lưu trữ dữ liệu trên máy khách. .
cửa sổ. localStorage - lưu trữ dữ liệu không có ngày hết hạn
cửa sổ. sessionStorage - lưu trữ dữ liệu cho một phiên [dữ liệu bị mất khi đóng tab trình duyệt]

HTML có thể được sử dụng với SQL không?

Bạn có thể tạo HTML từ SQL vì SQL Server có hỗ trợ tích hợp sẵn để xuất XML và HTML được hiểu đúng nhất là một phương ngữ hơi kỳ lạ của XML truyền đạt ý nghĩa cho các thẻ được xác định trước. Có rất nhiều trường hợp cạnh trong đó cấu trúc HTML là cách rõ ràng nhất để giao tiếp các bảng, danh sách và thư mục.

Chủ Đề