سؤال

ماهو الفرق بين PDOStatement::bindParam() و PDOStatement::bindValue()?

هل كانت مفيدة؟

المحلول

الجواب في الوثائق ل bindParam:

على عكس pdostatement :: bindvalue ()، يرتبط المتغير كمرجع وسيتم تقييمه إلا في الوقت الذي يسمىه pdostatement :: execute ().

و execute

استدعاء Pdostatement :: BindParam () لربط متغيرات PHP إلى علامات المعلمة: تمر المتغيرات المرتبطة بقيمتها كمدخلات واستلام قيمة الإخراج، إن وجدت علامات المعلمة المرتبطة بها

مثال:

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'

أو

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'

نصائح أخرى

من الإدخال اليدوي ل PDOStatement::bindParam:

مع bindParam] على عكس PDOStatement::bindValue(), ، يرتبط المتغير كمرجع وسيتم تقييمه إلا في ذلك الوقت PDOStatement::execute() يسمى.

لذلك، على سبيل المثال:

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'

أو

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'

هنا بعض ما يمكنني التفكير فيه:

  • مع bindParam, ، يمكنك فقط تمرير المتغيرات؛ لا القيم
  • مع bindValue, ، يمكنك نقل كلا (القيم، من الواضح، والمتغيرات)
  • bindParam يعمل فقط مع المتغيرات لأنه يسمح بتقديم المعلمات كإدخال / إخراج، عن طريق "المرجع" (وقيمة ليست "مرجعية" صالحة في PHP) : إنه مفيد برامج التشغيل التي (نقلا عن الدليل):

دعم استدعاء الإجراءات المخزنة التي ترجع البيانات كمعلمات الإخراج، وبعضها أيضا مع وجود معلمات الإدخال / الإخراج التي يقوم بها كلا من البيانات ويتم تحديثها لاستقبالها.

مع بعض محركات DB، يمكن أن تحتوي الإجراءات المخزنة على معلمات يمكن استخدامها لكلا الإدخال (إعطاء قيمة من PHP إلى الإجراء) و Oput (إرجاع قيمة من PROC المخزن إلى PHP)؛ لربط تلك المعلمات، عليك استخدام BindParam، وليس Bindvalue.

من إعداد البيانات والأعداد والإجراءات المخزنة

يستخدم bindParam لإدراج صفوف متعددة مع تجليد مرة واحدة:

<?php

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

من أجل الغرض الأكثر شيوعا، يجب عليك استخدام bindValue.

bindParam لديه اثنين من السلوكيات صعبة أو غير متوقعة:

  • bindParam(':foo', 4, PDO::PARAM_INT) لا يعمل، لأنه يتطلب تمرير متغير (كمرجع).
  • bindParam(':foo', $value, PDO::PARAM_INT) سوف يتغير $value إلى السلسلة بعد الجري execute(). وبعد هذا، بالطبع، يمكن أن يؤدي إلى أخطاء خفية قد تكون من الصعب التقاطها.

مصدر: http://php.net/manual/en/pdostatement.bindparam.php#4711.

ليس عليك أن تكافح لفترة أطول، عندما يكون هناك طريقة ليلك هذا:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

أبسط طريقة لوضع هذا في منظور الحفظ عن طريق السلوك (من حيث PHP):

  • bindParam: المرجعي
  • bindValue: عامل
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top