Prepared Statements( متد prepare )
تا اینجا اکثر توضیحات جایگزینی برای توابع mysql بود و با توضیحات بالا تقریبا میتوانید توابع را جایگزین کنید
اما دست نگه دارید !
امکان جدیدی اضافه شده است !
Prepared Statements !
با استفاده از این امکان میتوانید سرعت را افزایش دهید ، امنیت کد های خود را بالا ببرید
یکی از کابرد های Prepared Statements این هست که شما میتوانید با استفاده از اون چندین دستور مشابه با ارسال تنها متغیر اجرا کنید،
فرض کنید میخواهید در دیتابیس 2 ردیف ذخیره کنید ، اگر به روش قبلی بخواهید اینکارو انجام بدید باید 2 بار کوئری مشابه بنویسید که تنها مقادیر فیلد ها عوض خواهد شد
اما با Prepared Statements میتوانید یک کوئری بنویسید و مقداری فیلد ها را جداگانه به دیتابیس ارسال کنید
در Prepared Statements شما به جای مقادیر یک مکان قرار میدهید
جایگزین میتواند با نام باشد یا بدون نام
مکان بدون نام
در این روش شما به جای مقدار تنها علامت سوال ( ؟ ) قرار میدهید
برای مثال
کد PHP:$query = "SELECT * FROM `users` WHERE username = ?";
$result = $db->prepare($query);
مکان با نام
در این روش شما به جای مقدار تنها نامی برای ان مکان انتخاب میکنید ( دقت کنید نام با : شروع می شود )
برای مثال
کد PHP:$query = "SELECT * FROM `users` WHERE username = :username"; // :username
$result = $db->prepare($query);
مقدار دهی به مکان با متد bindParam از PDOStatement
در هردو روش مکان دهی بعد از اجرای متد prepare خروجی همانطور که ذکر شد شی PDOStatement هست
این شئ متدی به نام bindParam دارد که با کمک ان میتوان مقدار مکان ها را مشخص کرد
برای مثال
در روش بدون نام
ورودی اول شماره مکان است
کد PHP:$result->bindParam(1, $_POST['username']);
در روش با نام
ورودی اول نام مکان است
کد PHP:$result->bindParam(':username', $_POST['username']);
دقت کنید برای تاکید ورودی را از متغیر POST دادم ( که کاربر وارد میکنه ) که بیان کنم این روش کاملا در برابر تزریق کد امن هست
اجرای Prepared Statement
برای اجرای کوئری بعد از مقدار دهی به مکان ها با استفاده از متد execute در PDOStatement دستور را اجرا میکنیم
مثال
کد PHP:$result->execute();
print_r($result->fetchAll);
روش کوتاه برای مقدار دهی مکان ها با تابع execute
مثلا استفاده از تابع bindParam برای تک تک مکان ها کاری سخت هست
روش سریع تری برای اینکار وجود دارد
برای این روش مقداری را به صورت ارایه به متد execute ارسال کنید
در روش بدون نام ارایه بدون اندیس یا با اندیس شماره ها می باشد
در روش با نام اندیس باید نام مکان باشد ( بدون : )
مثال بدون نام
مثال با نامکد PHP:$query = "SELECT * FROM `users` WHERE username = ? AND password = ?";
$result = $db->prepare($query);
$result->execute(array($username,$password));
کد PHP:$query = "SELECT * FROM `users` WHERE username = :username AND password = :password";
$result = $db->prepare($query);
$result->execute(array('username'=>$username,'password'=>$password));
اجرای چند کوئری مشابه با یک کوئری
با استفاده از این امکان میتوانید در سرعت و حجم کد ها تغییر ایجاد کنید
برای اینکار کافی هست ابتدا مکان ها را ست کنید و بعد از اجرای execute مکان های جدید قرار دهید و دوباره دستور execute را اجرا کنید
مثال
کد PHP:$query = "INSERT INTO `users` (`username`,`password`) VALUES (:username,:password)";
$result = $db->prepare($query);
$result->execute(array('username'=>'test','password'=>'test')); // ساخت یوزر جدید
$result->execute(array('username'=>'admin','password'=>'admin')); // ساخت یوزر دیگر با همان دستور





پاسخ با نقل قول