Nhiều lập trình viên PHP đã học cách truy cập cơ sở dữ liệu bằng cách sử dụng phần mở rộng MySQL hoặc MySQLi. Đối với PHP 5.1, có một cách tốt hơn. Đối tượng dữ liệu PHP (PDO) cung cấp các phương thức cho các câu lệnh đã chuẩn bị và làm việc với các đối tượng sẽ giúp bạn làm việc hiệu quả hơn nhiều!
Máy tạo và khung CRUD
Mã cơ sở dữ liệu là lặp đi lặp lại, nhưng rất quan trọng để làm đúng. Đó là nơi các trình tạo và khuôn khổ PHP CRUD xuất hiện — chúng giúp bạn tiết kiệm thời gian bằng cách tự động tạo tất cả mã lặp lại này để bạn có thể tập trung vào các phần khác của ứng dụng.
Trên CodeCanyon, bạn sẽ tìm thấy các bộ tạo và khuôn khổ CRUD sẽ giúp bạn cung cấp các sản phẩm chất lượng vượt trội đúng thời hạn. (CRUD là từ viết tắt của tạo, đọc, cập nhật và xóa — các thao tác cơ bản đối với cơ sở dữ liệu.)
- PHP9 Trình tạo và khung PHP CRUD hữu ích có sẵn trên CodeCanyonFranc Lucas
- PHP Nhanh chóng tạo giao diện CRUD PHP với Công cụ tạo CRUD nâng cao PDOSajal Soni
Giới thiệu về PDO
PDO — Đối tượng dữ liệu PHP — là một lớp truy cập cơ sở dữ liệu cung cấp một phương thức truy cập thống nhất vào nhiều cơ sở dữ liệu.
Nó không tính đến cú pháp dành riêng cho cơ sở dữ liệu, nhưng có thể cho phép quá trình chuyển đổi cơ sở dữ liệu và nền tảng khá dễ dàng, chỉ đơn giản bằng cách chuyển đổi chuỗi kết nối trong nhiều trường hợp.
Hướng dẫn này không phải là hướng dẫn hoàn chỉnh về SQL. Nó được viết chủ yếu cho những người hiện đang sử dụng mysql
hoặc mysqli
để giúp họ chuyển sang PDO di động và mạnh mẽ hơn.
Khi nói đến các hoạt động cơ sở dữ liệu trong PHP, PDO cung cấp rất nhiều lợi thế so với cú pháp thô. Hãy nhanh chóng liệt kê một vài:
- lớp trừu tượng
- cú pháp hướng đối tượng
- hỗ trợ cho các tuyên bố đã chuẩn bị trước
- xử lý ngoại lệ tốt hơn
- API an toàn và có thể sử dụng lại
- hỗ trợ cho tất cả các cơ sở dữ liệu phổ biến
Hỗ trợ cơ sở dữ liệu
Phần mở rộng có thể hỗ trợ bất kỳ cơ sở dữ liệu nào mà trình điều khiển PDO đã được viết cho. Tại thời điểm viết bài này, có sẵn các trình điều khiển cơ sở dữ liệu sau:
-
PDO_DBLIB
(FreeTDS / Microsoft SQL Server / Sybase) -
PDO_FIREBIRD
(Firebird / Interbase 6) -
PDO_IBM
(IBM DB2) -
PDO_INFORMIX
(Máy chủ động IBM Informix) -
PDO_MYSQL
(MySQL 3.x / 4.x / 5.x) -
PDO_OCI
(Giao diện cuộc gọi Oracle) -
PDO_ODBC
(ODBC v3 (IBM DB2, unixODBC và win32 ODBC)) -
PDO_PGSQL
(PostgreSQL) -
PDO_SQLITE
(SQLite 3 và SQLite 2) -
PDO_4D
(D)
Tất cả các trình điều khiển này không nhất thiết phải có sẵn trên hệ thống của bạn; đây là một cách nhanh chóng để biết bạn có trình điều khiển nào:
print_r (PDO ::getAvailableDrivers ());
Đang kết nối
Các cơ sở dữ liệu khác nhau có thể có các phương thức kết nối hơi khác nhau. Dưới đây, bạn có thể thấy phương pháp kết nối với một số cơ sở dữ liệu phổ biến nhất. Bạn sẽ nhận thấy rằng ba cái đầu tiên giống hệt nhau, khác với kiểu cơ sở dữ liệu — và sau đó SQLite có cú pháp riêng.
thử {# MS SQL Server và Sybase với PDO_DBLIB $ DBH =new PDO ("mssql:host =$ host; dbname =$ dbname ", $ người dùng, $ pass); $ DBH =new PDO ("sybase:host =$ host; dbname =$ dbname", $ user, $ pass); # MySQL với PDO_MYSQL $ DBH =new PDO ("mysql:host =$ host; dbname =$ dbname", $ user, $ pass); # Cơ sở dữ liệu SQLite $ DBH =new PDO ("sqlite:my / database / path / database.db");} catch (PDOException $ e) {echo $ e-> getMessage ();}
Hãy lưu ý về khối thử / bắt. Bạn nên luôn kết thúc các hoạt động PDO của mình trong một thử / bắt và sử dụng cơ chế ngoại lệ — thêm thông tin về điều này ngay sau đây. Thông thường, bạn sẽ chỉ tạo một kết nối duy nhất — có một số được liệt kê để hiển thị cho bạn cú pháp. $DBH
là viết tắt của 'database handle' và sẽ được sử dụng trong suốt hướng dẫn này.
Bạn có thể đóng bất kỳ kết nối nào bằng cách đặt chốt điều khiển thành null.
# đóng kết nối $ DBH =null;
Bạn có thể lấy thêm thông tin về các tùy chọn dành riêng cho cơ sở dữ liệu và / hoặc chuỗi kết nối cho các cơ sở dữ liệu khác từ PHP.net.
Ngoại lệ và PDO
PDO có thể sử dụng các ngoại lệ để xử lý lỗi, có nghĩa là bất cứ điều gì bạn làm với PDO đều phải được gói gọn trong một khối try / catch. Bạn có thể buộc PDO vào một trong ba chế độ lỗi bằng cách đặt thuộc tính chế độ lỗi trên tay cầm cơ sở dữ liệu mới tạo của bạn. Đây là cú pháp:
$ DBH-> setAttribute (PDO ::ATTR_ERRMODE, PDO ::ERRMODE_SILENT); $ DBH-> setAttribute (PDO ::ATTR_ERRMODE, PDO ::ERRMODE_WARNING); $ DBH-> setAttribute (PDO ::ATTR :ERRMODE_EXCEPTION);
Bất kể bạn đặt chế độ lỗi nào, lỗi kết nối sẽ luôn tạo ra một ngoại lệ và việc tạo kết nối phải luôn nằm trong một khối try / catch.
PDO::ERRMODE_SILENT
Đây là chế độ lỗi mặc định. Nếu bạn để nó ở chế độ này, bạn sẽ phải kiểm tra lỗi theo cách mà bạn có thể đã quen nếu bạn đã sử dụng mysql
hoặc mysqli
các phần mở rộng. Hai phương pháp còn lại phù hợp hơn cho lập trình DRY.
PDO::ERRMODE_WARNING
Chế độ này sẽ đưa ra cảnh báo PHP tiêu chuẩn và cho phép chương trình tiếp tục thực thi. Nó hữu ích để gỡ lỗi.
PDO::ERRMODE_EXCEPTION
Đây là chế độ bạn muốn trong hầu hết các tình huống. Nó kích hoạt một ngoại lệ, cho phép bạn xử lý lỗi một cách duyên dáng và ẩn dữ liệu có thể giúp ai đó khai thác hệ thống của bạn. Dưới đây là một ví dụ về việc tận dụng các ngoại lệ:
# kết nối với tập dữ liệu {$ DBH =new PDO ("mysql:host =$ host; dbname =$ dbname", $ user, $ pass); $ DBH-> setAttribute (PDO ::ATTR_ERRMODE, PDO ::ERRMODE_EXCEPTION); # UH-OH! Đã nhập DELECT thay vì CHỌN! Đô la file_put_contents ('PDOErrors.txt', $ e-> getMessage (), FILE_APPEND);}
Có một lỗi cố ý trong câu lệnh select; điều này sẽ gây ra một ngoại lệ. Ngoại lệ gửi thông tin chi tiết về lỗi tới tệp nhật ký và hiển thị thông báo thân thiện (hoặc không thân thiện) cho người dùng.
Chèn và Cập nhật
Chèn dữ liệu mới (hoặc cập nhật dữ liệu hiện có) là một trong những thao tác cơ sở dữ liệu phổ biến hơn. Sử dụng PHP PDO, đây thường là một quá trình gồm hai bước. Mọi thứ được đề cập trong phần này đều áp dụng như nhau cho cả UPDATE
và INSERT
hoạt động.
Dưới đây là ví dụ về loại chèn cơ bản nhất:
# STH có nghĩa là "Xử lý câu lệnh" $ STH =$ DBH-> chuẩn bị ("CHÈN VÀO giá trị của folks (first_name) ('Cathy')"); $ STH-> thi hành ();
Bạn cũng có thể thực hiện thao tác tương tự bằng cách sử dụng exec()
phương thức, với một lệnh gọi ít hơn. Trong hầu hết các tình huống, bạn sẽ sử dụng phương pháp dài hơn để có thể tận dụng lợi thế của các câu đã chuẩn bị. Ngay cả khi bạn chỉ sử dụng nó một lần, việc sử dụng các câu lệnh đã chuẩn bị sẵn sẽ giúp bảo vệ bạn khỏi các cuộc tấn công SQL injection.
Tuyên bố chuẩn bị
Sử dụng các câu lệnh chuẩn bị sẵn sẽ giúp bảo vệ bạn khỏi bị chèn SQL.
Câu lệnh chuẩn bị sẵn là câu lệnh SQL được biên dịch trước có thể được thực thi nhiều lần bằng cách chỉ gửi dữ liệu đến máy chủ. Nó có thêm lợi thế là tự động làm cho dữ liệu được sử dụng trong trình giữ chỗ an toàn khỏi các cuộc tấn công chèn SQL.
Bạn sử dụng một câu lệnh đã chuẩn bị sẵn bằng cách bao gồm các trình giữ chỗ trong SQL của bạn. Dưới đây là ba ví dụ:một không có trình giữ chỗ, một có trình giữ chỗ không tên và một có trình giữ chỗ được đặt tên.
# không có trình giữ chỗ - đã chín muồi cho SQL Injection! $ STH =$ DBH-> standard ("CHÈN VÀO các giá trị của folks (name, addr, city) ($ name, $ addr, $ city)"); # trình giữ chỗ chưa được đặt tên $ STH =$ DBH-> standard ("CHÈN VÀO các giá trị của folks (name, addr, city) (?,?,?)"); # trình giữ chỗ được đặt tên $ STH =$ DBH-> chuẩn bị ("CHÈN VÀO người (tên, addr, thành phố) giá trị (:name,:addr,:city)");
Bạn muốn tránh phương pháp đầu tiên; nó ở đây để so sánh. Việc lựa chọn sử dụng trình giữ chỗ có tên hoặc không tên sẽ ảnh hưởng đến cách bạn đặt dữ liệu cho các câu lệnh đó.
Phần giữ chỗ không có tên
# gán các biến cho từng người giữ chỗ, được lập chỉ mục 1-3 $ STH-> bindParam (1, $ name); $ STH-> bindParam (2, $ addr); $ STH-> bindParam (3, $ city); # chèn một hàng $ name ="Daniel" $ addr ="1 Wicked Way"; $ city ="Arlington Heights"; $ STH-> execute (); # chèn một hàng khác với các giá trị khác $ name ="Steve" $ addr ="5 Circle Drive"; $ city ="Schaumburg"; $ STH-> execute ();
Có hai bước ở đây. Đầu tiên, chúng tôi gán các biến cho các trình giữ chỗ khác nhau (dòng 2–4). Sau đó, chúng tôi gán giá trị cho các trình giữ chỗ đó và thực thi câu lệnh. Để gửi một tập hợp dữ liệu khác, chỉ cần thay đổi giá trị của các biến đó và thực hiện lại câu lệnh.
Điều này có vẻ hơi khó sử dụng đối với các câu lệnh có nhiều tham số? Nó là. Tuy nhiên, nếu dữ liệu của bạn được lưu trữ trong một mảng, có một phím tắt dễ dàng:
# dữ liệu chúng ta muốn chèn $ data =array ('Cathy', '9 Dark and Twisty Road', 'Cardiff'); $ STH =$ DBH-> chuẩn bị ("CHÈN VÀO người (tên, người thêm, thành phố) giá trị (?,?,?)"); $ STH-> thực thi ($ data);
Thật dễ dàng!
Dữ liệu trong mảng áp dụng cho các trình giữ chỗ theo thứ tự. $data[0]
đi vào trình giữ chỗ đầu tiên, $data[1]
thứ hai, v.v. Tuy nhiên, nếu các chỉ mục mảng của bạn không theo thứ tự, điều này sẽ không hoạt động bình thường và bạn sẽ cần phải lập chỉ mục lại mảng.
Phần giữ chỗ được Đặt tên
Bạn có thể đoán được cú pháp, nhưng đây là một ví dụ:
# đối số đầu tiên là tên trình giữ chỗ được đặt tên - thông báo có tên # trình giữ chỗ luôn bắt đầu bằng dấu hai chấm. $ STH-> bindParam (':name', $ name);
Bạn cũng có thể sử dụng một phím tắt ở đây, nhưng nó hoạt động với các mảng liên kết. Đây là một ví dụ:
# dữ liệu chúng ta muốn chèn $ data =array ('name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff'); # the shortcut! $ STH =$ DBH-> standard ("CHÈN VÀO folks (name, addr, city) value (:name,:addr,:city)"); $ STH-> thi hành ($ data);Các khóa của mảng của bạn không cần bắt đầu bằng dấu hai chấm, nhưng nếu không thì cần phải khớp với các phần giữ chỗ đã đặt tên. Nếu bạn có một mảng các mảng, bạn có thể lặp lại chúng và chỉ cần gọi
execute
với mỗi mảng dữ liệu.Một tính năng thú vị khác của trình giữ chỗ được đặt tên là khả năng chèn các đối tượng trực tiếp vào cơ sở dữ liệu của bạn, giả sử các thuộc tính khớp với các trường được đặt tên. Đây là một đối tượng ví dụ và cách bạn thực hiện việc chèn của mình:
# a simple objectclass person {public $ name; public $ addr; thành phố công cộng; function __construct ($ n, $ a, $ c) {$ this-> name =$ n; $ this-> addr =$ a; $ this-> city =$ c; } # etc ...} $ cathy =new person ('Cathy', '9 Dark and Twisty', 'Cardiff'); # đây là phần thú vị:$ STH =$ DBH-> chuẩn bị ("CHÈN VÀO folks (name, addr, city) value (:name,:addr,:city)"); $ STH-> thi hành ((mảng) $ cathy);Truyền đối tượng đến một mảng trong
execute
có nghĩa là các thuộc tính được coi là khóa mảng.Chọn dữ liệu
Dữ liệu được lấy qua
->fetch()
, một phương thức xử lý câu lệnh của bạn. Trước khi gọi tìm nạp, tốt nhất hãy cho PDO biết bạn muốn dữ liệu được tìm nạp như thế nào. Bạn có các tùy chọn sau:
-
PDO::FETCH_ASSOC
: trả về một mảng được lập chỉ mục theo tên cột. -
PDO::FETCH_BOTH
(mặc định):trả về một mảng được lập chỉ mục bởi cả tên và số cột. -
PDO::FETCH_BOUND
: gán giá trị của các cột của bạn cho các biến được đặt bằng->bindColumn()
phương pháp. -
PDO::FETCH_CLASS
: gán giá trị của các cột của bạn cho các thuộc tính của lớp được đặt tên. Nó sẽ tạo ra các thuộc tính nếu các thuộc tính phù hợp không tồn tại. -
PDO::FETCH_INTO
: cập nhật phiên bản hiện có của lớp được đặt tên. -
PDO::FETCH_LAZY
:kết hợpPDO::FETCH_BOTH
/PDO::FETCH_OBJ
, tạo tên biến đối tượng khi chúng được sử dụng. -
PDO::FETCH_NUM
: trả về một mảng được lập chỉ mục theo số cột. -
PDO::FETCH_OBJ
: trả về một đối tượng ẩn danh có tên thuộc tính tương ứng với tên cột.
Trong thực tế, có ba trường hợp sẽ bao gồm hầu hết các tình huống:FETCH_ASSOC
, FETCH_CLASS
và FETCH_OBJ
. Để đặt phương thức tìm nạp, cú pháp sau được sử dụng:
$ STH-> setFetchMode (PDO ::FETCH_ASSOC);
Bạn cũng có thể đặt loại tìm nạp trực tiếp trong ->fetch()
cuộc gọi phương thức.
FETCH_ASSOC
Kiểu tìm nạp này tạo ra một mảng kết hợp, được lập chỉ mục theo tên cột. Điều này sẽ khá quen thuộc với bất kỳ ai đã sử dụng phần mở rộng mysql / mysqli. Dưới đây là một ví dụ về việc chọn dữ liệu bằng phương pháp này:
# sử dụng phương thức shortcut -> query () ở đây vì không có biến # giá trị nào trong câu lệnh select. $ STH =$ DBH-> query ('SELECT name, addr, city from folks'); # thiết lập chế độ tìm nạp $ STH-> setFetchMode (PDO ::FETCH_ASSOC); while ($ row =$ STH-> fetch ()) {echo $ row ['name']. "\N"; echo $ row ['addr']. "\N"; echo $ row ['city']. "\ n";}
Vòng lặp while sẽ tiếp tục đi qua tập kết quả từng hàng một cho đến khi hoàn tất.
FETCH_OBJ
Kiểu tìm nạp này tạo một đối tượng của lớp std cho mỗi hàng dữ liệu được tìm nạp. Đây là một ví dụ:
# tạo câu lệnh $ STH =$ DBH-> query ('SELECT name, addr, city from folks'); # thiết lập chế độ tìm nạp $ STH-> setFetchMode (PDO ::FETCH_OBJ); # hiển thị kết quả trong khi ($ row =$ STH-> fetch ()) {echo $ row-> name. "\N"; echo $ row-> addr. "\N"; echo $ row-> thành phố. "\ n";}
FETCH_CLASS
Các thuộc tính của đối tượng của bạn được thiết lập TRƯỚC KHI hàm tạo được gọi. Đây là điều quan trọng.
Phương thức tìm nạp này cho phép bạn tìm nạp dữ liệu trực tiếp vào một lớp bạn chọn. Khi bạn sử dụng FETCH_CLASS
, các thuộc tính của đối tượng của bạn được đặt BEFORE
hàm tạo được gọi. Đọc lại lần nữa — điều quan trọng. Nếu các thuộc tính khớp với tên cột không tồn tại, các thuộc tính đó sẽ được tạo (ở dạng công khai) cho bạn.
Điều này có nghĩa là nếu dữ liệu của bạn cần bất kỳ chuyển đổi nào sau khi nó ra khỏi cơ sở dữ liệu, nó có thể được thực hiện tự động bởi đối tượng của bạn khi mỗi đối tượng được tạo.
Ví dụ, hãy tưởng tượng một tình huống mà địa chỉ cần được che khuất một phần cho mỗi bản ghi. Chúng ta có thể làm điều này bằng cách thao tác trên thuộc tính đó trong hàm tạo. Đây là một ví dụ:
bí mật của lớp {public $ name; public $ addr; thành phố công cộng; public $ other_data; function __construct ($ other ='') {$ this-> address =preg_replace ('/ [a-z] /', 'x', $ this-> address); $ this-> other_data =$ other; }}
Khi dữ liệu được tìm nạp vào lớp này, địa chỉ có tất cả chữ thường a-z các chữ cái được thay thế bằng chữ cái x . Bây giờ, việc sử dụng lớp và việc chuyển đổi dữ liệu đó diễn ra hoàn toàn minh bạch:
$ STH =$ DBH-> query ('SELECT name, addr, city from folks'); $ STH-> setFetchMode (PDO ::FETCH_CLASS, 'secret_ person'); while ($ obj =$ STH-> fetch ()) {echo $ obj-> addr;}
Nếu địa chỉ là '5 Rosebud', bạn sẽ thấy '5 Rxxxxxx' là đầu ra của mình. Tất nhiên, có thể có những tình huống mà bạn muốn hàm tạo được gọi trước khi dữ liệu được gán. PDO cũng có bạn bảo hiểm cho việc này.
$ STH-> setFetchMode (PDO ::FETCH_CLASS | PDO ::FETCH_PROPS_LATE, 'secret_woman');
Bây giờ, khi bạn lặp lại ví dụ trước với chế độ tìm nạp này (PDO::FETCH_PROPS_LATE
), địa chỉ sẽ không bị che khuất, vì hàm tạo đã được gọi và các thuộc tính đã được gán.
Cuối cùng, nếu bạn thực sự cần, bạn có thể truyền các đối số cho hàm tạo khi tìm nạp dữ liệu vào các đối tượng bằng PDO:
$ STH-> setFetchMode (PDO ::FETCH_CLASS, 'secret_woman', array ('things'));
Nếu bạn cần truyền dữ liệu khác nhau cho hàm tạo cho từng đối tượng, bạn có thể đặt chế độ tìm nạp bên trong fetch
phương pháp:
$ i =0; while ($ rowObj =$ STH-> tìm nạp (PDO ::FETCH_CLASS, 'secret_woman', array ($ i))) {// thực hiện công việc $ i ++}
Một số phương pháp hữu ích khác
Mặc dù điều này không có nghĩa là bao gồm tất cả mọi thứ trong PDO (đó là một phần mở rộng rất lớn!), Nhưng bạn sẽ muốn biết thêm một số phương pháp để thực hiện những điều cơ bản với PDO.
$ DBH-> lastInsertId ();
->lastInsertId()
phương thức luôn được gọi trên xử lý cơ sở dữ liệu, không phải xử lý câu lệnh và sẽ trả về id tự động tăng dần của hàng được chèn cuối cùng bằng kết nối đó.
$ DBH-> execute ('XÓA khỏi mọi người WHERE 1'); $ DBH-> thực thi ("SET time_zone ='-8:00'");
->exec()
được sử dụng cho các hoạt động không thể trả về dữ liệu khác với các hàng bị ảnh hưởng. Trên đây là hai ví dụ về việc sử dụng phương thức thực thi.
$ safe =$ DBH-> trích dẫn ($ không an toàn);
->quote()
phương thức trích dẫn các chuỗi để chúng an toàn khi sử dụng trong các truy vấn. Đây là dự phòng của bạn nếu bạn không sử dụng các báo cáo đã chuẩn bị.
$ row_affected =$ STH-> rowCount ();
->rowCount()
phương thức trả về một số nguyên cho biết số hàng bị ảnh hưởng bởi một hoạt động. Trong ít nhất một phiên bản PDO đã biết, phương pháp này không hoạt động với các câu lệnh chọn. Tuy nhiên, nó hoạt động bình thường trong phiên bản PHP 5.1.6 trở lên.
Nếu bạn đang gặp sự cố này và không thể nâng cấp PHP, bạn có thể nhận được số hàng như sau:
$ sql ="SELECT COUNT (*) FROM folks"; if ($ STH =$ DBH-> query ($ sql)) {# kiểm tra số hàng nếu ($ STH-> fetchColumn ()> 0) { # đưa ra một lựa chọn thực sự ở đây, vì có dữ liệu! } else {echo "Không có hàng nào phù hợp với truy vấn."; }}
Trình tạo CRUD PHP từ CodeCanyon
Bạn có thể tiết kiệm thời gian cho mình bằng cách tìm trình tạo PHP CRUD từ CodeCanyon và sử dụng nó trong các dự án của bạn. Dưới đây là năm trong số các bản tải xuống phổ biến nhất mà bạn có thể bắt đầu sử dụng ngay bây giờ.
1. Ứng dụng đa mục đích của Laravel:Sximo 6
Trình tạo Sximo 6 dựa trên các khuôn khổ phổ biến nhất xung quanh. Nó cũng đã nhận được một bản cập nhật mới cho năm 2021, giúp nó dễ sử dụng và giàu tính năng nhất có thể. Một số tính năng đó bao gồm:
- quản lý bảng cơ sở dữ liệu
- mẫu front-end và back-end
- trình soạn thảo MySQL của mô-đun
- nhiều hình ảnh và hỗ trợ tải lên tệp
Hãy thử nếu bạn muốn tiết kiệm thời gian với mẫu CRUD PHP.
2. PDO Crud:Trình tạo biểu mẫu &Quản lý cơ sở dữ liệu
Đây là một trình tạo PHP CRUD mạnh mẽ khác. Mẫu mã PHP PDO này quản lý tốt cơ sở dữ liệu. Nhưng đó không phải là tất cả những gì nó làm. Bạn cũng có thể sử dụng PDO CRUD để tạo các biểu mẫu hữu ích trực tiếp từ các bảng cơ sở dữ liệu của mình. Đó là một tính năng hữu ích mà không nhiều tùy chọn khác có.
3. Cicool:Trang, Biểu mẫu, API Rest và Trình tạo CRUD
Cicool là một trình xây dựng đa năng khác đáng xem xét. Nó không chỉ cung cấp trình tạo CRUD mà còn có:
- trình tạo trang
- trình tạo biểu mẫu
- trình tạo API còn lại
Ngoài các tính năng này, bạn cũng có thể thêm các tiện ích mở rộng vào Cicool và dễ dàng tùy chỉnh chủ đề của nó.
4. Trình tạo CRUD PHP
Trình tạo bảng quản trị dễ dàng? Kiểm tra. Giao diện dễ điều hướng? Kiểm tra. Phân tích chuyên sâu cơ sở dữ liệu? Một séc khác. Trình tạo PHP CRUD này có mọi thứ bạn cần để xây dựng các trang tổng quan tuyệt vời và lưu trữ dữ liệu của bạn. Với các tính năng quản lý quyền và xác thực người dùng khác nhau, mẫu PDO PHP này rất đáng để thử.