<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>آموزش وب و لینوکس و همه چیز در این حول و حوش &#187; mysqli</title>
	<atom:link href="/tag/mysqli/feed/" rel="self" type="application/rss+xml" />
	<link>http://tuts.zanjanlug.org</link>
	<description>آموزش برنامه نویسی وب،لینوکس و همه چیز در این حول و حوش</description>
	<lastBuildDate>Thu, 13 Jun 2013 02:21:10 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>PDO یا MySQLi یک انتخاب ساده</title>
		<link>http://tuts.zanjanlug.org/pdo-%db%8c%d8%a7-mysqli-%db%8c%da%a9-%d8%a7%d9%86%d8%aa%d8%ae%d8%a7%d8%a8-%d8%b3%d8%a7%d8%af%d9%87/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pdo-%25db%258c%25d8%25a7-mysqli-%25db%258c%25da%25a9-%25d8%25a7%25d9%2586%25d8%25aa%25d8%25ae%25d8%25a7%25d8%25a8-%25d8%25b3%25d8%25a7%25d8%25af%25d9%2587</link>
		<comments>http://tuts.zanjanlug.org/pdo-%db%8c%d8%a7-mysqli-%db%8c%da%a9-%d8%a7%d9%86%d8%aa%d8%ae%d8%a7%d8%a8-%d8%b3%d8%a7%d8%af%d9%87/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 11:20:00 +0000</pubDate>
		<dc:creator>chalist</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[مای اسکیو ال]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysqli]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[آموزش]]></category>
		<category><![CDATA[دیتابیس]]></category>
		<category><![CDATA[پایگاه داده]]></category>
		<category><![CDATA[پی دی او]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1160</guid>
		<description><![CDATA[برای کار با یه دیتابیس در پی اچ پی شما می تونید انتخاب های گوناگونی داشته باشید. اما دوتا از بهترین ها در این زمینه PDO و MySQLi هستند که در این بخش قصد داریم مقایسه ی مختصری داشته باشیم &#8230; <a href="/pdo-%db%8c%d8%a7-mysqli-%db%8c%da%a9-%d8%a7%d9%86%d8%aa%d8%ae%d8%a7%d8%a8-%d8%b3%d8%a7%d8%af%d9%87/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.phpdevelopers.ir/wp-content/uploads/2012/02/pdo-mysqli.png"><img class="alignright size-full wp-image-1161" title="pdo vs. mysqli" src="http://www.phpdevelopers.ir/wp-content/uploads/2012/02/pdo-mysqli.png" alt="pdo vs. mysqli" width="150" height="150" /></a>برای کار با یه دیتابیس در پی اچ پی شما می تونید انتخاب های گوناگونی داشته باشید. اما دوتا از بهترین ها در این زمینه <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> و <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> هستند که در این بخش قصد داریم مقایسه ی مختصری داشته باشیم بین این دو کتابخانه. شما کدوم رو انتخاب کردید؟ آیا می دونید که هر کدوم چه ویژگی هایی دارن؟ برای بررسی این دو کلاس می تونید این بحث رو تا انتها بخونید و نظراتتون رو بگید.<span id="more-1160"></span></p>
<p>برای دسترسی به دیتابیس در php دو راه خوب هست : <a href="http://php.net/manual/en/book.pdo.php">PDO </a> و <a href="http://php.net/manual/en/book.mysqli.php">MySQLi</a>. اما هر کدوم از این دو کتابخانه ویژگی هایی دارن که آشنایی باهاشون باعث می شه انتخاب بهتری داشته باشید.</p>
<p>توضیحات کلی:</p>
<table>
<thead>
<tr>
<td></td>
<td><strong>PDO</strong></td>
<td><strong>MySQLi</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>پشتیبانی از دیتابیس ها</strong></td>
<td>۱۲ موتور مختلف</td>
<td>MySQL فقط</td>
</tr>
<tr>
<td><strong>API</strong></td>
<td>شی گرا</td>
<td>شی گرا + معمولی</td>
</tr>
<tr>
<td><strong>برقراری ارتباط</strong></td>
<td>آسان</td>
<td>آسان</td>
</tr>
<tr>
<td><strong>پارامترهای نامگذاری شده</strong></td>
<td>بله</td>
<td>خیر</td>
</tr>
<tr>
<td><strong>پشتیبانی از آبجکت</strong></td>
<td>بله</td>
<td>بله</td>
</tr>
<tr>
<td><strong>عبارات فراهم شده<br />
(برای کاربر)</strong></td>
<td>بله</td>
<td>نه</td>
</tr>
<tr>
<td><strong>کارایی</strong></td>
<td>سریع</td>
<td>سریع</td>
</tr>
<tr>
<td><strong>پشتیبانی از استورد پروسیجر ها</strong></td>
<td>بله</td>
<td>بله</td>
</tr>
</tbody>
</table>
<h2>اتصال :</h2>
<hr />
روش اتصال به پایگاه داده در هر دوی این کتابخانه ها ساده ست. می تونید به این روش عمل کنید:</p>
<pre class="brush: php; title: ; notranslate">
// PDO
$pdo = new PDO(&quot;mysql:host=localhost;dbname=database&quot;, 'username', 'password');
 
// mysqli, روش معمول
$mysqli = mysqli_connect('localhost','username','password','database');
 
// mysqli, روش شی گرا
$mysqli = new mysqli('localhost','username','password','database');
</pre>
<h2>پشتیبانی از API ها:</h2>
<hr />
هر دوی این کتابخانه ها از شی گرایی پشتیبانی می کنن اما <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> علاوه بر پشتیبانی از شی گرایی، اجازه برنامه نویسی به روش معمولی رو هم میده. این یکی از مزایای <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> هستش که به برنامه نویس های مبتدی اجازه می ده سریع تر به سمتش برن اما از طرف دیگه اگر شما در کار با <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> کمی حرفه ای بشید می تونید از تمام دیتابیس های موجود استفاده کنید که خوب این براتون خیلی می تونه مفید باشه.</p>
<h2>پشتیبانی از دیتاتبیس ها:</h2>
<hr />
فکر این رو بکنید که شروع می کنید به کار با MySQL و پس از اتمام برنامه تون کارفرما می خواد که از MSSQL استفاده کنه یا اینکه حجم دیتابیس تون بالا می ره و تصمیم می گیرید از oracle استفاده کنید. در این صورت آرزو می کردید که کاش با <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> کار کرده بودید <img src='/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  چون در این مورد <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> فقط از دیتابیس MySQL پشتیبانی می کنه ولی <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> از ۱۲ پایگاه داده ی متفاوت پشتیبانی می کنه و به راحتی می تونید بین اینها سوییچ کنید.<br />
لیست دیتابیس هایی که <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> پشتیبانی می کنه به شرح زیر می باشد :</p>
<ul>
<li>CUBRID </li>
<li>MS SQL Server </li>
<li>Firebird/Interbase </li>
<li>IBM </li>
<li>Informix </li>
<li>MySQL </li>
<li>MS SQL Server </li>
<li>Oracle </li>
<li>ODBC and DB2 </li>
<li>PostgreSQL </li>
<li>SQLite </li>
<li>4D </li>
</ul>
<p>خوب نظرتون چیه؟ <img src='/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>با استفاده از این کد می تونید لیست پایگاه داده هایی رو که <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> پشتیبانی می کنه ببینید:</p>
<pre class="brush: php; title: ; notranslate">
var_dump(PDO::getAvailableDrivers());
</pre>
<h2>پشتیبانی از پارامترهای نامگذاری شده:</h2>
<hr />
این هم یکی از ویژگی های <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> هستش که از پارامترهای نام گذاری شده خیلی ساده تر از پارامترهای عددی میشه باهاش کار کرد. برای درک بهتر موضوع به این دوتکه کد دقت کنید:</p>
<pre class="brush: php; title: ; notranslate">
//pdo
$params = array(':username' =&gt; 'test', ':email' =&gt; $mail, ':last_login' =&gt; time() - 3600);
 
$pdo-&gt;prepare('
   SELECT * FROM users
   WHERE username = :username
   AND email = :email
   AND last_login &gt; :last_login');
 
$pdo-&gt;execute($params);
</pre>
<pre class="brush: php; title: ; notranslate">
//MySQLi
$query = $mysqli-&gt;prepare('
   SELECT * FROM users
   WHERE username = ?
   AND email = ?
   AND last_login &gt; ?');
 
$query-&gt;bind_param('sss', 'test', $mail, time() - 3600);
$query-&gt;execute();
</pre>
<p>شاید کدها در <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> کمی کوتاه تر و ساده تر به نظر بیان ولی وقتی به پارامترها دقت کنید می بینید که در <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a>شما می تونید پارامترها رو نامگذاری کنید. گاهی در حین کار برنامه نویس با بزرگ تر شدن برنامه اش کمی گیج می شه و این پارامترهای نامگذاری شده می تونن توی درک بهتر کد و خوانایی شون اهمیت ویژه ای داشته باشن.<br />
ولی متاسفانه <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> این ویژگی رو نداره و ازش پشتیبانی نمی کنه.</p>
<h2>پشتیبانی از آبجکت ها:</h2>
<hr />
هر دوی این کتابخانه ها از آبجکت ها پشتیبانی می کنن و می تونن پس از درخواست نتیجه رو به صورت آبجکت برگردونن. اما این کجا و آن کجا <img src='/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
فرض کنید یه جدول تو پایگاه داده داریم با نام user و فیلدهای خودش. به این کد دقت کنید:</p>
<pre class="brush: php; title: ; notranslate">
class User {
   public $id;
   public $first_name;
   public $last_name;
 
   public function info()
   {
      return '#'.$this-&gt;id.': '.$this-&gt;first_name.' '.$this-&gt;last_name;
   }
}
</pre>
<p>بدون استفاده از این ویژگی شما باید قبل از استفاده از () info مقدار تمامی فیلدها رو شخصن تعیین کنید. اما با استفاده از این روش شما می تونید مقادیر موردنظرتون رو از پیش تعریف کنید قبل از اینکه هنوز آبجکتی ساخته شده باشه. برای نمونه به این کد توجه کنید:</p>
<pre class="brush: php; title: ; notranslate">
$query = &quot;SELECT id, first_name, last_name FROM users&quot;;
 
// PDO
$result = $pdo-&gt;query($query);
$result-&gt;setFetchMode(PDO::FETCH_CLASS, 'User');
 
while ($user = $result-&gt;fetch()) {
   echo $user-&gt;info().&quot;n&quot;;
}
// MySQLI, روش معمولی
if ($result = mysqli_query($mysqli, $query)) {
   while ($user = mysqli_fetch_object($result, 'User')) {
      echo $user-&gt;info().&quot;n&quot;;
   }
}
// MySQLi, روش شی گرا
if ($result = $mysqli-&gt;query($query)) {
   while ($user = $result-&gt;fetch_object('User')) {
      echo $user-&gt;info().&quot;n&quot;;
   }
}
</pre>
<h2>امنیت:</h2>
<hr />
<blockquote><p>هر دوی این کتابخانه ها به صورت پیش فرض از حملات SQL injection جلوگیری می کنند. توابعی دارن که می تونید با استفاده از اونا ورودی هاتون رو پاک سازی کنید. یا بر اساس مقادیر از پیش تعریف شده چک کنید.</p></blockquote>
<p>یه مثال ساده از این روش. آقای هکر می خواد از طریق نام کاربری و از طریق درخواست HTTP دیتابیس ما رو هک کنه. کد ما این میشه:</p>
<pre class="brush: php; title: ; notranslate">
$query = &quot;SEL$_GET['username'] = &quot;'; DELETE FROM users; /*&quot;
</pre>
<p>اگر ما ورودی رو چک و پاکسازی نکنیم آقای هکر عزیز مثلن می تونه تمامی یوزرهای مارو پاک کنه (البته هر دوی این کتابخونه ها کوئری های چنگانه (multiple query) رو پشتیبانی می کنن)</p>
<pre class="brush: php; title: ; notranslate">
// PDO, پاکسازی دستی
$username = PDO::quote($_GET['username']);
 
$pdo-&gt;query(&quot;SELECT * FROM users WHERE username = $username&quot;);
 
// mysqli, پاکسازی دستی
$username = mysqli_real_escape_string($_GET['username']);
 
$mysqli-&gt;query(&quot;SELECT * FROM users WHERE username = '$username'&quot;);
</pre>
<p>همونطوری که می بینید ()PDO::quote علاوه بر پاکسازی ورودی ها اونها رو داخل کوتیشن هم میگذاره. اما () mysqli_real_escape_string فقط رشته رو پاکسازی می کنه و خودتون به صورت دستی باید اون رو داخل کوتیشن بزارید.</p>
<pre class="brush: php; title: ; notranslate">
// PDO
$pdo-&gt;prepare('SELECT * FROM users WHERE username = :username');
$pdo-&gt;execute(array(':username' =&gt; $_GET['username']));
 
// mysqli
$query = $mysqli-&gt;prepare('SELECT * FROM users WHERE username = ?');
$query-&gt;bind_param('s', $_GET['username']);
$query-&gt;execute();
</pre>
<blockquote><p>
ما توصیه می کنیم که همیشه از عبارات آماده در کنار() PDO::quote  و () mysqli_real_escape_string استفاده کنید (کار از محکم کاری عیب نمی کنه <img src='/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )
</p></blockquote>
<h2>کارآیی (Performance) :</h2>
<hr />
هر دوی این کتابخونه ها سریع هستند و از این نظر مشکلی ندارید. <a href="http://php.net/manual/en/book.mysqli.php" target="_blank">MySQLi </a> در استفاده معمولی (بدون عبارات تعیین شده) سریع تره (~۲٫۵%) و در حالت استفاده با عبارات تعیین شده یه مقدار سرعتش کم تر می شه (~۶٫۵%) اما کتابخونه ی خود MySQL از هر دوی اینها سریع تره اما خوب مشکلات خودش رو هم داره. اگر اصرار خیلی زیادی روی سرعت دارید و نمی تونید ازش بگذرید این گزینه ای هستش که باید بهش فکر کنید و تصمیم بگیرید.</p>
<h2>نتیجه گیری:</h2>
<hr />
در نهایت <a href="http://php.net/manual/en/book.pdo.php" target="_blank">PDO </a> در این مسابقه به راحتی پیروز می شه <img src='/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  چرا؟ خوب یکیش به خاطر پشتیبانی از ۱۲ نوع دیتابیس و پارامترهای نامگذاری شده، ما میتونیم به سادگی از سرعت کمترش چشم پوشی کنیم و از لحاظ امنیت هم هر دوی این کتابخونه ها به اندازه ی کافی امن هستن ضمن اینکه برنامه نویس ها هم معمولن راه های خودشون رو دارن برای حفظ امنیت بیشتر. برای همین به همتون توصیه می کنم که PDO می تونه یه جایگزین بسیار خوب باشه به جای سایر کتابخونه ها. درموردش فکر کنید. برای اطلاعات بیشتر هم می تونید به <a href="http://php.net/manual/en/book.pdo.php" title="اینجا" target="_blank">سایت رسمی php </a> مراجعه کنید.<br />
امیدوارم به دردتون خورده باشه و در تصمیم گیری کمکتون کرده باشیم.<br />
موفق باشید</p>
<p>منبع : net.tutsplus.com</p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/pdo-%db%8c%d8%a7-mysqli-%db%8c%da%a9-%d8%a7%d9%86%d8%aa%d8%ae%d8%a7%d8%a8-%d8%b3%d8%a7%d8%af%d9%87/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->