سؤال

تم استخدامه بي إتش بي/ماي إس كيو إل لبعض الوقت الآن، وأنا أتساءل عما إذا كان هناك أي مزايا محددة (الأداء أو غير ذلك) للاستخدام mysql_fetch_object() ضد mysql_fetch_assoc() / mysql_fetch_array().

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

المحلول

من ناحية الأداء، لا يهم ما تستخدمه.الفرق هو أن mysql_fetch_object يُرجع الكائن:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

يقوم mysql_fetch_assoc() بإرجاع المصفوفة النقابية:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

ويقوم mysql_fetch_array() بإرجاع المصفوفة:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

نصائح أخرى

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

mysql_fetch_object لديه بعض العيوب، خاصة إذا قمت ببناء طبقة ديسيبل عليه.

  • قد لا تكون أسماء الأعمدة معرفات PHP صالحة، على سبيل المثال tax-allowance أو user.id إذا كان برنامج تشغيل قاعدة البيانات لديك يمنحك اسم العمود كما هو محدد في الاستعلام.ثم عليك البدء في الاستخدام {} في انحاء المكان.

  • إذا كنت ترغب في الحصول على عمود بناءً على اسمه، فيجب عليك أيضًا البدء في استخدام خصائص المتغير $row->{$column_name}, ، بينما بناء جملة المصفوفة $row[$column_name]

  • لا يتم استدعاء المُنشئين عندما تتوقع ذلك إذا قمت بتحديد اسم الفئة.

  • إذا لم تحدد اسم الفصل، فستحصل على stdClass, ، وهو ليس أفضل من المصفوفة على أي حال.

mysql_fetch_assoc هو الأسهل من بين الثلاثة في العمل، وأنا أحب التمييز الذي يقدمه هذا في الكود بين الكائنات وصفوف نتائج قاعدة البيانات...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

في حين أن العديد من محبي OOP (وأنا من محبي OOP) يحبون فكرة التحول كل شئ في كائن، أشعر أن المصفوفة الترابطية هي نموذج أفضل لصف من قاعدة بيانات من كائن، كما هو الحال في رأيي، الكائن عبارة عن مجموعة من الخصائص مع طرق للعمل عليها، في حين أن الصف هو مجرد بيانات وينبغي التعامل معها على هذا النحو دون مزيد من التعقيد.

شيء يجب مراعاته:يمكن إضافة المصفوفات بسهولة إلى ذاكرة التخزين المؤقت للذاكرة (eaccelerator، XCache، ..)، بينما لا يمكن إضافة الكائنات (تحتاج إلى إجراء تسلسل لها عند تخزينها وإلغاء تسلسلها في كل عملية استرجاع!).

يمكنك التبديل إلى استخدام المصفوفات بدلاً من الكائنات عندما تريد إضافة دعم ذاكرة التخزين المؤقت للذاكرة - ولكن بحلول ذلك الوقت قد تضطر إلى تغيير الكثير من التعليمات البرمجية بالفعل، والتي تستخدم قيم إرجاع نوع الكائن المستخدمة مسبقًا.

جلب مصفوفة باستخدام mysql_fetch_array() يتيح لك تكرار مجموعة النتائج عبر حلقة foreach أو حلقة for. mysql_fetch_object() لا يمكن اجتيازها بواسطة حلقة for.

لست متأكدًا مما إذا كان هذا مهمًا كثيرًا، فقط فكرت في أن أذكر ذلك.

بالإضافة إلى ذلك، إذا كنت تريد في النهاية تطبيق Memcaching على نتائج MySQL، فقد ترغب في اختيار المصفوفات.يبدو أنه من الآمن تخزين أنواع المصفوفات، بدلاً من نتائج أنواع الكائنات.

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

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

أعتقد أن الفرق بين كل هذه الوظائف غير مهم، خاصة عند مقارنتها بسهولة قراءة التعليمات البرمجية.

إذا كنت قلقًا بشأن هذا النوع من التحسين، فاستخدم mysql_fetch_row().إنه الأسرع لأنه لا يستخدم المصفوفات الترابطية (على سبيل المثال.$row[2])، ولكن من الأسهل كسر التعليمات البرمجية الخاصة بك باستخدامه.

السرعة الحكيمة، mysql_fetch_object() مطابق ل mysql_fetch_array(), ، وبسرعة تقريبًا mysql_fetch_row().

أيضا مع mysql_fetch_object() لن تتمكن من الوصول إلى بيانات الحقل إلا من خلال أسماء الحقول المقابلة.

أنا أصوت ضد mysql_fetch_array()

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

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

لذا، باسم التعقل، من فضلك لا تستخدم هذه الوظيفة، فهي تجعل صيانة الكود أكثر صعوبة

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