Selamat datang di tutorial singkat tentang perbedaan antara MySQL, MySQLi, dan PDO di PHP. Jadi Anda mungkin baru saja mulai bekerja dengan MySQL di PHP, dan memperhatikan bahwa ada 3 ekstensi berbeda untuk bekerja dengan database
Perbedaan utama antara ekstensi MySQL, MySQLi, dan PDO adalah
- MySQL – Ekstensi PHP-MySQL awal, saat ini mati dan dihapus
- MySQLi (MySQL Improved) – Versi perbaikan dari ekstensi MySQL sebelumnya
- Objek Data PHP (PDO) – Ekstensi basis data modern. Mendukung tidak hanya MySQL, tetapi juga database lain seperti Firebird, SQLite, Postgre, dan lainnya
Ya, yang disebut “perbedaan” sebenarnya adalah riwayat pengembangan ekstensi MySQL di PHP itu sendiri. Tapi mana yang benar, mana yang "lebih baik", dan mana yang harus Anda gunakan?
ⓘ Saya telah menyertakan file zip dengan semua kode sumber di awal tutorial ini, jadi Anda tidak perlu menyalin-tempel semuanya… Atau jika Anda hanya ingin langsung masuk
DAFTAR ISI
UNDUH & CATATAN
Pertama, berikut adalah tautan unduhan ke contoh kode sumber seperti yang dijanjikan
CATATAN CEPAT
- Harap pastikan bahwa masing-masing extension=mysql, extension=mysqli, atau extension=pdo_mysql diaktifkan di php.ini
- Buat basis data pengujian dan impor 0-dummy.sql
- 1-mysql.php, <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 0, dan <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 1 akan menunjukkan masing-masing contoh dari setiap ekstensi. Ingatlah untuk mengubah pengaturan basis data di skrip
DOWNLOAD KODE CONTOH
Klik di sini untuk mengunduh kode sumber, saya telah merilisnya di bawah lisensi MIT, jadi silakan membangun di atasnya atau menggunakannya dalam proyek Anda sendiri
EKSTENSI PHP MYSQL
Baiklah, sekarang mari kita masuk ke contoh penggunaan setiap ekstensi database MySQL. Juga, tes "non-profesional non-ilmiah" sederhana untuk melihat mana yang berkinerja terbaik
PRELUDE) DATABASE DUMMY
0-boneka. sql
Jika Anda tertarik untuk menjalankan “non-conclusive performance test”, berikut tabel dummy yang kami gunakan, unduh file zip di atas
BAGIAN 1) EKSTENSI MYSQL LEGACY
1-mysql. php
<?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken";Sekarang, ekstensi MySQL (asli) telah dihapus total di PHP 7. Karena itu, saya akan meninggalkan ini di sini sebagai contoh bagi orang-orang yang mungkin perlu mendukung sistem lama. Jika tidak, tolong jangan gunakan ekstensi usang ini lagi
BAGIAN 2) EKSTENSI MYSQLI
2-mysqli. php
<?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) ATTEMPT DATABASE CONNECTION $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if ($mysqli->connect_error) { exit($mysqli->connect_error); } $mysqli->set_charset(DB_CHARSET); // (C) SELECT USERS $result = $mysqli->query("SELECT * FROM `users`"); while ($row = $result->fetch_assoc()) { print_r($row); } $result->close(); $mysqli->close(); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken";_Itu benar, ini hampir sama dengan MySQL tradisional, satu-satunya perbedaan adalah kami menggunakan <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 2 sebagai gantinya. Untuk penggunaannya, telusuri saja skripnya, sesederhana mungkin
BAGIAN 3) PERPANJANGAN PDO
3-pdo. php
<?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) ATTEMPT DATABASE CONNECTION $pdo = new PDO( "mysql:host=". DB_HOST .";dbname=". DB_NAME .";charset=". DB_CHARSET, DB_USER, DB_PASSWORD, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); // (C) SELECT USERS $stmt = $pdo->prepare("SELECT * FROM `users`"); $stmt->execute(); while ($row = $stmt->fetch()) { print_r($row); } if ($stmt !== null) { $stmt = null; } if ($pdo !== null) { $pdo = null; } // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; _Sekarang, contoh PDO ini juga harus sangat mudah. Tetapi keindahan PDO sebenarnya terletak pada kompatibilitasnya dengan berbagai macam database – Artinya, ekstensi ini berfungsi dengan banyak database lain selain MySQL. Selain itu, ada banyak cara cerdas untuk mengambil entri menggunakan PDO – <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 3, <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 4, <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 5, dan bahkan mengatur bagaimana array disusun
BIT & LINK EKSTRA
Itu saja untuk panduan ini, dan ini adalah bagian kecil tentang beberapa tambahan dan tautan yang mungkin berguna bagi Anda
MANA YANG LEBIH BAIK"?
Untuk pengujian sederhana, saya menjalankan <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 0 dan <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 1 di server pengembangan saya, mengambil 100 pengguna 10 kali. Waktu rata-rata adalah sebagai berikut
- MySQLi – 0. 0096925020217896 detik
- PDO-0. 015011477470398 detik
Jadi ya, ada perbedaan kinerja sepersekian detik. Saya pribadi tidak akan mempermasalahkannya, tetapi jika Anda menyukai "tes kinerja profesional ilmiah" - Jangan ragu untuk merancang rangkaian tes Anda sendiri (dan beri tahu kami hasilnya)
MYSQL, MYSQLI, PDO – MANA YANG HARUS SAYA GUNAKAN?
Saya akan sangat merekomendasikan menggunakan PDO. Hanya karena dukungannya untuk berbagai basis data, dan abstraksi yang disediakannya. Kita hanya perlu mengaktifkan ekstensi PDO masing-masing di php.ini, dan proyek siap bekerja dengan database selain MySQL. Misalnya, “memutakhirkan” dari MySQL ke Oracle Database
REFERENSI dan LINK
- PDO-PHP
- MySQLi – PHP
- MySQL-PHP
- phpMyAdmin – Manajer basis data PHP gratis. Jika Anda menginstal paket XAMPP, itu sudah diinstal di <?php // (TEST) START TIME $taken = microtime(true); // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN! define("DB_HOST", "localhost"); define("DB_NAME", "test"); define("DB_CHARSET", "utf8"); define("DB_USER", "root"); define("DB_PASSWORD", ""); // (B) DATABASE CONNECTION $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD); if (!$mysql) { exit(mysql_error()); } mysql_select_db(DB_NAME, $mysql); mysql_set_charset(DB_CHARSET, $mysql); // (C) SELECT USERS $result = mysql_query("SELECT * FROM `users`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); } mysql_free_result($result); mysql_close($mysql); // (TEST) TOTAL TIME TAKEN $taken = microtime(true) - $taken; echo "Total time taken $taken"; 9
- MySQL Workbench – Apa yang disebut manajer database MySQL resmi oleh Oracle sendiri
TAMAT
Terima kasih telah membaca, dan kami telah sampai di akhir panduan ini. Saya harap ini membantu Anda dengan proyek Anda, dan jika Anda ingin berbagi apa pun dengan panduan ini, jangan ragu untuk berkomentar di bawah ini. Semoga berhasil dan selamat membuat kode