Seyid Ahmed Khessam نشر 9 مايو 2022 أرسل تقرير نشر 9 مايو 2022 السلام عليكم ورحمة الله وبركاته لدي استفسار حول معرفة الفرق بين bindParam / bindValue / bindColumn في ال PDO PHP وشكرا 1 اقتباس
2 سامح أشرف نشر 9 مايو 2022 أرسل تقرير نشر 9 مايو 2022 التابع bindValue في PDO bindValue يستخدم لربط قيمة ما بما يقابلها في جملة SQL، فعلى سبيل المثال: <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', 150, PDO::PARAM_INT); $sth->bindValue(':colour', 'red', PDO::PARAM_STR); $sth->execute(); كما تلاحظ في المثال السابق فإن bindValue تستقبل ثلاث مدخلات، وهي اسم المعامل parameter المستخدم في جملة SQL (مثل calories: و colour:)، أما المدخل الثاني هو قيمة المعامل (مثل 150 و "red")، حيث سيتم تعويض هذه المعاملات بالقيم الخاصة بهم، بينما المدخل الثالث هو نوع نوع القيمة integer ، strgin ، boolean .. إلخ. ملاحظة: إضافة النقتين في بداية اسم المعامل (مثل calories: و colour:) أمر إختياري ويمكن عدم كتابته: $sth->bindValue('calories', 150, PDO::PARAM_INT); $sth->bindValue('colour', 'red', PDO::PARAM_STR); سوف يتم إستبدال أسماء المعاملات الموجودة في جملة SQL بقيمتها الممررة في bindValue ليصبح شكل جملة SQL كالتالي: SELECT name, colour, calories FROM fruit WHERE calories < 150 AND colour = "red"; كما يمكن إستخدام علامات إستفهام بدلًا من أسماء المعاملات بالشكل التالي: <?php /* يمكن تمرير أسماء متغيرات بلًا من القيم مباشرة*/ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindValue(1, $calories, PDO::PARAM_INT); /* علامة الإستفهم الأولى */ $sth->bindValue(2, $colour, PDO::PARAM_STR); /* علامة الإستفهم الثانية */ $sth->execute(); التابع bindParam في PDO التابع bindParam مشابه تمامًا للتابع bindValue، ويعمل بشكل مشابه، ولكن لا يمكن تمرير إليه قيمة مباشرة ويجب تمرير متغير، بالشكل التالي: <?php /* يجب أن يتم تمرير متغيرات وليس قيم مباشرة */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR); $sth->execute(); إذا لماذا أحتاج إلى إستعمال bindParam بدلًا من bindValue؟ السبب في ذلك هو كالتالي: تخيل أنك تريد تنفيذ جملة SQL معينة أكثر من مرة بقيم مختلفة، في حالة إستعمال bindValue ستحتاج إلى ربط القيم في كل مرة تتغير فيها القيم بشكل يدوي، بينما في حالة إستخدام bindParam يجب فقط تغير قيمة المتغيرات، مثال: إستخدام bindParam: <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindParam(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foobarbaz'; إستخدام bindValue: <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindValue(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foo'; لاحظ أنه عند تغير قيمة المتغير value$ في bindParam تم تغير شكل جملة SQL كذلك، بينما في bindValue لم يحدث ذلك. التابع bindColumn في PDO التابع bindColumn له إستخدام مختلف تمامًا عن bindValue و bindParam، فهو يستخدم بعد تنفيذ جملة SQL ، حيث يقوم بتخزين القيمة الموجودة في عمود معين في متغير جديد: <?php $stmt = $dbh->prepare('SELECT name, colour, calories FROM fruit'); $stmt->execute(); $stmt->bindColumn('name', $name); $stmt->bindColumn('colour', $colour); $stmt->bindColumn('calories', $calories); while ($stmt->fetch(PDO::FETCH_BOUND)) { print $name . "\t" . $colour . "\t" . $calories . "\n"; } عند عمل fetch سيتم جلب صف من قاعدة البيانات، وهذا الصف يحتوي على قيمة العمود name و colour و calories، ولكي تستطيع إستخدام هذه القيم بشكل سهل، يمكنك أن تجعل التابع bindColumn يقوم بتخزينهم في متغيرات بأسماء محددة، في المثال السابق نقوم بتخزين قيمة العمود name في متغير name$، بينما يخزن قيمة العمود colour في متغير بالاسم colour$ .. إلخ، وهذا الأمر يجعل إستخدام البيانات ضمن المشروع أسهل وأكثر وضوحًا. 4 اقتباس
0 Seyid Ahmed Khessam نشر 9 مايو 2022 الكاتب أرسل تقرير نشر 9 مايو 2022 (معدل) بتاريخ 4 ساعات قال سامح أشرف: التابع bindValue في PDO bindValue يستخدم لربط قيمة ما بما يقابلها في جملة SQL، فعلى سبيل المثال: <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', 150, PDO::PARAM_INT); $sth->bindValue(':colour', 'red', PDO::PARAM_STR); $sth->execute(); كما تلاحظ في المثال السابق فإن bindValue تستقبل ثلاث مدخلات، وهي اسم المعامل parameter المستخدم في جملة SQL (مثل calories: و colour:)، أما المدخل الثاني هو قيمة المعامل (مثل 150 و "red")، حيث سيتم تعويض هذه المعاملات بالقيم الخاصة بهم، بينما المدخل الثالث هو نوع نوع القيمة integer ، strgin ، boolean .. إلخ. ملاحظة: إضافة النقتين في بداية اسم المعامل (مثل calories: و colour:) أمر إختياري ويمكن عدم كتابته: $sth->bindValue('calories', 150, PDO::PARAM_INT); $sth->bindValue('colour', 'red', PDO::PARAM_STR); سوف يتم إستبدال أسماء المعاملات الموجودة في جملة SQL بقيمتها الممررة في bindValue ليصبح شكل جملة SQL كالتالي: SELECT name, colour, calories FROM fruit WHERE calories < 150 AND colour = "red"; كما يمكن إستخدام علامات إستفهام بدلًا من أسماء المعاملات بالشكل التالي: <?php /* يمكن تمرير أسماء متغيرات بلًا من القيم مباشرة*/ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindValue(1, $calories, PDO::PARAM_INT); /* علامة الإستفهم الأولى */ $sth->bindValue(2, $colour, PDO::PARAM_STR); /* علامة الإستفهم الثانية */ $sth->execute(); التابع bindParam في PDO التابع bindParam مشابه تمامًا للتابع bindValue، ويعمل بشكل مشابه، ولكن لا يمكن تمرير إليه قيمة مباشرة ويجب تمرير متغير، بالشكل التالي: <?php /* يجب أن يتم تمرير متغيرات وليس قيم مباشرة */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR); $sth->execute(); إذا لماذا أحتاج إلى إستعمال bindParam بدلًا من bindValue؟ السبب في ذلك هو كالتالي: تخيل أنك تريد تنفيذ جملة SQL معينة أكثر من مرة بقيم مختلفة، في حالة إستعمال bindValue ستحتاج إلى ربط القيم في كل مرة تتغير فيها القيم بشكل يدوي، بينما في حالة إستخدام bindParam يجب فقط تغير قيمة المتغيرات، مثال: إستخدام bindParam: <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindParam(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foobarbaz'; إستخدام bindValue: <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindValue(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foo'; لاحظ أنه عند تغير قيمة المتغير value$ في bindParam تم تغير شكل جملة SQL كذلك، بينما في bindValue لم يحدث ذلك. التابع bindColumn في PDO التابع bindColumn له إستخدام مختلف تمامًا عن bindValue و bindParam، فهو يستخدم بعد تنفيذ جملة SQL ، حيث يقوم بتخزين القيمة الموجودة في عمود معين في متغير جديد: <?php $stmt = $dbh->prepare('SELECT name, colour, calories FROM fruit'); $stmt->execute(); $stmt->bindColumn('name', $name); $stmt->bindColumn('colour', $colour); $stmt->bindColumn('calories', $calories); while ($stmt->fetch(PDO::FETCH_BOUND)) { print $name . "\t" . $colour . "\t" . $calories . "\n"; } عند عمل fetch سيتم جلب صف من قاعدة البيانات، وهذا الصف يحتوي على قيمة العمود name و colour و calories، ولكي تستطيع إستخدام هذه القيم بشكل سهل، يمكنك أن تجعل التابع bindColumn يقوم بتخزينهم في متغيرات بأسماء محددة، في المثال السابق نقوم بتخزين قيمة العمود name في متغير name$، بينما يخزن قيمة العمود colour في متغير بالاسم colour$ .. إلخ، وهذا الأمر يجعل إستخدام البيانات ضمن المشروع أسهل وأكثر وضوحًا. بارك الله فيك اخي كفيت ووفيت زادها الله في ميزان حسناتك تم التعديل في 9 مايو 2022 بواسطة Seyid Ahmed Khessam اقتباس
السؤال
Seyid Ahmed Khessam
السلام عليكم ورحمة الله وبركاته لدي استفسار حول معرفة الفرق بين bindParam / bindValue / bindColumn في ال PDO PHP وشكرا
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.