کسی از pdo چیزی میدونه ؟

ziXet

مدیر انجمن PHP/MYSQL
سلام
دوستان از http://php.net/manual/en/book.pdo.php چیزی میدونید ؟
pdo توی دیتابیس معمولا ساختار حدول رو از حالت RDBS یعنی Relational Database Structure خارج میکنه ولی این به این معنی نیست که کلا ساختار دیتابیس عوض میشه! نه! در حقیقت رابط کاربری با دیتابیس از این حالت خارج میشه و مثلا برای گرفتن یه کوئری نیازی نیست که کل کوئری رو بنویسی فقط باید با مدل داده ای جدول کار کنی
به طور حلاصه میشه گفت که یجورایی واسط کاربری رو از حالت عادی به حالت شی گرا میبره
اکثر فریم ورکهای php از pdo استفاده میکنن
 

amirepsilon

Active Member
جالبه!
احتمالا مشکل sql injection هم نخواهیم داشت!!!
حالا کار کردن باهاش چطوریه ؟
آیا نمونه های دیگه ای هم داریم که کار pdo رو انجام بدن ؟
 

Cyletech

Member
نه خب نمیشه گفت SQL Injection نداریم یعنی فکر نکنم. می گفتن نداریم ولی من بارها با هر تابعش مثل prepare->execute و query->execute امتحان کردم ولی مشکل سینگل کوت و دابل کوت همچنان برقرار بود. این این جمله ام درست باشه پس بازم باید دستی از injection ها جلوگیری کنیم.
 

eAmin

Well-Known Member
از این منبع گرفته شده:
Calling PDO::prepare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.
 

Cyletech

Member
من که گفتم دستی باید اینکارو کرد ;) البته بهتره وقتی از prepare استفاده می کنیم ، بجای اینکه مستقیم متغیر هارو در کوئری وارد کنیم ، اونها رو در bindParam ببریم و بعد در کوئری بطور دیگه استفاده کنیم. مثل زیر:
PHP:
$query = $command->prepare("SELECT * FROM `table` WHERE `username` = :username");
$query->bindParam(":username",$value);
$query->execute();
 

eAmin

Well-Known Member
احتمالا مشکل sql injection هم نخواهیم داشت!!!
من که گفتم دستی باید اینکارو کرد ;)
احتمالا منظور این دوستمون استفاده از Stored Procedure در دیتابیس بوده که این حرف رو گفتن... بله اگر از SP ها استفاده کنید نیازی نیست ولی در غیر اینصورت باید دستی اینکار رو کرد. :wink:
 

Domanjiri

Well-Known Member
سلام
حالا کار کردن باهاش چطوریه ؟
why-you-should-be-using-phps-pdo-for-database-access

احتمالا مشکل sql injection هم نخواهیم داشت!!!
اینو Cyletech خوب توضیح داد( استفاده از Place Holder ها )، در ضمن توی لینک بالا هم یه جایی داخل کادر نوشته که Using prepared statements will help protect you from SQL injection اون قسمت رو مطالعه کن.
آیا نمونه های دیگه ای هم داریم که کار pdo رو انجام بدن ؟

Mysqli ,پکیج MDB2 از PEAR ،نسخه پی اچ پی ADO و الخ..

شاد باشی
 
آخرین ویرایش:

Cyletech

Member
فراموش کردم بگم ، چون link identifier برای mysql_connect باید حتماً کانکشن mysql باشه نمیتونی از تابع mysql_real_escape_string استفاده کنی. بجاش از quote() در PDO استفاده کن. مثل زیر:
PHP:
$command = new PDO //...
$command->quote($variable);
 

amirepsilon

Active Member
سلام

1. الخ که دوستمون گفت یعنی چی ؟ :green:

2. خیلی رفتید جلو دوستان! من هنوز اول کارم. چطور شروع کنم ؟
 

Cyletech

Member
2. خیلی رفتید جلو دوستان! من هنوز اول کارم. چطور شروع کنم ؟
اگر خیلی نیاز ندارید میتونید از mysqli شروع کنید ولی خب برای یک پروژه خوب و پر مخاطب بهتره از اول کار از بهترین ها شروع کنی.
برای شروع با PDO باید اول یک شیء ازش بسازی. به این صورت:
PHP:
$command = new PDO('mysql:host=localhost;dbname=dbname','username','password');
بعد هرکجا که خواستی اول باید از این شیء استفاده کنی. (فرض می کنم برنامه نویسی شیءگرا رو بلد هستی)...
PHP:
$query = $command->prepare(/*...*/);
از همون لینکی که در اولین پست خودت دادی استفاده کن و توابعش رو بشناس. درضمن بیشتر هم مطالعه کن.
 
آخرین ویرایش:

amirepsilon

Active Member
سلام و تشکر از دوستان
من مطالعاتی داشتم اما چیزی که فهمیدم اینه که ظاهرا برای یک کوئری گرفتن چند راه وجود داره
مثلا
prepare
query
exec
execute
فرق اینها چیه؟ امن ترین راه کدومه ؟
 

Cyletech

Member
من مطالعاتی داشتم اما چیزی که فهمیدم اینه که ظاهرا برای یک کوئری گرفتن چند راه وجود داره
هر کدوم خاصیت خودش رو داره. بهتره منوال خودشون رو مطالعه کنی
prepare کوئری رو آماده می کنه. فرضاً برای آماده سازی بعد از این دستور میشه از bindParam هم استفاده کرد تا کوئری تمییز تر و امن تر ارسال بشه.
query خودش کوئری رو اجرا می کنه بدون هیچ دستور اضافی مثل execute.
exec رو نمیدونم اما احتمالاً همون execute هست که کار مشابهی رو انجام میدن با این تفاوت که exec برای PDO هست و execute واسه PDOStatement . یعنی توی منوالش که اینطوری تقسیم بندی کرده. خودم هنوز وقت نکردم برم تفاوتشون رو ببینم. تونستی بخون به منم بگو. مرسی
 

Cyletech

Member
راستی همین تفاوت PDOStatement و PDO رو هم نفهمیدم !
PDO: یه کلاس هست واسه ارتباط php با دیتابیس.
PDOStatement : یک کلاس هست اینم ولی واسه اجرا و آماده سازی دستورات (کوئری ها).

http://www.php.net/manual/en/class.pdostatement.php
http://www.php.net/manual/en/class.pdo.php
حالا که اومدم خونه خودم تونستم برم منوالو ببینم. exec مربوط به کلاس PDO میشه.فرق دیگه exec با execute در اینه که exec دستورات SQL رو اجرا می کنه و تعداد ستون هایی که تحت تأثیرش قرار گرفتن رو بر می گردونه. ولی execute کوئری prepare شده رو اجرا می کنه.
http://www.php.net/manual/en/pdostatement.execute.php
http://www.php.net/manual/en/pdo.exec.php
 

جدیدترین ارسال ها

بالا