سؤال

حتى الآن كنت أستخدم PDO->bindParam لكن أثناء قراءة الدليل الذي وجدته PDO->bindValue من ما يمكنني قوله PDO->bindValue يمر بالقيمة حيث PDO->bindParam يمر بالرجوع إليه ، هل هذا هو الفرق الوحيد؟

$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");

while(something)
{
        $modThread->bindParam(':id', $thread);
        $modThread->execute();
//*******************HERE********************//
}

مرة أخرى أثناء قراءة الدليل وجدت: PDO->closeCursor هل يجب أن أضعها في مكان وضع علامة؟ هل هو اختياري/يسمى تلقائيا؟ يبدو فقط بعض السائقين الذين يحتاجون إليها. هل سيطلق عليه سائق لا يحتاج/يدعمه إلى أخطاء؟ ماذا عن MySQL؟

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

المحلول

"المتكررة" bindParam() هنا ليس ضروريًا حقًا:

$thread = 0;
$modThread->bindParam(':id', $thread);

while($thread < 20)
{
    $thread++;
    $modThread->execute(); //executing with the new value, which you couldn't do with bindValue
}

أنت لا تحتاج closeCursor() عندما لا تكون هناك نتائج (أي ، فقط مع SELECT S أو الإجراءات التي تعيد النتائج) ، لكن عادةً ما قمت بالفعل بإحضار مكان ما في بيان / صف سابق.

نصائح أخرى

هذا ليس صحيحا. إذا وجدت نفسك بحاجة إلى استخدام CloseCursor ، فإن واحدة من أكثر الأوقات المثلى هي إدراج/تحديث/حذف الأوامر ، ونادراً ما تكون بيانات محددة قد حققت نتائج لها بالفعل.

على سبيل المثال ، إذا قمت بتحديد جميع السجلات من جدول ما ، ثم إصدار $ STMT-> FETCH () ، وهذا ينجز بالفعل الهدف من CloseCorsor على الفور لأن الصفوف لم تعد الآن في حالة غير مثبتة.

من الدليل:

هذه الطريقة مفيدة لسائقي قواعد البيانات التي لا تدعم تنفيذ كائن pdostatement عندما لا يزال كائن pdostatement الذي تم تنفيذه مسبقًا يحتوي على صفوف غير مثبتة. إذا كان برنامج تشغيل قاعدة البيانات الخاص بك يعاني من هذا القيد ، فقد تظهر المشكلة نفسها في خطأ خارج التسلسل.

عندما ستحتاج حقًا إلى CloseCursor ، يكون خلال أي من الحالات التالية:

  • إذا لم يسمح برنامج تشغيل DB الخاص بك بتنفيذ STMT جديد بينما تتوفر صفوف غير مثبتة من التنفيذ السابق
  • لديك عبارات جاهزة متعددة وترغب في تنفيذها بعد ذلك بعد $ STMT1-> execute () ؛ $ stmt-> closeCursor () ؛ $ stmt2-> execute () ؛ $ stmt2-> closeCursor () ؛ $ ؛ $ STMT3 ... إلخ)
  • لديك العديد من STMTs التي يجب تنفيذ إدراج/تحديث/حذف داخل نفس الكتلة. هذا صحيح لأنه ، على الرغم من أنك لا تحصل على نتائج صف MySQL ، إلا أنك تحصل على عدد من النتائج المتأثرة التي تم تعيينها (والتي لا تزال نتيجة).
  • عند استخدام المعاملات
  • عندما تريد إصدار عبارات معدة على غرار SELECT وتنفيذها ، ولكن لا تسترجع البيانات حتى وقت لاحق

عندما لا تحتاج إلى بيان CloseCursor:

  • إذا كنت قد قمت بالفعل بجلب الصفوف (كما هو الحال مع $ STMT-> FETCH ()) قبل تنفيذ بيانك التالي. عند هذه النقطة ، تكون الصفوف في حالة "جلب" وتحرر السائق لتنفيذ بيانات جديدة.

مثلما هو مفيد لإغلاق المؤشر هو unset () (أي: unset ($ STMT)) ووضع البيان على NULL ($ STMT = NULL) ، فتح الأبواب لجامع القمامة المدمج لمسح كل شيء.

انظر الدليل لمزيد من المعلومات: http://php.net/manual/en/pdostatement.closecursor.php

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