Daftar Isi Artikel
- 1 Perbandingan Ngoding PHP menggunakan PDO dengan Native
- 1.1 Keuntungan PDO
- 1.2 Keunggulan MySQLi
- 1.3 Jadi Yang Harus Saya Gunakan?
- 1.4 Perbedaan Kode
- 1.4.1 Membuat Koneksi Database Baru
Artikel ini mengenai Perbandingan Ngoding PHP menggunakan PDO dengan Native, mysql_Sudah lama berlalu hari-hari penggunaan ekstensi, karena metodenya sudah tidak digunakan lagi sejak PHP 5.5 dan dihapus sejak PHP 7 . Sayangnya, internet masih diganggu dengan banyak 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 dapat memilih MySQLi atau PDO. Yang pertama hanyalah versi yang ditingkatkan dengan dukungan prosedural dan OOP serta menambahkan pernyataan yang disiapkan, sedangkan yang terakhir adalah lapisan abstraksi yang memungkinkan Anda menggunakan API terpadu untuk semua 12 driver database 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 selesai. Kami tidak memerlukan API khusus vendor untuk setiap jenis database yang ada, karena jauh lebih mudah untuk menggunakan hanya satu. Meskipun pasti ada banyak kebenaran untuk ini, masalahnya adalah bahwa PDO_MYSQLMySQLi tidak memiliki semua fitur terbaru dan tercanggih yang dimiliki. Sejujurnya saya tidak mengerti mengapa ini terjadi, karena ini akan sepenuhnya menghilangkan alasan apa pun untuk menggunakan API khusus vendor. Meskipun demikian, saya membayangkan bahwa kebanyakan orang tidak memerlukan fitur tambahan ini, tetapi pasti ada beberapa yang membutuhkannya.
Bagi siapa pun yang tertarik, berikut adalah artikel lengkap PDO dan MySQLi .
Keuntungan PDO
MySQLi memiliki beberapa aspek untuk mengejar ketertinggalan dengan PDO. Itu perlu menambahkan fitur seperti:
- Mode pengambilan yang berguna
- Izinkan untuk melewatkan variabel dan nilai secara langsung ke dalam eksekusi
- Kemampuan untuk mendeteksi jenis variabel secara otomatis (Apa yang sebenarnya terjadi adalah bahwa semuanya diperlakukan sebagai string ketika dikirim ke server, tetapi diubah ke jenis yang benar. Ini berfungsi 100% dari waktu dengan pernyataan yang disiapkan asli tetapi tidak berfungsi dengan kasus tepi tertentu, seperti LIKE dengan mode emulasi.)
- Menyediakan opsi untuk secara otomatis menyangga hasil dengan pernyataan yang disiapkan
- Parameter bernama (meskipun tidak berguna dengan mode emulasi dimatikan di PDO, karena Anda hanya dapat menggunakan nama yang sama sekali)
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 yang disiapkan asli, tetapi yang ditiru juga dapat diterima dengan sempurna. Berikut adalah tulisan singkat tentang perbedaan antara keduanya.
Keunggulan MySQLi
PDO juga kehilangan beberapa fitur, meskipun fitur tersebut kurang penting bagi sebagian besar pengguna, seperti:
- Kueri asinkron
- 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)
- Metode penutupan database yang tepat
- Beberapa kueri sekaligus (meskipun bisa jika mode emulasi diaktifkan di PDO)
- Pembersihan otomatis dengan koneksi yang persisten
Jadi Yang Harus Saya Gunakan?
Pendapat saya adalah bahwa PDO harus digunakan secara default, terutama pemula, karena keserbagunaan, prediktabilitas umum, dan mode pengambilan yang berguna. Namun, MySQLi akan menjadi pilihan yang lebih baik bagi pengguna tingkat lanjut yang menginginkan fungsionalitas khusus MySQL terbaru.
Agak ironis bahwa pengembang PHP yang lebih berpengalaman cenderung berpikir PDO adalah satu-satunya pilihan yang 100% dapat diterima, sementara pemula cenderung menggunakan MySQLi. Ini benar-benar gila dari kedua ujungnya. Tentu saja sebagian besar pengembang tidak benar-benar membutuhkan fitur-fitur canggih tambahan yang ditawarkan MySQLi, tetapi itu pasti bisa sangat berguna untuk beberapa, seperti yang disebutkan sebelumnya.
Sangat mengherankan bahwa para pemula takut untuk mencoba sesuatu yang “baru” dan beralih ke PDO, sementara banyak pengguna tingkat lanjut melafalkan argumen “kemudahan beralih dari driver database” yang bagus sebagai keuntungan PDO. Siapa pun yang mempercayai mitos bahwa Anda dapat dengan mudah beralih antar database di PDO dengan mulus jelas tidak pernah berusaha melakukannya. Setiap driver berbeda, dan peralihan dari Microsoft SQL Server ke MySQL pasti tidak akan otomatis. Pertama-tama mari kita perjelas, sintaksnya sangat mirip – hampir identik, dan saya akan menyajikannya dalam contoh. PDO juga bukan merupakan lapisan abstraksi di atas MySQLi, melainkan di atas PDO_MYSQL.
Jika PDO akhirnya mengikuti semua fungsionalitas MySQL terbaru atau berbeda, maka saya bisa melihat mengapa MySQLi harus pergi; Saya bahkan akan mendorongnya, jika itu yang terjadi. Meskipun PDO memiliki beberapa fitur khusus driver, PDO tidak memiliki semua atau mengikuti yang terbaru. Inilah tepatnya mengapa saya tidak berpikir MySQLi dan PDO bukanlah pesaing, melainkan dua perpustakaan yang kuat dengan fokus yang sama sekali berbeda untuk saat ini. Namun, jelas PDO harus digunakan secara lebih luas. Tapi seperti yang dikatakan sebelumnya, perbedaannya bisa diabaikan begitu saja. Seperti yang disebutkan beberapa kali sebelumnya, kelangsungan hidup MySQLi bergantung padanya mengejar ke PDO, bersama dengan PDO terutama menempel dengan fitur-fitur yang digunakan di antara sebagian besar driver DB yang didukungnya.
Perbedaan Kode
Seperti yang dinyatakan sebelumnya, baik PDO dan MySQLi sangat mirip, tetapi ada sedikit perbedaan dalam sintaks. MySQLi mengikuti konvensi snake_case PHP jadul, sedangkan 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 mempersulit hal-hal dengan memaksa Anda menggunakan dua metode terpisah untuk menggunakan pernyataan yang disiapkan. Untungnya PDO menghilangkan kebutuhan untuk menggunakan fungsi mengikat khusus – meskipun saya tidak yakin mengapa hal yang sama tidak dilakukan execute(). MySQLi dan PDO yang tidak dipersiapkan sebenarnya tidak terlalu buruk, dan hanya implementasi yang disayangkan dari pernyataan yang disiapkan yang menyebabkannya tampak bertele-tele. Misalnya, di API PostgreSQL khusus vendor Anda dapat melakukannya seperti ini. Berikut adalah contoh bagaimana Anda akan melakukan kueri “tidak disiapkan” untuk mengambil array asosiatif dengan MySQLi dan PDO, sebagai referensi.
$arr = $mysqli->query("SELECT * FROM myTable")->fetch_all(MYSQLI_ASSOC); Salinan $arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC); SalinanPada kenyataannya, cara terbaik adalah menggunakan pembungkus, pembuat kueri, atau ORM. Saya memiliki pembungkus MySQLi yang belum sempurna yang mungkin Anda sukai. Meskipun PDO adalah langkah ke arah yang benar, karena Anda dapat mengikat nilai secara langsung ke dalam eksekusi, itu tetap tidak ideal. Di kelas yang saya buat, Anda bisa merantai semua panggilan Anda, sambil meneruskan nilai untuk mengikat sebagai argumen parameter. Lihat apa yang dapat Anda lakukan.
$arr = $mysqli->query("SELECT * FROM myTable WHERE id > ?", [12])->fetchAll('assoc');Salinan
Anda sekarang memiliki seluruh array asosiatif yang disimpan dalam variabel dengan cara yang jauh lebih ringkas. Aneh kenapa PDO dan MySQLi tidak melakukannya seperti ini.
Untuk tutorial selanjutnya, kami akan menggunakan pernyataan yang sudah disiapkan, karena tidak ada alasan yang baik untuk tidak menggunakannya untuk perlindungan injeksi SQL, kecuali Anda menggunakan fitur seperti async, yang saat ini tidak mendukungnya. Jika tidak, Anda harus memformat kueri Anda dengan benar.
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 }Salinan
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 }Salinan
Sisipkan, Perbarui, Hapus
PDO
$stmt = $pdo->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)"); $stmt->execute([$_POST['name'], 29]); $stmt = null;Salinan
MySQLi
$stmt = $mysqli->prepare("UPDATE myTable SET name = ? WHERE id = ?"); $stmt->bind_param("si", $_POST['name'], $_SESSION['id']); $stmt->execute(); $stmt->close();Salinan
Perlu dicatat bahwa dengan PDO, Anda dapat merantai prepare()dan execute(), meskipun Anda tidak akan mendapatkan baris yang terpengaruh, jadi saya tidak melihat itu berguna.
Dapatkan Jumlah Baris yang Terkena Dampak
PDO
$stmt->rowCount();Salinan
MySQLi
$stmt->affected_rows;Salinan
Dapatkan Kunci Utama Terbaru Disisipkan
Perhatikan, bagaimana keduanya menggunakan variabel koneksi, bukan $stmt.
PDO
$pdo->lastInsertId();Salinan
MySQLi
$mysqli->insert_id;Salinan
Dapatkan Baris yang Cocok
PDO
Di PDO, satu-satunya cara untuk mencapai ini adalah dengan menyetelnya sebagai opsi koneksi untuk mengubah perilaku rowCount(), sayangnya. Ini berarti rowCount()akan mengembalikan baris yang cocok atau baris diubah untuk seluruh koneksi database Anda, tetapi tidak keduanya.
$options = [ PDO::MYSQL_ATTR_FOUND_ROWS => true ];MySQLi
$mysqli->info;Ini akan menampilkan seluruh string informasi, seperti:
Rows matched: 1 Changed: 0 Warnings: 0
Saya tidak tahu mengapa mereka berpikir ini akan menjadi implementasi yang bijaksana, karena akan jauh lebih nyaman dalam sebuah array. Untungnya, Anda bisa melakukan ini.
preg_match_all('/(\S[^:]+): (\d+)/', $mysqli->info, $matches); $infoArr = array_combine ($matches[1], $matches[2]); var_export($infoArr);Sekarang Anda dapat mengakses nilainya dengan mudah. Perhatikan, bahwa nilainya adalah string, jadi Anda bisa memasukkan semua nilai ke int, sehingga ===bisa berfungsi atau memeriksanya dengan ketat== .
['Rows matched' => '1', 'Changed' => '0', 'Warnings' => '0']Salinan
Mengambil
Ambil Array Asosiatif
PDO
$stmt = $pdo->prepare("SELECT * FROM myTable WHERE id <= ?"); $stmt->execute([5]); $arr = $stmt->fetchAll(PDO::FETCH_ASSOC); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;MySQLi
$stmt = $mysqli->prepare("SELECT id, name, age FROM myTable WHERE name = ?"); $stmt->bind_param("s", $_POST['name']); $stmt->execute(); $arr = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Ambil Baris Tunggal
PDO
$stmt = $pdo->prepare("SELECT id, name, age FROM myTable WHERE name = ?"); $stmt->execute([$_POST['name']]); $arr = $stmt->fetch(PDO::FETCH_ASSOC); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$stmt = $mysqli->prepare("SELECT id, name, age FROM myTable WHERE name = ?"); $stmt->bind_param("s", $_POST['name']); $stmt->execute(); $arr = $stmt->get_result()->fetch_assoc(); if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Ambil Nilai Tunggal (Skalar)
PDO
$stmt = $pdo->prepare("SELECT id, name, age FROM myTable WHERE name = ?"); $stmt->execute([$_POST['name']]); $arr = $stmt->fetch(PDO::FETCH_COLUMN); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$stmt = $mysqli->prepare("SELECT id, name, age FROM myTable WHERE name = ?"); $stmt->bind_param("s", $_POST['name']); $stmt->execute(); $arr = $stmt->get_result()->fetch_row()[0]; if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Fetch Array of Objects
PDO
class myClass {} $stmt = $pdo->prepare("SELECT name, age, weight FROM myTable WHERE name = ?"); $stmt->execute(['Joe']); $arr = $stmt->fetchAll(PDO::FETCH_CLASS, 'myClass'); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
class myClass {} $arr = []; $stmt = $mysqli->prepare("SELECT id, name, age FROM myTable WHERE id = ?"); $stmt->bind_param("s", $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while($row = $result->fetch_object('myClass')) { $arr[] = $row; } if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
PDO benar-benar bersinar di sini seperti yang Anda lihat. Sangat aneh mengapa MySQLi tidak memiliki sesuatu seperti itu $mysqli_result->fetch_all(MYSQLI_OBJ). PDO bahkan mengambil langkah lebih jauh dan memiliki cara yang luar biasa untuk menangani perilaku default yang mengganggu dipanggil setelah konstruktor kelas, melalui bitwising dengan fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, ‘myClass’). Dimungkinkan untuk mereplikasi perilaku ini di MySQLi, tetapi itu bergantung pada meninggalkan konstruktor dan mengandalkan sihir __set()atau dengan hanya mengaturnya di konstruktor jika tidak sama dengan nilai default.
Pencarian Data yang Mirip
PDO
$search = "%{$_POST['search']}%"; $stmt = $pdo->prepare("SELECT id, name, age FROM myTable WHERE name LIKE ?"); $stmt->execute([$search]); $arr = $stmt->fetchAll(); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$search = "%{$_POST['search']}%"; $stmt = $mysqli->prepare("SELECT id, name, age FROM myTable WHERE name LIKE ?"); $stmt->bind_param("s", $search); $stmt->execute(); $arr = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Mode Ambil
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
$stmt = $pdo->prepare("SELECT event_name, location FROM events WHERE id < ?"); $stmt->execute([25]); $arr = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$arr = []; $id = 25; $stmt = $con->prepare("SELECT event_name, location FROM events WHERE id < ?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); while($row = $result->fetch_row()) { $arr[$row[0]] = $row[1]; } if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Keluaran:
[‘Cool Event’ => ‘Seattle’, ‘Fun Event’ => ‘Dallas’, ‘Boring Event’ => ‘Chicago’]
Salinan
Ambil Kolom Grup
PDO
$stmt = $pdo->prepare("SELECT hair_color, name FROM myTable WHERE id < ?"); $stmt->execute([10]); $arr = $stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_COLUMN); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$arr = []; $id = 10; $stmt = $con->prepare("SELECT hair_color, name FROM myTable WHERE id < ?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); while($row = $result->fetch_row()) { $arr[$row[0]][] = $row[1]; } if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Keluaran:
[
‘blonde’ => [‘Patrick’, ‘Olivia’],
‘brunette’ => [‘Kyle’, ‘Ricky’],
‘red’ => [‘Jordan’, ‘Eric’]
]
Salinan
Fetch Key / Value Pair Array
PDO
$stmt = $pdo->prepare("SELECT id, max_bench, max_squat FROM myTable WHERE weight < ?"); $stmt->execute([200]); $arr = $stmt->fetchAll(PDO::FETCH_UNIQUE); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$arr = []; $weight = 200; $stmt = $con->prepare("SELECT id, max_bench, max_squat FROM myTable WHERE weight < ?"); $stmt->bind_param("i", $weight); $stmt->execute(); $result = $stmt->get_result(); $firstColName = $result->fetch_field_direct(0)->name; while($row = $stmtResult->fetch_assoc()) { $firstColVal = $row[$firstColName]; unset($row[$firstColName]); $arr[$firstColVal] = $row; } if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Keluaran:
[
17 => [‘max_bench’ => 230, ‘max_squat’ => 175],
84 => [‘max_bench’ => 195, ‘max_squat’ => 235],
136 => [‘max_bench’ => 135, ‘max_squat’ => 285]
]
Salinan
Ambil Grup
PDO
$stmt = $pdo->prepare("SELECT hair_color, name, age FROM myTable WHERE id < ?"); $stmt->execute([12]); $arr = $stmt->fetchAll(PDO::FETCH_GROUP); if(!$arr) exit('No rows'); var_export($arr); $stmt = null;Salinan
MySQLi
$arr = []; $id = 12; $stmt = $con->prepare("SELECT hair_color, name, age FROM myTable WHERE id < ?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $firstColName = $result->fetch_field_direct(0)->name; while($row = $stmtResult->fetch_assoc()) { $firstColVal = $row[$firstColName]; unset($row[$firstColName]); $arr[$firstColVal][] = $row; } if(!$arr) exit('No rows'); var_export($arr); $stmt->close();Salinan
Keluaran:
[
‘blonde’ => [
[‘name’ => ‘Patrick’, ‘age’ => 22],
[‘name’ => ‘Olivia’, ‘age’ => 18]
],
‘brunette’ => [
[‘name’ => ‘Kyle’, ‘age’=> 25],
[‘name’ => ‘Ricky’, ‘age’ => 34]
],
‘red’ => [
[‘name’ => ‘Jordan’, ‘age’ => 17],
[‘name’ => ‘Eric’, ‘age’ => 52]
]
]
Salinan
Dimana Dalam Array
PDO
$inArr = [1, 3, 5]; $clause = implode(',', array_fill(0, count($inArr), '?')); //create 3 question marks $stmt = $pdo->prepare("SELECT * FROM myTable WHERE id IN ($clause)"); $stmt->execute($inArr); $resArr = $stmt->fetchAll(); if(!$resArr) exit('No rows'); var_export($resArr); $stmt = null;Salinan
MySQLi
$inArr = [12, 23, 44]; $clause = implode(',', array_fill(0, count($inArr), '?')); //create 3 question marks $types = str_repeat('i', count($inArr)); //create 3 ints for bind_param $stmt = $mysqli->prepare("SELECT id, name FROM myTable WHERE id IN ($clause)"); $stmt->bind_param($types, ...$inArr); $stmt->execute(); $resArr = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); if(!$resArr) exit('No rows'); var_export($resArr); $stmt->close();Salinan
Dimana Dalam Array Dengan Placeholder Lain
PDO
$inArr = [1, 3, 5]; $clause = implode(',', array_fill(0, count($inArr), '?')); //create 3 question marks $stmt = $pdo->prepare("SELECT * FROM myTable WHERE id IN ($clause) AND id < ?"); $fullArr = array_merge($inArr, [5]); //merge WHERE IN array with other value(s) $stmt->execute($fullArr); $resArr = $stmt->fetchAll(); if(!$resArr) exit('No rows'); var_export($resArr); $stmt = null;Salinan
MySQLi
$inArr = [12, 23, 44]; $clause = implode(',', array_fill(0, count($inArr), '?')); //create 3 question marks $types = str_repeat('i', count($inArr)); //create 3 ints for bind_param $types .= 'i'; //add 1 more int type $fullArr = array_merge($inArr, [26]); //merge WHERE IN array with other value(s) $stmt = $mysqli->prepare("SELECT id, name FROM myTable WHERE id IN ($clause) AND age > ?"); $stmt->bind_param($types, ...$fullArr); //4 placeholders to bind $stmt->execute(); $resArr = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); if(!$resArr) exit('No rows'); var_export($resArr); $stmt->close();Salinan
Transaksi
PDO
try { $pdo->beginTransaction(); $stmt1 = $pdo->prepare("INSERT INTO myTable (name, state) VALUES (?, ?)"); $stmt2 = $pdo->prepare("UPDATE myTable SET age = ? WHERE id = ?"); if(!$stmt1->execute(['Rick', 'NY'])) throw new Exception('Stmt 1 Failed'); else if(!$stmt2->execute([27, 139])) throw new Exception('Stmt 2 Failed'); $stmt1 = null; $stmt2 = null; $pdo->commit(); } catch(Exception $e) { $pdo->rollback(); throw $e; }Salinan
Anda mungkin bertanya-tanya mengapa saya hanya memeriksa kebenarannya execute()dengan PDO. Hal ini disebabkan oleh fakta bahwa ia dapat mengembalikan false, sementara diam-diam gagal. Berikut penjelasan lebih detailnya .
MySQLi
try { $mysqli->autocommit(FALSE); //turn on transactions $stmt1 = $mysqli->prepare("INSERT INTO myTable (name, age) VALUES (?, ?)"); $stmt2 = $mysqli->prepare("UPDATE myTable SET name = ? WHERE id = ?"); $stmt1->bind_param("si", $_POST['name'], $_POST['age']); $stmt2->bind_param("si", $_POST['name'], $_SESSION['id']); $stmt1->execute(); $stmt2->execute(); $stmt1->close(); $stmt2->close(); $mysqli->autocommit(TRUE); //turn off transactions + commit queued queries } catch(Exception $e) { $mysqli->rollback(); //remove all queries from queue if error (undo) throw $e; }Salinan
MySQLi juga memiliki gotcha, tetapi solusinya adalah mengubah kesalahan menjadi pengecualian dengan penangan global. Baca lebih lanjut di sini .
Parameter Bernama
Ini adalah fitur khusus PDO, tetapi hanya berguna jika mode emulasi dimatikan. Jika tidak, Anda hanya dapat menggunakan variabel yang sama sekali. Perlu juga dicatat bahwa titik dua di depan 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 ?placeholder dengan yang bernama; itu salah satu atau yang lainnya.
$stmt = $pdo->prepare("UPDATE myTable SET name = :name WHERE id = :id"); $stmt->execute([':name' => 'David', ':id' => 3]); $stmt = null;Nah demikianlah Perbandingan Ngoding PHP menggunakan PDO dengan Native semoga bermanfaat dan dapat menambah wawasan, jangan sungkan untuk meninggalkan komentar ya
Seorang pengajar dan pembelajar yang mengurus lembaga pelatihan dan kursus komputer bernama LKP Naura