Penggunaan fungsi PDO::FETCH_BOTH pada PHP

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:

  1. Mode pengambilan yang berguna
  2. Izinkan untuk melewatkan variabel dan nilai secara langsung ke dalam eksekusi
  3. 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.)
  4. Menyediakan opsi untuk secara otomatis menyangga hasil dengan pernyataan yang disiapkan
  5. 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:

  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. Metode penutupan database yang tepat
  4. Beberapa kueri sekaligus (meskipun bisa jika mode emulasi diaktifkan di PDO)
  5. 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); Salinan

Pada 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

Apa fungsi PDO?

PDO bertujuan untuk membuat satu buah interface yang seragam untuk koneksi ke beragam jenis database. Ketika Anda menggunakan database yang didukung oleh PDO seperti misalnya MySQL, Oracle, MS.

Apa yang dimaksud dengan PDO?

"PDO - PHP Data Objects - adalah lapisan akses database yang menyediakan metode akses yang seragam ke beberapa database." Ini tidak memperhitungkan sintaks database-spesifik, namun memungkinkan proses peralihan database dan platform menjadi lebih mudah, cukup dengan mengganti string koneksi dalam banyak instance.

Apa perbedaan sql MySQL dan MySQLi?

Perbedaan MySQL dan MySQLi adalah tipe dukungan yang disediakan. Jika MySQL hanya mendukung MySQL server sampai di versi 4.1.3, MySQLi dapat dipakai sampai dengan versi paling baru. Fiturnya pun lebih banyak bisa dipakai ketika menggunakan MySQLi dibandingkan menggunakan MySQL.

Postingan terbaru

LIHAT SEMUA