Apa manfaat pdo di php?

Lama berlalu adalah hari-hari menggunakan ekstensi

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
5, karena metodenya telah dan. Sayangnya, internet masih diganggu dengan banyak sekali tutorial lama yang hanya akan disalin/ditempel oleh pemula dan digunakan pada platform hosting bersama dengan versi PHP yang lebih lama, sehingga melanjutkan warisannya

Jika Anda menggunakan MySQL atau MariaDB di PHP, Anda memiliki kemampuan untuk memilih MySQLi atau PDO. Yang pertama hanyalah versi yang ditingkatkan dengan dukungan prosedural dan OOP dan menambahkan pernyataan yang disiapkan, sedangkan yang terakhir adalah lapisan abstraksi yang memungkinkan Anda menggunakan API terpadu untuk semua yang didukungnya. Meskipun harus disebutkan bahwa MySQL tidak diragukan lagi adalah database paling populer untuk digunakan di dunia PHP

Secara teori, orang mungkin menganggap diskusi harus berakhir. Kami tidak memerlukan API khusus vendor untuk setiap jenis database yang ada, karena jauh lebih mudah menggunakan satu saja. Meskipun pasti ada banyak kebenaran mengenai hal ini, masalahnya adalah bahwa

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
6 tidak memiliki semua fitur terbaru dan tercanggih yang dimiliki MySQLi. Sejujurnya saya tidak mengerti mengapa ini terjadi, karena ini akan sepenuhnya menghilangkan alasan untuk menggunakan API khusus vendor. Yang mengatakan, saya membayangkan bahwa kebanyakan orang tidak memerlukan fitur tambahan ini, tetapi pasti ada beberapa yang melakukannya

Bagi siapa saja yang tertarik, inilah artikel lengkap tentang PDO dan MySQLi

Keuntungan PDO

MySQLi memiliki beberapa aspek untuk mengejar ketinggalan dengan PDO. Perlu menambahkan fitur seperti

  1. Izinkan untuk meneruskan variabel dan nilai langsung ke eksekusi
  2. Kemampuan untuk mendeteksi jenis variabel secara otomatis (Apa yang sebenarnya terjadi adalah semuanya diperlakukan sebagai string saat dikirim ke server, tetapi dikonversi ke jenis yang benar. Ini bekerja 100% dari waktu dengan pernyataan yang disiapkan asli tetapi tidak bekerja dengan kasus tepi tertentu, seperti LIKE dengan mode emulasi. )
  3. Memberikan pernyataan yang telah disiapkan
  4. Parameter bernama (walaupun tidak berguna dengan mode emulasi dimatikan di PDO, karena Anda hanya dapat menggunakan nama yang sama satu kali)

Seperti yang Anda lihat, ada beberapa hal yang harus dipelajari MySQLi dari PDO jika ingin tetap relevan

Jika ya, maka seharusnya tidak ada perbedaan sama sekali. Orang-orang selalu berbicara tentang bagaimana Anda harus mempelajari ekstensi yang benar-benar baru, namun sebagian besar sebenarnya sudah hampir identik. Untuk artikel ini, saya akan menggunakan pernyataan asli yang disiapkan, tetapi yang ditiru juga dapat diterima. Berikut ini adalah Langganan singkat di antara keduanya

Keunggulan MySQLi

PDO juga kehilangan beberapa fitur, meskipun tidak terlalu penting bagi sebagian besar pengguna, seperti

  1. Kueri asinkron
  2. Kemampuan untuk mendapatkan lebih banyak info tentang baris yang terpengaruh, seperti memperbarui baris dengan nilai yang sama (dapat dilakukan di PDO sebagai pengaturan konstruktor, Anda tidak dapat mengubahnya nanti)
  3. Basis data yang tepat
  4. Beberapa kueri sekaligus (meskipun bisa jika mode emulasi diaktifkan di PDO)
  5. dengan koneksi yang persisten

Jadi Mana Yang Harus Saya Gunakan?

Pendapat saya adalah bahwa PDO harus digunakan secara default, terutama pemula, karena keserbagunaannya, prediktabilitas umum, dan mode pengambilan yang berguna. Namun, MySQLi akan menjadi pilihan yang lebih baik untuk pengguna tingkat lanjut yang menginginkan fungsionalitas khusus MySQL terbaru

Agak ironis bahwa pengembang PHP yang lebih berpengalaman cenderung menganggap PDO adalah satu-satunya pilihan yang dapat diterima 100%, sementara pemula cenderung menggunakan MySQLi. Ini benar-benar gila dari kedua ujungnya. Tentu saja sebagian besar pengembang tidak benar-benar membutuhkan fitur ekstra canggih yang ditawarkan MySQLi, tetapi tentu saja bisa sangat berguna bagi beberapa orang, seperti yang disebutkan sebelumnya.

Sangat mengherankan bahwa para pemula takut untuk mencoba sesuatu yang "baru" dan beralih ke PDO, sementara banyak pengguna tingkat lanjut mengucapkan argumen "kemudahan beralih dari driver basis data" sebagai keuntungan PDO. Siapa pun yang mempercayai mitos bahwa Anda dapat dengan mudah beralih antar database di PDO jelas tidak pernah mencoba melakukannya. Setiap driver berbeda, dan peralihan dari Microsoft SQL Server ke MySQL pasti tidak akan otomatis. Pertama-tama mari kita perjelas satu hal, sintaksnya sangat mirip — hampir identik, dan saya akan menyajikannya dalam contoh. PDO juga bukan lapisan abstraksi di atas MySQLi, melainkan di atas PDO_MYSQL

Jika PDO akhirnya mengikuti semua fungsionalitas MySQL terbaru atau berbeda, maka saya dapat melihat mengapa MySQLi harus dihilangkan; . Meskipun PDO memang memiliki beberapa fitur khusus driver, PDO tidak memiliki semua atau mengikuti yang terbaru. Inilah tepatnya mengapa saya tidak berpikir MySQLi dan PDO belum tentu merupakan pesaing, melainkan dua perpustakaan yang kuat dengan fokus yang sangat berbeda untuk saat ini. Jelas PDO harus lebih banyak digunakan. Tapi seperti yang dikatakan sebelumnya, perbedaannya cukup banyak diabaikan. Seperti yang disebutkan beberapa kali sebelumnya, kelangsungan hidup MySQLi bergantung pada penangkapan PDO, bersama dengan PDO terutama bertahan dengan fitur yang digunakan di antara sebagian besar driver DB yang didukungnya.

Perbedaan Kode

Seperti yang dinyatakan sebelumnya, PDO dan MySQLi sangat mirip, tetapi ada sedikit perbedaan dalam sintaks. MySQLi mengikuti konvensi snake_case PHP jadul, sementara PDO menggunakan camelCase. Selain itu, metode MySQLi digunakan sebagai properti objek, sedangkan PDO menggunakan sintaks tradisional untuk fungsi

Saya tidak akan pernah mengerti mengapa PDO dan MySQLi memperumit masalah dengan memaksa Anda menggunakan dua metode terpisah untuk menggunakan pernyataan yang sudah disiapkan. Untungnya PDO menghapus kebutuhan untuk menggunakan fungsi ikat khusus — meskipun saya tidak yakin mengapa hal yang sama tidak dilakukan untuk

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
7. MySQLi dan PDO yang tidak disiapkan benar-benar tidak terlalu buruk, dan hanya implementasi pernyataan yang disiapkan yang sangat disayangkan yang menyebabkannya tampak bertele-tele. Misalnya, di API PostgreSQL khusus vendor, Anda dapat melakukannya seperti ini. Berikut adalah contoh bagaimana Anda melakukan kueri "tidak siap" untuk mengambil larik asosiatif dengan MySQLi dan PDO, untuk referensi

$arr = $mysqli->query("SELECT * FROM myTable")->fetch_all(MYSQLI_ASSOC);
$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);

Pada kenyataannya, rute terbaik adalah menggunakan pembungkus, pembuat kueri, atau ORM. Saya memiliki pembungkus MySQLi yang belum sempurna yang mungkin Anda sukai. Sementara PDO adalah langkah ke arah yang benar, karena Anda dapat mengikat nilai secara langsung ke dalam eksekusi, itu masih belum ideal. Di kelas yang saya buat, Anda dapat merangkai semua panggilan Anda, sambil meneruskan nilai untuk diikat sebagai argumen parameter. Lihat apa yang dapat Anda lakukan

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');

Anda sekarang memiliki seluruh array asosiatif yang disimpan dalam variabel dengan cara yang jauh lebih ringkas. Aneh mengapa PDO dan MySQLi tidak melakukannya seperti ini

Untuk tutorial selanjutnya, kita akan menggunakan pernyataan yang telah disiapkan, karena tidak ada alasan bagus untuk tidak menggunakannya untuk perlindungan injeksi SQL, kecuali jika Anda menggunakan fitur seperti async, yang saat ini tidak mendukungnya. Jika tidak, Anda harus memformat kueri dengan benar secara manual

Membuat Koneksi Database Baru

PDO

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_

MySQLi

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}

PDO

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
_

MySQLi

$stmt = $mysqli->prepare("UPDATE myTable SET name = ? WHERE id = ?");
$stmt->bind_param("si", $_POST['name'], $_SESSION['id']);
$stmt->execute();
$stmt->close();
_

Perlu dicatat bahwa dengan PDO, Anda dapat merangkai

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
8 dan
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
7, meskipun Anda tidak akan mendapatkan baris yang terpengaruh, jadi menurut saya itu tidak berguna

Dapatkan Jumlah Baris Terpengaruh

PDO

$stmt->rowCount();

MySQLi

$stmt->affected_rows;

Dapatkan Kunci Utama Terbaru Dimasukkan

Perhatikan, bagaimana keduanya menggunakan variabel koneksi, bukan

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
0

PDO

$pdo->lastInsertId();

MySQLi

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_0

Dapatkan Baris yang Cocok

PDO

Di PDO, satu-satunya cara untuk mencapainya adalah dengan menyetelnya sebagai opsi koneksi untuk mengubah perilaku

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
1, sayangnya. Ini berarti
$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
_1 akan mengembalikan baris yang cocok atau baris diubah untuk seluruh koneksi database Anda, tetapi tidak keduanya

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_1

MySQLi

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_2

Ini akan menampilkan seluruh rangkaian informasi, seperti itu

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_3

Saya tidak tahu mengapa mereka berpikir ini akan menjadi implementasi yang bijak, karena akan jauh lebih nyaman dalam sebuah array. Untungnya, Anda bisa melakukan ini

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_4

Sekarang Anda dapat mengakses nilai dengan cukup mudah. Perhatikan, bahwa nilainya adalah string, jadi Anda dapat memasukkan semua nilai ke int, jadi

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
3 dapat bekerja atau memeriksa dengan ketat
$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
4

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_5

Mengambil

Ambil Array Asosiatif

PDO

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_6

MySQLi

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_7

Ambil Baris Tunggal

PDO

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_8

MySQLi

$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
_9

Ambil Nilai Tunggal (Skalar)

PDO

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
0

MySQLi

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
1

Ambil Array Objek

PDO

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
2

MySQLi

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_3

PDO benar-benar bersinar di sini seperti yang Anda lihat. Sangat aneh mengapa MySQLi tidak memiliki sesuatu seperti

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
5. PDO bahkan melangkah lebih jauh dan memiliki cara yang luar biasa untuk menangani perilaku default yang mengganggu karena dipanggil setelah konstruktor kelas, melalui bitwise dengan
$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
6. Dimungkinkan untuk mereplikasi perilaku ini di MySQLi, tetapi bergantung pada mengabaikan konstruktor dan mengandalkan sihir
$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
7 atau dengan hanya menyetelnya di konstruktor jika tidak sama dengan nilai default

Suka

PDO

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_4

MySQLi

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
5

Ambil Mode

Sejauh ini, ini adalah fitur favorit saya tentang PDO. Mode pengambilan di PDO sangat berguna dan cukup mengejutkan bahwa MySQLi belum menambahkannya

Ambil Pasangan Kunci/Nilai

PDO

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_6

MySQLi

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_7

Keluaran

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_8

Ambil Kolom Grup

PDO

$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');
_9

MySQLi

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_0

Keluaran

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_1

Larik Pasangan Kunci/Nilai Ambil

PDO

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_2

MySQLi

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_3

Keluaran

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_4

Ambil Grup

PDO

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_5

MySQLi

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_6

Keluaran

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_7

Dimana Dalam Array

PDO

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_8

MySQLi

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
$options = [
  PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
];
try {
  $pdo = new PDO($dsn, "username", "password", $options);
} catch (Exception $e) {
  error_log($e->getMessage());
  exit('Something weird happened'); //something a user can understand
}
_9

Where In Array Dengan Placeholder Lain

PDO

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
0

MySQLi

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
_1

Transaksi

PDO

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
_2

Anda mungkin bertanya-tanya mengapa saya hanya memeriksa kebenaran pada

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
7 dengan PDO. Hal ini disebabkan oleh fakta bahwa itu dapat mengembalikan false, sementara gagal secara diam-diam. Ini a

MySQLi

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
  $mysqli = new mysqli("localhost", "username", "password", "databaseName");
  $mysqli->set_charset("utf8mb4");
} catch(Exception $e) {
  error_log($e->getMessage());
  exit('Error connecting to database'); //Should be a message a typical user could understand
}
_3

MySQLi juga memiliki gotcha, tetapi solusinya adalah mengubah kesalahan menjadi pengecualian dengan penangan global. Baca lebih lanjut

Parameter Bernama

Ini adalah fitur khusus PDO, tetapi hanya berguna jika mode emulasi dimatikan. Jika tidak, Anda hanya dapat menggunakan variabel yang sama satu kali. Juga harus dicatat bahwa usus besar utama tidak diperlukan, tetapi ini tidak didokumentasikan di mana pun. Kemungkinan besar pada akhirnya akan tetap, tetapi Anda tidak pernah tahu, saya kira. Anda juga tidak dapat mencampur

$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)");
$stmt->execute([$_POST['name'], 29]);
$stmt = null;
_9 placeholder dengan yang bernama;

Mengapa saya harus menggunakan PDO PHP?

PDO dalam PHP menawarkan lapisan abstraksi akses data, yang berarti Anda dapat mengeluarkan kueri dan mengambil data menggunakan fungsi yang sama terlepas dari database mana yang Anda gunakan. PDO isn't a database abstraction; it doesn't rewrite SQL or imitates features that aren't accessible.

Apa kelebihan PDO dibandingkan MySQLi?

Baik MySQLi maupun PDO memiliki kelebihan masing-masing. PDO akan bekerja pada 12 sistem database yang berbeda, sedangkan MySQLi hanya akan bekerja dengan database MySQL . Jadi, jika Anda harus mengalihkan proyek Anda untuk menggunakan database lain, PDO mempermudah prosesnya. Anda hanya perlu mengubah rangkaian koneksi dan beberapa kueri.

Apa manfaat utama menggunakan PHP Data Objects PDO daripada MySQLi?

Dukungan Basis Data . Pada saat penulisan ini, PDO mendukung 12 driver berbeda, berlawanan dengan MySQLi, yang hanya mendukung MySQL. database driver support. At the time of this writing, PDO supports 12 different drivers, opposed to MySQLi, which supports MySQL only.

Apakah PDO lebih aman daripada MySQLi?

PDO lebih aman daripada dua opsi pertama dan juga lebih cepat dibandingkan dengan MySQLi prosedural dan berorientasi objek MySQLi. PDO adalah lapisan akses basis data yang menyediakan antarmuka yang cepat dan konsisten untuk mengakses dan mengelola basis data dalam aplikasi PHP.