چگونه هنگام Insert با PDO باید Prepare و Bind کنیم؟

با فرض اینکه طبق پُست‌های گذشته، اتصال PDO صحیح باشد، نحوه‌ی عادی افزودن یک رکورد به جدول مربوطه در دیتابیس:

$sql = "INSERT INTO firsttable(name,family,phone,score) VALUES('Ehsan','Razavi','09120000000','93')";
$handler->query($sql);

اطلاعات ورودی می‌توانند از فرم یا طُرق مختلف گرفته شوند که در مثال زیر هم حالت ساده و هم حالتی که از فرم گرفته شده را به صورت کامنت قرار داده‌ام:

$name = 'Ehsan';//$_POST['name']
$family = 'Razavi';//$_POST['family']
$phone = '09120000000';//$_POST['phone']
$score = '93';//$_POST['score']

$sql = "INSERT INTO firsttable(name,family,phone,score) VALUES('$name','$family','$phone','$score')";
$handler->query($sql);

اما روش‌های فوق امن نیستند. برای اینکه کدهایمان را کمی امن‌تر کنیم، در مثال زیر اقدام به Bind کردن یا اصطلاحاً محدود کردن ورودی‌ها می‎کنم:

$name = 'Ehsan';//$_POST['name']
$family = 'Razavi';//$_POST['family']
$phone = '09120000000';//$_POST['phone']
$score = '93';//$_POST['score']

$sql = "INSERT INTO firsttable(name,family,phone,score) VALUES(:name,:family,:phone,:score)";

$query = $handler->prepare($sql);

$query->execute([
	':name' => $name,
	':family' => $family,
	':phone' => $phone,
	':score' => $score
]);

در مثال فوق، برای Bind کردن علاوه بر قرار دادن : در قسمت ورودی‌های دستور sql، از تابع prepare به جای تابع query استفاده کردم. ولی این به تنهایی کافی نیست و برای کامل بودن فرآیند Bind لازم است من مقادیری را به داخل کد sql وارد کنم تا Bind به درستی صورت گیرد. پس از تابع execute استفاده کرده‌ام و مقادیر مورد نظرم را به صورت یک آرایه به کد sql خود پاس داده‌ام. (در این حالت چون از آرایه استفاده کرده‌ام و کلید هر آرایه مشخص است، ترتیب مهم نخواهد بود و هر مقداری که پاس داده می‌شود به صورت صحیح در جای خود قرار می‌گیرد.)

اما در حالت و مثال زیر، ترتیب مقادیری که با تابع execute پاس می‌دهیم مهم خواهند بود، چون باید به درستی و به ترتیب در ? مربوطه قرار گیرند:

$name = 'Ehsan';//$_POST['name']
$family = 'Razavi';//$_POST['family']
$phone = '09120000000';//$_POST['phone']
$score = '93';//$_POST['score']

$sql = "INSERT INTO firsttable(name,family,phone,score) VALUES(?,?,?,?)";

$query = $handler->prepare($sql);

$query->execute([$name,$family,$phone,$score]);

درباره نویسنده: احسان

مطالب زیر را حتما بخوانید