PDA

View Full Version : مقاله: مقایسهPDO و Mysqli در PHP



reza_alie
جمعه 22 خرداد 1394, 20:21 عصر
مانی که میخواهیم در php به دیتابیس دسترسی داشته باشیم دو انتخاب داریم : MySqli و PDO . میدانید کدام یک را باید انتخاب کنید؟ در این مقاله به بررسی تفاوت ها ، پایداری ، پشتیبانی از دیتابیس های مختلف و … در PDO و MySqli میپردازیم.

اتصال به بانک اطلاعاتی
در PDO و MySqli اتصال به دیتابیس به راحتی امکان پذیر است :


<?php
// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');

// mysqli, procedural way
$mysqli = mysqli_connect('localhost','username','password',' database');

// mysqli, object oriented way
$mysqli = new mysqli('localhost','username','password','database ');
?>



در MySqli استفاده از توابع هم به صورت “روالی” (procedural) و هم به صورت شیء گرا امکان پذیر است. اگر به توابع پیش فرض mysql در php آشنایی دارید استفاده از mysqli به صورت رویه ای برای شما بهتر و راحت تر است. اما اگر به شیء گرایی مسلط هستید، می توانید از هر دو استفاده نمایید.
پشتیبانی از بانک های اطلاعاتی
یکی از فواید استفاده از PDO نسبت به Mysqli تعداد دیتابیس هایی است که پشتیبانی میکنند. PDO از ۱۲ نوع دیتابیس مختلف پشتیبانی میکند، در حالی که MySqli فقط از mysql پشتیبانی می نماید.
برای دیدن نام دیتابیس های پشتیبانی شده در PDO میتونید از دستور زیر استفاده کنید :


var_dump(PDO::getAvailableDrivers());


هنگامی که در یک پروژه بخواهید از یک دیتابیس به دیتابیس دیگری مهاجرت کنید، PDO این کار را به راحتی برایتان مقدور می سازد. تمام کاری که باید انجام دهید ، این است که نوع اتصال و query هایی که باید در دیتابیس جدید پشتیبانی شوند را تغییر دهید.اما با mySqli باید تمام کدها و کوئری ها تغییر نماید.

Named Parameters
این قابلیت نیز یکی دیگر از فواید استفاده از PDO نسبت به MySqli است که به طور قابل ملاحظه ای کار را ساده تر مینماید :


<?php
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);

$pdo->prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login > :last_login');

$pdo->execute($params);
?>


به روشی گفته میشود که درکد بالا استفاده شده است. این روش خوانایی برنامه را به مراتب بالا می برد؛ در مقابل MySqli از Named Parameters پشتیبانی نمی نماید :


<?php
$query = $mysqli->prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login > ?');

$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();
?>


هم PDO و هم MySqli از Object mapping پشتیبانی میکنند به این معنی که اگر شما نمیخواهید از یک DAL (Database Abstraction layer) استفاده کنید اما میخواهید رفتاری شبیه به یک ORM داشته باشید ،میتوانید از یکی از این دو استفاده کنید. تصور کنید که یک کلاس به اسم User داریم با تعدادی properties که همنام با فیلدهای جدول User هستند :


<?php
class User {
public $id;
public $first_name;
public $last_name;

public function info()
{
return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
}
}
?>


بدون Object Mapping قبل از استفاده از متد info باید به property های کلاس مقدار دهی نماییم ( یا به صورت دستی یا به وسیله constructor) . این قابلیت اجازه میدهد که قبل از ساخت شی، property ها مقدار دهی شوند :


<?php
$query = "SELECT id, first_name, last_name FROM users";

// PDO
$result = $pdo->query($query);
$result->setFetchMode(PDO::FETCH_CLASS, 'User');

while ($user = $result->fetch()) {
echo $user->info()."n";
}
// MySQLI, procedural way
if ($result = mysqli_query($mysqli, $query)) {
while ($user = mysqli_fetch_object($result, 'User')) {
echo $user->info()."n";
}
}
// MySQLi, object oriented way
if ($result = $mysqli->query($query)) {
while ($user = $result->fetch_object('User')) {
echo $user->info()."n";
}
}
?>


امنیت
یک از روشهای هک سایت استفاده از Sql Injection است که هکر با قرار دادن کدهای sql در مقادیر ارسالی به سایت سعی میکند به سایت حمله نماید. این راه معمولا از طریق آدرسهایی انجام میشود که از متد GET برای ارسال مقادیر به سرور استفاده میکنند :
http://domain.com/index.php?username=phpro; DELETE FROM users;
اگر ما بدون escape کردن متغیر $_GET[‘username’] از آن استفاده نماییم ، دستور DELETE هم در دیتابیس اجرا خواهد شد :


<?php
// PDO, "manual" escaping
$username = PDO::quote($_GET['username']);

$pdo->query("SELECT * FROM users WHERE username = $username");

// mysqli, "manual" escaping
$username = mysqli_real_escape_string($_GET['username']);

$mysqli->query("SELECT * FROM users WHERE username = '$username'");
?>



PDO::quote در واقع رشته ورودی رو escape نمیکند ، بلکه فقط quote میکند (بین دو ‘ ‘ قرار میدهد) . اما درمقابل mysqli_real_escap_string یک رشته امن برای دیتابیس میسازد:


<?php
// PDO, prepared statement
$pdo->prepare('SELECT * FROM users WHERE username = :username');
$pdo->execute(array(':username' => $_GET['username']));

// mysqli, prepared statements
$query = $mysqli->prepare('SELECT * FROM users WHERE username = ?');
$query->bind_param('s', $_GET['username']);
$query->execute();
?>


پیشنهاد میکنیم همیشه برای اجرای query ها و به جای quote و mysqli_real_escape_string از دستور prepare استفاده کنید.

کارآیی و سرعت عملکرد
PDO و Mysqli هر دو از سرعت و کارایی بالای برخوردار هستند. در benchmark این دو ، Mysqli مقداری سریعتر از PDO کارها را اجرایی می نماید. اما توابع داخلی mysql از سرعت بسیار بیشتری برخوردار هستند.

نتیجه گیری
بدون شک PDO با پشتیبانی از ۱۲ نوع دیتابیس مختلف ، پشتیبانی از Named Parameters ، و چشم پوشی از مقدار کمی عقب ماندگی در سرعت نسبت به MySqli برنده این مسابقه است.در مورد امنیت هم که دیدیم تا زمانی که شما از prepare استفاده کنید هر دو ، عملکرد قابل پذیرشی دارند.



موفق باشین

منبع:http://tinyurl.com/n9gty4c

MohammadReza1994
جمعه 22 خرداد 1394, 22:30 عصر
از نظر من چیزایی که گفتید قابل قبول نیست، چون: ۱.pdo یه اینترفیسه مثل jdbc ولی mysql یا mysqli یه سری توابع و کلاسه و مقایسشون بی معنیه مگر در مورد فقط پایگاه داده mysql. ۲.از نظر عملکرد قطعا توابع mysqli بهتره چون بهینه شده هستش و فقط یه رابط مثل pdo نیست. ۳.در مورد عوض شدن پایگاه داده، اگر از یه کلاس پایه پایگاه داده استفاده کنیم، اگر زمانی خواستیم مثلا از مای اس کیو ال به اوراکل مهاجرت کنیم کافیه فقط کد درون متد های کلاس پایه عوض بشه همین ۴. دوباره میگم این دوتا قابل مقایسه نیستن، اگر تو سایتای انگلیسی زبان مقایسه ای میبینید فقط در مورد پایگاه داده mysql مطلق هستش نه مسئله یا چالش دیگه.

reza_alie
جمعه 22 خرداد 1394, 22:54 عصر
نظر شما محترمه