Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Mengapa Anda Harus Menggunakan PHPs PDO untuk Akses Database

Banyak programmer PHP belajar bagaimana mengakses database dengan menggunakan ekstensi MySQL atau MySQLi. Pada PHP 5.1, ada cara yang lebih baik. Objek Data PHP (PDO) menyediakan metode untuk pernyataan yang disiapkan dan bekerja dengan objek yang akan membuat Anda jauh lebih produktif!

Generator dan Kerangka Kerja CRUD

Kode basis data berulang, tetapi sangat penting untuk diperbaiki. Di situlah generator dan kerangka kerja PHP CRUD berperan—mereka menghemat waktu Anda dengan membuat semua kode berulang ini secara otomatis sehingga Anda dapat fokus pada bagian lain dari aplikasi.

Di CodeCanyon, Anda akan menemukan generator dan kerangka kerja CRUD yang akan membantu Anda mengirimkan produk berkualitas luar biasa tepat waktu. (CRUD adalah singkatan dari create, read, update, dan delete—manipulasi dasar untuk database.)

  • PHP9 Generator dan Kerangka PHP CRUD yang Berguna Tersedia di CodeCanyonFranc Lucas
  • PHPCepat Bangun Antarmuka PHP CRUD Dengan Alat Generator CRUD Lanjutan PDOSajal Soni

Pengantar PDO

PDO—Objek Data PHP—adalah lapisan akses database yang menyediakan metode akses yang seragam ke beberapa database.

Ini tidak memperhitungkan sintaks khusus basis data, tetapi dapat memungkinkan proses peralihan basis data dan platform menjadi cukup mudah, cukup dengan mengganti string koneksi dalam banyak kasus.

Tutorial ini tidak dimaksudkan sebagai panduan lengkap tentang SQL. Ini ditulis terutama untuk orang yang saat ini menggunakan mysql atau mysqli ekstensi untuk membantu mereka beralih ke PDO yang lebih portabel dan kuat.

Ketika datang ke operasi database di PHP, PDO memberikan banyak keuntungan dibandingkan sintaks mentah. Mari kita cepat daftar beberapa:

  • lapisan abstraksi
  • sintaks berorientasi objek
  • dukungan untuk pernyataan yang disiapkan
  • penanganan pengecualian yang lebih baik
  • API yang aman dan dapat digunakan kembali
  • dukungan untuk semua database populer

Dukungan Basis Data

Ekstensi dapat mendukung basis data apa pun yang telah ditulis untuk driver PDO. Pada saat penulisan ini, driver database berikut tersedia:

  • PDO_DBLIB (FreeTDS/Microsoft SQL Server/Sybase)
  • PDO_FIREBIRD (Firebird/Interbase 6)
  • PDO_IBM (IBM DB2)
  • PDO_INFORMIX (Server Dinamis IBM Informix)
  • PDO_MYSQL (MySQL 3.x/4.x/5.x)
  • PDO_OCI (Antarmuka Panggilan Oracle)
  • PDO_ODBC (ODBC v3 (IBM DB2, unixODBC, dan win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 dan SQLite 2)
  • PDO_4D (D)

Semua driver ini belum tentu tersedia di sistem Anda; inilah cara cepat untuk mengetahui driver mana yang Anda miliki:

print_r(PDO::getAvailableDrivers());

Menghubungkan

Basis data yang berbeda mungkin memiliki metode koneksi yang sedikit berbeda. Di bawah ini, Anda dapat melihat metode untuk terhubung ke beberapa database paling populer. Anda akan melihat bahwa tiga yang pertama identik, selain tipe database—dan kemudian SQLite memiliki sintaksnya sendiri.

coba { # MS SQL Server dan Sybase dengan PDO_DBLIB $DBH =new PDO("mssql:host =$host;dbname=$dbname", $user, $pass); $DBH =new PDO("sybase:host=$host;dbname=$dbname", $user, $pass); # MySQL dengan PDO_MYSQL $DBH =new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # Database SQLite $DBH =new PDO("sqlite:my/database/path/database.db");}catch(PDOException $e) { echo $e->getMessage();}

Harap perhatikan blok coba/tangkap. Anda harus selalu membungkus operasi PDO Anda dalam try/catch dan menggunakan mekanisme pengecualian—lebih lanjut tentang ini segera. Biasanya, Anda hanya akan membuat satu koneksi—ada beberapa yang terdaftar untuk menunjukkan kepada Anda sintaksnya. $DBH singkatan dari 'database handle' dan akan digunakan sepanjang tutorial ini.

Anda dapat menutup koneksi apa pun dengan menyetel tuas ke nol.

# tutup koneksi$DBH =null;

Anda bisa mendapatkan informasi selengkapnya tentang opsi khusus database dan/atau string koneksi untuk database lain dari PHP.net.

Pengecualian dan PDO

PDO dapat menggunakan pengecualian untuk menangani kesalahan, yang berarti apa pun yang Anda lakukan dengan PDO harus dibungkus dengan blok coba/tangkap. Anda dapat memaksa PDO menjadi salah satu dari tiga mode kesalahan dengan mengatur atribut mode kesalahan pada pegangan database yang baru Anda buat. Berikut sintaksnya:

$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

Apa pun mode kesalahan yang Anda atur, kesalahan saat menghubungkan akan selalu menghasilkan pengecualian, dan membuat koneksi harus selalu ada dalam blok coba/tangkap.

PDO::ERRMODE_SILENT

Ini adalah mode kesalahan default. Jika Anda membiarkannya dalam mode ini, Anda harus memeriksa kesalahan dengan cara yang mungkin biasa Anda lakukan jika Anda menggunakan mysql atau mysqli ekstensi. Dua metode lainnya lebih cocok untuk pemrograman KERING.

PDO::ERRMODE_WARNING

Mode ini akan mengeluarkan peringatan PHP standar dan memungkinkan program untuk melanjutkan eksekusi. Ini berguna untuk debugging.

PDO::ERRMODE_EXCEPTION

Ini adalah mode yang Anda inginkan di sebagian besar situasi. Ini mengeluarkan pengecualian, memungkinkan Anda untuk menangani kesalahan dengan anggun dan menyembunyikan data yang mungkin membantu seseorang mengeksploitasi sistem Anda. Berikut ini contoh memanfaatkan pengecualian:

# terhubung ke databasetry { $DBH =new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); # UH OH! Ketik DELECT alih-alih SELECT! $DBH->prepare('HAPUS nama DARI orang');}catch(PDOException $e) { echo "Maaf, Dave. Saya khawatir saya tidak bisa melakukannya."; file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);}

Ada kesalahan yang disengaja dalam pernyataan pilih; ini akan menyebabkan pengecualian. Pengecualian mengirimkan detail kesalahan ke file log dan menampilkan pesan ramah (atau tidak ramah) kepada pengguna.

Sisipkan dan Perbarui

Memasukkan data baru (atau memperbarui data yang sudah ada) adalah salah satu operasi database yang lebih umum. Menggunakan PHP PDO, ini biasanya merupakan proses dua langkah. Semua yang tercakup dalam bagian ini berlaku sama untuk UPDATE dan INSERT operasi.

Berikut ini contoh jenis penyisipan paling dasar:

# STH berarti "Statement Handle"$STH =$DBH->prepare("INSERT INTO people ( first_name ) nilai ( 'Cathy' )");$STH->execute();

Anda juga dapat melakukan operasi yang sama dengan menggunakan exec() metode, dengan satu panggilan lebih sedikit. Dalam kebanyakan situasi, Anda akan menggunakan metode yang lebih panjang sehingga Anda dapat memanfaatkan pernyataan yang telah disiapkan. Meskipun Anda hanya akan menggunakannya sekali, menggunakan pernyataan yang telah disiapkan akan membantu melindungi Anda dari serangan injeksi SQL.

Pernyataan yang Disiapkan

Menggunakan pernyataan yang disiapkan akan membantu melindungi Anda dari injeksi SQL.

Pernyataan yang disiapkan adalah pernyataan SQL yang telah dikompilasi sebelumnya yang dapat dieksekusi beberapa kali dengan hanya mengirimkan data ke server. Ini memiliki keuntungan tambahan untuk secara otomatis membuat data yang digunakan dalam placeholder aman dari serangan injeksi SQL.

Anda menggunakan pernyataan yang disiapkan dengan memasukkan placeholder di SQL Anda. Berikut adalah tiga contoh:satu tanpa placeholder, satu dengan placeholder tanpa nama, dan satu dengan placeholder bernama.

# no placeholder - siap untuk SQL Injection!$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​($name, $addr, $city)"); # placeholder tanpa nama$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​(?, ?, ?)"); # bernama placeholder$STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​(:name, :addr, :city)");

Anda ingin menghindari metode pertama; itu di sini untuk perbandingan. Pilihan untuk menggunakan placeholder bernama atau tanpa nama akan memengaruhi cara Anda menyetel data untuk pernyataan tersebut.

Tempat Penampung Tanpa Nama

# menetapkan variabel ke setiap tempat penampung, diindeks 1-3$STH->bindParam(1, $name);$STH->bindParam(2, $addr);$STH->bindParam(3, $city); # masukkan satu baris$name ="Daniel"$addr ="1 Jalan Jahat";$city ="Arlington Heights";$STH->execute(); # masukkan baris lain dengan nilai yang berbeda$name ="Steve"$addr ="5 Circle Drive";$city ="Schaumburg";$STH->execute();

Ada dua langkah di sini. Pertama, kami menetapkan variabel ke berbagai placeholder (baris 2–4). Kemudian, kami menetapkan nilai ke placeholder tersebut dan menjalankan pernyataan tersebut. Untuk mengirim kumpulan data lain, cukup ubah nilai variabel tersebut dan jalankan kembali pernyataan tersebut.

Apakah ini tampak agak berat untuk pernyataan dengan banyak parameter? Dia. Namun, jika data Anda disimpan dalam array, ada jalan pintas yang mudah:

# data yang ingin kita masukkan$data =array('Cathy', '9 Dark and Twisty Road', 'Cardiff'); $STH =$DBH->prepare("INSERT INTO people (name, addr, city) values ​​(?, ?, ?)");$STH->execute($data);

Itu mudah!

Data dalam array berlaku untuk placeholder secara berurutan. $data[0] masuk ke placeholder pertama, $data[1] yang kedua, dst. Namun, jika indeks array Anda tidak berurutan, ini tidak akan berfungsi dengan baik, dan Anda harus mengindeks ulang array.

Penampung Bernama

Anda mungkin bisa menebak sintaksnya, tapi ini contohnya:

# argumen pertama adalah nama placeholder bernama - pemberitahuan bernama# placeholder selalu dimulai dengan titik dua.$STH->bindParam(':name', $name);

Anda juga dapat menggunakan pintasan di sini, tetapi ini berfungsi dengan array asosiatif. Ini contohnya:

# data yang ingin kita masukkan$data =array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' ); # jalan pintas!$STH =$DBH->prepare("INSERT INTO people (name, addr, city) value (:name, :addr, :city)");$STH->execute($data); 

Kunci array Anda tidak perlu dimulai dengan titik dua, tetapi sebaliknya harus cocok dengan placeholder yang disebutkan. Jika Anda memiliki larik larik, Anda dapat mengulanginya dan cukup memanggil execute dengan setiap larik data.

Fitur bagus lainnya dari tempat penampung bernama adalah kemampuan untuk memasukkan objek langsung ke database Anda, dengan asumsi properti cocok dengan bidang bernama. Berikut adalah contoh objek, dan cara Anda melakukan penyisipan:

# orang objek class sederhana { public $name; publik $addr; publik $kota; function __construct($n,$a,$c) { $ini->nama =$n; $ini->tambahkan =$a; $ini->kota =$c; } # etc ...} $cathy =new person('Cathy','9 Dark and Twisty','Cardiff'); # inilah bagian yang menyenangkan:$STH =$DBH->prepare("INSERT INTO people (name, addr, city) value (:name, :addr, :city)");$STH->execute((array)$ cathy);

Casting objek ke array di execute berarti bahwa properti diperlakukan sebagai kunci array.

Memilih Data

Data diperoleh melalui ->fetch() , metode pegangan pernyataan Anda. Sebelum memanggil fetch, yang terbaik adalah memberi tahu PDO bagaimana Anda ingin data diambil. Anda memiliki opsi berikut:

  • PDO::FETCH_ASSOC : mengembalikan array yang diindeks oleh nama kolom.
  • PDO::FETCH_BOTH (default): mengembalikan array yang diindeks oleh nama kolom dan nomor.
  • PDO::FETCH_BOUND : menetapkan nilai kolom Anda ke variabel yang disetel dengan ->bindColumn() metode.
  • PDO::FETCH_CLASS : memberikan nilai kolom Anda ke properti dari kelas bernama. Ini akan membuat properti jika properti yang cocok tidak ada.
  • PDO::FETCH_INTO : memperbarui instance kelas bernama yang ada.
  • PDO::FETCH_LAZY :menggabungkan PDO::FETCH_BOTH /PDO::FETCH_OBJ , membuat nama variabel objek seperti yang digunakan.
  • PDO::FETCH_NUM : mengembalikan array yang diindeks oleh nomor kolom.
  • PDO::FETCH_OBJ : mengembalikan objek anonim dengan nama properti yang sesuai dengan nama kolom.

Pada kenyataannya, ada tiga yang akan mencakup sebagian besar situasi: FETCH_ASSOCFETCH_CLASS , dan FETCH_OBJ . Untuk mengatur metode pengambilan, sintaks berikut digunakan:

$STH->setFetchMode(PDO::FETCH_ASSOC);

Anda juga dapat menyetel jenis pengambilan langsung dalam ->fetch() pemanggilan metode.

FETCH_ASSOC

Jenis pengambilan ini membuat larik asosiatif, diindeks menurut nama kolom. Ini seharusnya cukup akrab bagi siapa saja yang telah menggunakan ekstensi mysql/mysqli. Berikut contoh pemilihan data dengan metode ini:

# menggunakan metode pintasan ->query() di sini karena tidak ada nilai variabel# dalam pernyataan pilih.$STH =$DBH->query('SELECT name, addr, city from people'); # mengatur mode pengambilan$STH->setFetchMode(PDO::FETCH_ASSOC); while($row =$STH->fetch()) { echo $row['name'] . "\n"; echo $baris['addr'] . "\n"; echo $baris['kota'] . "\n";}

Perulangan while akan terus berjalan melalui kumpulan hasil satu per satu sampai selesai.

FETCH_OBJ

Jenis pengambilan ini membuat objek kelas std untuk setiap baris data yang diambil. Ini contohnya:

# membuat pernyataan$STH =$DBH->query('SELECT name, addr, city from people'); # mengatur mode pengambilan$STH->setFetchMode(PDO::FETCH_OBJ); # menampilkan hasil while($row =$STH->fetch()) { echo $row->name . "\n"; echo $baris->tambahkan. "\n"; echo $baris->kota . "\n";}

FETCH_CLASS

Properti objek Anda disetel SEBELUM konstruktor dipanggil. Ini penting.

Metode pengambilan ini memungkinkan Anda untuk mengambil data secara langsung ke dalam kelas yang Anda pilih. Saat Anda menggunakan FETCH_CLASS , properti objek Anda disetel BEFORE konstruktor disebut. Baca itu lagi—itu penting. Jika properti yang cocok dengan nama kolom tidak ada, properti tersebut akan dibuat (sebagai publik) untuk Anda.

Ini berarti bahwa jika data Anda memerlukan transformasi apa pun setelah keluar dari database, itu dapat dilakukan secara otomatis oleh objek Anda saat setiap objek dibuat.

Sebagai contoh, bayangkan situasi di mana alamat perlu dikaburkan sebagian untuk setiap record. Kita bisa melakukan ini dengan mengoperasikan properti itu di konstruktor. Ini contohnya:

class secret_person { publik $nama; publik $addr; publik $kota; publik $lain_data; function __construct($other ='') { $this->address =preg_replace('/[a-z]/', 'x', $this->address); $ini->data_lain =$lain; }}

Saat data diambil ke dalam kelas ini, alamatnya memiliki semua huruf kecil a-z huruf diganti dengan huruf x . Sekarang, menggunakan kelas dan membuat transformasi data terjadi sepenuhnya transparan:

$STH =$DBH->query('SELECT name, addr, city from people');$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person'); while($obj =$STH->fetch()) { echo $obj->addr;}

Jika alamatnya adalah '5 Rosebud,' Anda akan melihat '5 Rxxxxxx' sebagai output Anda. Tentu saja, mungkin ada situasi di mana Anda ingin konstruktor dipanggil sebelum data ditetapkan. PDO telah membantu Anda untuk ini juga.

$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'secret_person');

Sekarang, ketika Anda mengulangi contoh sebelumnya dengan mode pengambilan ini (PDO::FETCH_PROPS_LATE ), alamatnya tidak dikaburkan, karena konstruktor dipanggil dan properti ditetapkan.

Terakhir, jika Anda benar-benar membutuhkannya, Anda dapat meneruskan argumen ke konstruktor saat mengambil data ke objek dengan PDO:

$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person', array('stuff'));

Jika Anda perlu meneruskan data yang berbeda ke konstruktor untuk setiap objek, Anda dapat mengatur mode pengambilan di dalam fetch metode:

$i =0; while($rowObj =$STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) { // lakukan hal $i++}

Beberapa Metode Bermanfaat Lainnya

Meskipun ini tidak dimaksudkan untuk mencakup semua yang ada di PDO (ini adalah ekstensi yang sangat besar!), ada beberapa metode lagi yang ingin Anda ketahui untuk melakukan hal-hal dasar dengan PDO.

$DBH->lastInsertId();

 ->lastInsertId() metode selalu dipanggil pada pegangan database, bukan pegangan pernyataan, dan akan mengembalikan id yang bertambah secara otomatis dari baris yang terakhir disisipkan oleh koneksi itu.

$DBH->exec('DELETE FROM people WHERE 1');$DBH->exec("SET time_zone ='-8:00'");

 ->exec() metode ini digunakan untuk operasi yang tidak dapat mengembalikan data selain baris yang terpengaruh. Di atas adalah dua contoh penggunaan metode exec.

$safe =$DBH->quote($unsafe);

 ->quote() metode mengutip string sehingga aman digunakan dalam kueri. Ini adalah cadangan Anda jika Anda tidak menggunakan pernyataan yang telah disiapkan.

$rows_affected =$STH->rowCount();

 ->rowCount() metode mengembalikan bilangan bulat yang menunjukkan jumlah baris yang dipengaruhi oleh suatu operasi. Di setidaknya satu versi PDO yang diketahui, metode tersebut tidak berfungsi dengan pernyataan tertentu. Namun, ini berfungsi dengan baik di versi PHP 5.1.6 dan di atasnya.

Jika Anda mengalami masalah ini dan tidak dapat memutakhirkan PHP, Anda bisa mendapatkan jumlah baris dengan yang berikut:

$sql ="SELECT COUNT(*) FROM people";if ($STH =$DBH->query($sql)) { # periksa jumlah baris if ($STH->fetchColumn()> 0) { # mengeluarkan pilih nyata di sini, karena ada data! } else { echo "Tidak ada baris yang cocok dengan kueri."; }}

Generator PHP CRUD Dari CodeCanyon

Anda dapat menghemat waktu berjam-jam dengan menemukan generator PHP CRUD dari CodeCanyon dan menggunakannya dalam proyek Anda. Berikut adalah lima unduhan paling populer yang dapat Anda mulai gunakan sekarang.

1. Aplikasi Serbaguna Laravel:Sximo 6

Pembangun Sximo 6 didasarkan pada kerangka kerja paling populer di sekitar. Itu juga menerima pembaruan baru untuk tahun 2021, membuatnya semudah digunakan dan kaya fitur mungkin. Beberapa fitur tersebut antara lain:

  • manajemen tabel database
  • template front-end dan back-end
  • editor modul MySQL
  • dukungan beberapa gambar dan unggah file

Cobalah jika Anda ingin menghemat waktu dengan template CRUD PHP.

2. PDO Crud:Pembuat Formulir &Manajemen Basis Data

Inilah generator PHP CRUD kuat lainnya. Template kode PDO PHP ini melakukan manajemen database dengan baik. Tapi bukan itu saja. Anda juga dapat menggunakan PDO CRUD untuk membuat formulir bermanfaat langsung dari tabel database Anda. Ini adalah fitur berguna yang tidak dimiliki banyak opsi lainnya.

3. Cicool:Halaman, Formulir, API Istirahat, dan Generator CRUD

Cicool adalah pembangun multiguna lain yang layak untuk dilihat. Tidak hanya menawarkan pembuat CRUD, tetapi juga memiliki:

  • pembuat halaman
  • pembuat formulir
  • pembuat API lainnya

Selain fitur-fitur ini, Anda juga dapat menambahkan ekstensi ke Cicool dan menyesuaikan temanya dengan mudah.

4. Pembangkit PHP CRUD

Pembuat panel admin yang mudah? Memeriksa. Antarmuka yang mudah dinavigasi? Memeriksa. Analisis basis data yang mendalam? cek lain. Generator PHP CRUD ini memiliki semua yang Anda butuhkan untuk membuat dasbor hebat dan menyimpan data Anda. Dengan fitur otentikasi pengguna dan manajemen hak yang berbeda, template PDO PHP ini layak untuk dicoba.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 Tips dan Trik untuk Membantu Anda Mengelola Database Online Anda

  2. Pentingnya Memelihara Database yang Sesuai dengan HIPAA

  3. Industri Mana yang Paling Diuntungkan dari Akses?

  4. Cara menggunakan Dokumenter Database di Access

  5. Aplikasi Web Microsoft Access vs Database Desktop