Apa perbedaan antara mysql dan pdo?

Saya akan merekomendasikan menggunakan PDO dengan pernyataan yang sudah disiapkan. Ini adalah API yang dirancang dengan baik dan akan membuat Anda lebih mudah berpindah ke database lain (termasuk yang mendukung ODBC) jika perlu

————————————————————

Itu adalah perbedaan API untuk mengakses backend MySQL

  • mysql adalah API historis
  • mysqli adalah versi baru dari API historis, ia harus bekerja lebih baik dan memiliki serangkaian fungsi yang lebih baik, juga API berorientasi objek
  • PDO_MySQL, adalah MySQL untuk PDO, PDO telah diperkenalkan di PHP, proyek ini bertujuan untuk membuat API umum untuk semua akses basis data, jadi secara teori Anda harus dapat bermigrasi antar RDMS tanpa mengubah kode apa pun (jika Anda tidak

Jadi itu tergantung jenis kode apa yang ingin Anda hasilkan, jika Anda lebih suka lapisan berorientasi objek atau fungsi biasa…

Untuk mengakses database di PHP, kita punya dua pilihan. MySQLi (MySQL ditingkatkan) dan PDO (PHP Data Objects). Itu selalu baik untuk mengetahui tentang ini secara mendetail sebelum memilih satu

Perbedaan utama tercantum di sini

  1. Dukungan Basis Data
  2. Koneksi Basis Data
  3. Keamanan
  4. Pertunjukan

Dukungan Basis Data

Dukungan DatabasePDOMySQLiCubridMySQLFreeTDS / Microsoft SQL Server / SybaseFirebirdIBM DB2IBM Informix Dynamic ServerMySQLOracle Call InterfaceODBC v3 (IBM DB2, unixODBC dan win32 ODBC)PostgreSQLSQLite 3 dan SQLite 2Microsoft SQL Server / SQL Azure4D

Koneksi Basis Data

PDO
$pdo = new PDO("mysql:host=localhost.com;dbname=data", 'username', 'password');

Mysqli, gaya prosedural
$mysqli = mysqli_connect('localhost.com','username','password','data');

Mysqli, gaya berorientasi objek
$mysqli = new mysqli('localhost.in','username','password','data');

Keamanan

Baik PDO dan MySQLi menyediakan keamanan injeksi SQL, selama pengembang mengikutinya dengan fitur seperti pelolosan dan pengikatan parameter dengan pernyataan yang disiapkan
Misalnya, seorang peretas mencoba menyuntikkan beberapa SQL berbahaya melalui parameter kueri HTTP 'nama' (POST)
$_POST['name'] = "'; DELETE FROM users; /*"

Jika kita gagal melarikan diri, itu akan ditambahkan dalam kueri "sebagaimana adanya" itu akan menghapus semua baris dari tabel pengguna karena PDO dan MySQLi mendukung banyak kueri
// PDO, “manual” escaping
$name = PDO::quote($_POST['name']);
$pdo->query("SELECT * FROM users WHERE name = $name");
// mysqli, “manual” escaping
$name = mysqli_real_escape_string($_POST['name']);
$mysqli->query("SELECT * FROM users WHERE name = '$name'");
PDO::quote() not only escapes the string, but it also quotes it. But mysqli_real_escape_string() will only escape the string, you will need to apply the quotes manually.
// PDO, prepared statement
$pdo->prepare('SELECT * FROM users WHERE name = :name');
$pdo->execute(array(':name' => $_POST['name']));
// mysqli, prepared statements
$query = $mysqli->prepare('SELECT * FROM users WHERE name = ?');
$query->bind_param('s', $_POST['name']);
$query->execute();

Saya selalu menyarankan Anda untuk menggunakan pernyataan yang disiapkan dengan kueri terikat, bukan PDO. kutipan() dan mysqli_real_escape_string()

Pertunjukan

Baik PDO dan MySQLi cukup cepat. Untuk kueri SELECT, MySQLi sekitar 2. 5% lebih cepat untuk pernyataan yang tidak disiapkan dan sekitar 6. 5% lebih cepat untuk pernyataan yang disiapkan

Ringkasan

Dukungan PDOMySQLiDatabase12 driver berbedaMySQL onlyAPIOOPOOP + proseduralConnectionEasyEasyNamed parameterYesNoObject mappingYesYesPernyataan yang disiapkan
(sisi klien)YaTidakKinerjaCepatCepatSimpan prosedurYaYa

Akhirnya, MySqli asli untuk php dan bekerja sangat baik dengan MySql. Jadi, Anda dapat memilih Mysqli hanya jika Anda bekerja pada database Mysql dan tidak terbiasa dengan pernyataan PDO. Selalu disarankan untuk memilih PDO, karena mendukung dua belas driver database yang berbeda termasuk database Mysql. Sudut pandang kinerja Mysqli lebih baik dan sudut pandang keamanan, keduanya aman selama pengembang mengikuti pernyataan yang direkomendasikan

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", "utf8mb4");
    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", "utf8mb4");
    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 menampilkan masing-masing contoh dari setiap ekstensi. Ingatlah untuk mengubah pengaturan basis data di skrip
Jika Anda menemukan bug, jangan ragu untuk berkomentar di bawah ini. Saya mencoba menjawab pertanyaan singkat juga, tetapi itu adalah satu orang versus seluruh dunia… Jika Anda sangat membutuhkan jawaban, silakan periksa daftar situs web saya untuk mendapatkan bantuan dalam pemrograman

 

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

-- (A) USERS TABLE
CREATE TABLE `users` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
ALTER TABLE `users`
  ADD PRIMARY KEY (`id`);
 
ALTER TABLE `users`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
 
-- (B) DUMMY USERS
INSERT INTO `users` (`id`, `name`) VALUES
(1, 'Bevis'),
(2, 'Cally'),
(3, 'Harrison'),
...

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", "utf8mb4");
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", "utf8mb4");
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", "utf8mb4");
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", "utf8mb4");
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", "utf8mb4");
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", "utf8mb4");
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", "utf8mb4");
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

 

 

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", "utf8mb4");
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", "utf8mb4");
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

 

  • 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", "utf8mb4");
    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

Bisakah saya menggunakan PDO dengan MySQL?

Tidak seperti MySQLi, PDO hanya berorientasi objek dan mendukung sejumlah jenis database berbeda yang menggunakan PHP, seperti MySQL, MSSQL, Informix, dan PostgreSQL.

Apa kepanjangan dari PDO untuk MySQL?

PDO adalah singkatan dari PHP Data Objects . PDO adalah cara yang ramping dan konsisten untuk mengakses database. Ini berarti pengembang dapat menulis kode portabel lebih mudah. PDO bukan lapisan abstraksi seperti PearDB. PDO lebih seperti lapisan akses data yang menggunakan API terpadu (Application Programming Interface).

Haruskah saya menggunakan MySQLi atau PDO?

Keunggulan utama PDO dibandingkan MySQLi adalah dukungan database . PDO mendukung 12 jenis database berbeda, berlawanan dengan MySQLi, yang hanya mendukung MySQL. Saat Anda harus mengalihkan proyek Anda untuk menggunakan database lain, PDO membuat prosesnya lebih sederhana.

Mana yang lebih aman PDO atau 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.