اذهب إلى المحتوى
  • 0

ماهو الفرق بين bind Param/Value/Column in PHP

Seyid Ahmed Khessam

السؤال

Recommended Posts

  • 2

التابع 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$ .. إلخ، وهذا الأمر يجعل إستخدام البيانات ضمن المشروع أسهل وأكثر وضوحًا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 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$ .. إلخ، وهذا الأمر يجعل إستخدام البيانات ضمن المشروع أسهل وأكثر وضوحًا.

بارك الله فيك اخي كفيت ووفيت زادها الله في ميزان حسناتك

 

تم التعديل في بواسطة Seyid Ahmed Khessam
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...