with - المرجع-ماذا يعني هذا الخطأ في PHP؟




w3school php insert (20)

MySQL: لديك خطأ في بناء جملة SQL الخاص بك ؛ تحقق من دليل يتوافق مع إصدار خادم MySQL لبناء الجملة الصحيح لاستخدام بالقرب ... في السطر ...

غالبًا ما يحدث هذا الخطأ لأنك نسيت الهروب الصحيح للبيانات التي تم تمريرها إلى استعلام MySQL.

مثال على ما لا يجب فعله ("الفكرة السيئة"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

يمكن تضمين هذا الرمز في صفحة مع نموذج لإرسال ، مع عنوان URL مثل http://example.com/edit.php?id=10 (لتحرير المشاركة رقم 10)

ماذا سيحدث إذا كان النص المقدم يحتوي على علامات تنصيص مفردة؟ سوف ينتهي $query مع:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

وعندما يتم إرسال هذا الاستعلام إلى MySQL ، فإنه يشكو من أن بناء الجملة خاطئ ، لأن هناك علامة اقتباس مفردة إضافية في المنتصف.

لتجنب مثل هذه الأخطاء ، يجب عليك دائمًا الإفلات من البيانات قبل استخدامها في استعلام.

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

كابل بيانات:

https://code.i-harness.com

ما هذا؟

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

لماذا هذا؟

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

ماذا علي أن أفعل هنا؟

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

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

القائمة

انظر أيضا


إشعار: إزاحة سلسلة غير مهيأ: *

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

ضع في اعتبارك أنك تحاول عرض كل حرف من $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

سيولد المثال أعلاه ( عرض توضيحي عبر الإنترنت ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

وبمجرد انتهاء النص البرمجي صدى D ستحصل على الخطأ ، لأنه داخل حلقة for() ، أخبرت PHP أن تظهر لك من أول حرف سلسلة خامس من 'ABCD' الذي ، موجود ، ولكن منذ حلقة تبدأ العد من 0 وصدى D بحلول الوقت الذي تصل إلى 4 ، وسوف يلقي خطأ إزاحة.

أخطاء مماثلة:

  • إزاحة السلاسل غير القانونية "الخيار 1"

إشعار: غير محدد مؤشر

يحدث عندما تحاول الوصول إلى صفيف بواسطة مفتاح غير موجود في الصفيف.

مثال نموذجي لإشعار Undefined Index سيكون ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

لا توجد كلتا spinach و 1 في الصفيف ، مما يؤدي إلى تشغيل E_WARNING .

الحل هو التأكد من وجود الفهرس أو الإزاحة قبل الوصول إلى هذا الفهرس. قد يعني ذلك أنك تحتاج إلى إصلاح خطأ في برنامجك للتأكد من وجود هذه الفهارس عندما تتوقعها. أو قد يعني ذلك أنك تحتاج إلى اختبار ما إذا كانت الفهارس موجودة باستخدام array_key_exists أو isset :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

إذا كان لديك رمز مثل:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

ثم لن يتم تعيين $_POST['message'] عند تحميل هذه الصفحة لأول مرة وستحصل على الخطأ أعلاه. فقط عندما يتم إرسال النموذج ويتم تشغيل هذا الرمز مرة ثانية سيكون مؤشر الصفيف موجود. أنت عادة تحقق من هذا مع:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

أسئلة ذات صلة:


تحذير: [وظيفة] : فشل في فتح الدفق: [السبب]

يحدث ذلك عندما تتصل بالملف عادةً عن طريق include أو الطلب أو fopen ولم تتمكن PHP من العثور على الملف أو ليس لديك الإذن الكافي لتحميل الملف.

يمكن أن يحدث هذا لعدة أسباب :

  • مسار الملف خاطئ
  • مسار الملف نسبي
  • تضمين المسار غير صحيح
  • الأذونات مقيدة للغاية
  • SELinux سارية المفعول
  • و أكثر من ذلك بكثير ...

أحد الأخطاء الشائعة هو عدم استخدام مسار مطلق. يمكن حل هذه __DIR__ بسهولة باستخدام مسار كامل أو ثوابت سحرية مثل __DIR__ أو dirname(__FILE__) :

include __DIR__ . '/inc/globals.inc.php';

أو:

require dirname(__FILE__) . '/inc/globals.inc.php';

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

أفضل طريقة لحل هذه المشكلة بسرعة هي اتباع قائمة التحقق من استكشاف الأخطاء وإصلاحها أدناه.

أسئلة ذات صلة:

الأخطاء ذات الصلة:


تحذير: mysql_fetch_array () تتوقع المعلمة 1 أن تكون موردًا ، منطقيًا معطى

اولا في المقام الاول اولا قبل كل شي:

من فضلك ، لا تستخدم وظائف mysql_* في الكود الجديد . لم يعد يتم الاحتفاظ بها ويتم إيقافها رسميًا . انظر المربع الأحمر ؟ تعرف على البيانات المعدة بدلاً من ذلك ، واستخدم PDO أو MySQLi - MySQLi هذه المقالة في تحديد أي منها. إذا اخترت شركة تنمية نفط عمان ، فهنا برنامج تعليمي جيد .

يحدث هذا عند محاولة جلب البيانات من نتيجة mysql_query ولكن فشل الاستعلام.

هذا تحذير ولن يوقف البرنامج النصي ، ولكنه سيجعل البرنامج خاطئًا.

تحتاج إلى التحقق من النتيجة التي تم إرجاعها بواسطة mysql_query بواسطة

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

أسئلة ذات صلة:

الأخطاء ذات الصلة:

وظائف mysql* الأخرى التي تتوقع أيضًا أن ينتج مورد نتيجة mysql كمعلمة نفس الخطأ لنفس السبب.


تحذير: قيد open_basedir سارية المفعول

يمكن أن يظهر هذا التحذير مع وظائف متنوعة تتعلق بالوصول إلى الملفات والدليل. يحذر من مشكلة التكوين.

عندما يظهر ، فهذا يعني أنه تم حظر الوصول إلى بعض الملفات.

التحذير بحد ذاته لا يكسر أي شيء ، ولكن في الغالب لا يعمل البرنامج النصي بشكل صحيح إذا تم منع الوصول إلى الملفات.

الإصلاح هو عادة لتغيير تكوين PHP ، يسمى الإعداد ذات الصلة open_basedir .

في بعض الأحيان يتم استخدام أسماء ملفات أو أسماء خاطئة ، يكون الإصلاح هو استخدام الأسماء الصحيحة.

أسئلة ذات صلة:


خطأ تحليلي: خطأ لغوي غير متوقع '['

هذا الخطأ يأتي في variatians اثنين:

التباين 1

$arr = [1, 2, 3];

تم إدخال بنية تهيئة المصفوفة هذه فقط في PHP 5.4 ؛ سترفع خطأ محلل في الإصدارات قبل ذلك. إذا كان ذلك ممكنًا ، قم بترقية التثبيت الخاص بك أو استخدم البنية القديمة:

$arr = array(1, 2, 3);

انظر أيضا هذا المثال من الدليل.

التباين 2

$suffix = explode(',', 'foo,bar')[1];

كما تم تقديم نتائج دالة إلغاء التجفير في PHP 5.4. إذا لم يكن من الممكن الترقية ، يجب استخدام متغير (مؤقت):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

انظر أيضا هذا المثال من الدليل.


خطأ فادح: استخدام $ هذا عندما لا يكون في سياق الكائن

$this متغير خاص في PHP لا يمكن تعيينه. إذا تم الوصول إليه في سياق حيث لا يوجد ، يتم إعطاء هذا الخطأ الفادح.

يمكن أن يحدث هذا الخطأ:

  1. إذا تم استدعاء طريقة غير ثابتة بشكل ثابت. مثال:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    كيفية الإصلاح: مراجعة التعليمات البرمجية مرة أخرى ، يمكن استخدام $this فقط في سياق الكائن ، ويجب عدم استخدامها أبداً في طريقة ثابتة. أيضاً ، لا يجب الوصول إلى أسلوب ثابت الخاصية غير ثابت. استخدم self::$static_property للوصول إلى خاصية ثابتة.

  2. إذا تم نسخ التعليمة البرمجية من أسلوب فئة إلى دالة عادية أو نطاق عالمي وحفظ $this المتغير الخاص.
    كيفية الإصلاح: راجع الشفرة واستبدل $this بالمتغير البديل البديل.

أسئلة ذات صلة:

  1. استدعاء طريقة غير ثابتة مثل static: خطأ فادح PHP: باستخدام $ هذا عندما لا يكون في سياق الكائن
  2. نسخ عبر رمز: خطأ فادح: استخدام $ هذا عندما لا يكون في سياق الكائن
  3. الكل "استخدام $ هذا عندما لا في سياق الكائن" الأسئلة على

خطأ فادح: استدعاء دالة غير محددة XXX

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

مثال 1 - إعلان الدالة الشرطية

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

في هذه الحالة ، لن يتم الإعلان عن fn() لأن $someCondition غير صحيح.

مثال 2 - وظيفة في إعلان الدالة

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

في هذه الحالة ، سيتم الإعلان عن fn بمجرد createFn() . لاحظ أن المكالمات اللاحقة إلى createFn() سيؤدي إلى حدوث خطأ حول Redeclaration دالة موجودة.

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

في حالة وجود ملحق مفقود ، قم بتثبيت هذا الامتداد وتمكينه في php.ini. ارجع إلى تعليمات التثبيت في دليل PHP للملحق الذي تظهر فيه وظيفتك. يمكنك أيضًا تمكين الإضافة أو تثبيتها باستخدام مدير الحزم (مثل apt في Debian أو Ubuntu أو yum in Red Hat أو CentOS) أو لوحة التحكم في بيئة استضافة مشتركة.

إذا تم إدخال الدالة في إصدار أحدث من PHP مما تستخدمه ، فقد تجد ارتباطات للتطبيقات البديلة في الدليل أو قسم التعليق الخاص به. إذا تمت إزالته من PHP ، فابحث عن معلومات حول السبب ، لأنه لم يعد ضروريًا.

في حالة وجود المفقودين ، تأكد من تضمين الملف الذي يعلن الوظيفة قبل استدعاء الوظيفة.

في حالة الأخطاء المطبعية ، إصلاح الخطأ المطبعي.

أسئلة ذات صلة:

  • https://.com/search?q=Fatal+error%3A+Call+to+undefined+function

خطأ فادح: حجم الذاكرة المسموح بها من بايت XXX استنفدت (حاول تخصيص XXX بايت)

لا توجد ذاكرة كافية لتشغيل البرنامج النصي الخاص بك. بلغ PHP حد الذاكرة ويتوقف عن تنفيذه. هذا الخطأ قاتل ، توقف البرنامج النصي. يمكن تكوين قيمة حد الذاكرة إما في ملف php.ini أو باستخدام ini_set('memory_limit', '128 M'); في البرنامج النصي (الذي سيتم الكتابة فوق القيمة المحددة في php.ini ). الغرض من الحد الأقصى للذاكرة هو منع برنامج نصي واحد من PHP من التهام جميع الذاكرة المتوفرة وإخراج خادم الويب بالكامل.

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

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

أسئلة ذات صلة:

  • كافة "خطأ فادح: حجم الذاكرة المسموح به من بايت XXX استنفاد" الأسئلة على

خطأ فادح: لا يمكن استخدام قيمة إرجاع الدالة في سياق الكتابة

هذا يحدث عادة عند استخدام وظيفة مباشرة مع empty .

مثال:

if (empty(is_null(null))) {
  echo 'empty';
}

هذا لأن empty هي بنية لغة وليست دالة ، لا يمكن أن يتم استدعاؤها مع تعبير كوسيطة لها في إصدارات PHP قبل 5.5. قبل PHP 5.5 ، يجب أن تكون الوسيطة empty() متغيرًا ، ولكن التعبير التعسفي (مثل قيمة إرجاع دالة) مسموح به في PHP 5.5+.

empty ، على الرغم من اسمها ، لا تحقق في الواقع ما إذا كان المتغير "فارغ". بدلاً من ذلك ، يتحقق من عدم وجود متغير ، أو == false . سيتم دائمًا اعتبار التعبيرات (مثل is_null(null) في المثال) موجودة ، لذلك لا يكون هنا empty سوى التحقق مما إذا كان يساوي false. يمكنك استبدال empty() هنا مع ! ، على سبيل المثال ، if (!is_null(null)) ، أو قارن بشكل صريح إلى false ، على سبيل المثال if (is_null(null) == false) .

أسئلة ذات صلة:


خطأ في التحليل: خطأ في بناء الجملة ، T_VARIABLE غير متوقع

السيناريو الممكن

لا يبدو لي أن أجد أين ذهب رمز بلدي خاطئ. هذا هو خطأي الكامل:

خطأ في التحليل: خطأ في بناء الجملة ، T_VARIABLE غير متوقع على السطر x

ما أحاول

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

إجابة

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

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

ما يجب عليك فعله هو التحقق بعناية من الخطوط حول المكان الذي يقع فيه الخطأ لأي أخطاء بسيطة.

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

قراءة جيدة: قائمة رموز المحللون

لذا تأكد من تمكين E_PARSE على الأقل في php.ini الخاص بك. يجب عدم وجود أخطاء التحليل في البرامج النصية للإنتاج.

أوصيت دائمًا بإضافة العبارة التالية ، بينما يتم الترميز:

error_reporting(E_ALL);

الإبلاغ عن خطأ PHP

أيضا فكرة جيدة لاستخدام IDE والتي سوف تتيح لك معرفة أخطاء التحليل أثناء الكتابة. يمكنك استخدام:

  1. NetBeans (السلام الجميل من الجمال ، البرمجيات الحرة) (الأفضل في رأيي)
  2. PhpStorm (العم غوردون يحب هذا: P ، خطة مدفوعة الأجر ، يحتوي على البرمجيات الحرة والملكية)
  3. Eclipse (الجمال والوحش ، البرمجيات الحرة)

أسئلة ذات صلة:

  • المرجع: PHP تحليل / أخطاء النحو ؛ وكيفية حلها؟

خطأ في التحليل: خطأ في بناء الجملة ، غير متوقع T_ENCAPSED_AND_WHITESPACE

غالباً ما يتم مصادفة هذا الخطأ عند محاولة الرجوع إلى قيمة صفيف مع مفتاح مقتبس للاستكمال الداخلي داخل سلسلة مقتبسة مزدوجة ، عندما لا يتم تضمين بنية المتغير المعقدة بالكامل في {} .

حالة الخطأ:

سيؤدي ذلك إلى Unexpected T_ENCAPSED_AND_WHITESPACE :

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

الإصلاحات المحتملة:

في سلسلة مقتبسة مزدوجة ، سيسمح PHP باستخدام سلاسل المفاتيح E_NOTICE غير E_NOTICE ، ولن يصدر E_NOTICE . لذلك يمكن كتابة ما سبق على النحو التالي:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

يمكن تضمين متغير الصفيف المركب بأكمله والمفتاح (المفاتيح) في {} ، وفي هذه الحالة يجب أن يتم اقتباسها لتجنب E_NOTICE . توصي وثائق PHP بناء الجملة هذا للمتغيرات المعقدة.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

وبطبيعة الحال ، فإن البديل لأي من المذكور أعلاه هو ربط متغير الصفيف بدلاً من استقراءه:

echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

للرجوع إليها ، راجع قسم " تحليل المتغير" في صفحة دليل سلاسل PHP


خطأ في التحليل: خطأ في بناء الجملة ، غير متوقع T_PAAMAYIM_NEKUDOTAYIM

ويسمى المشغل قرار نطاق أيضا "Paamayim Nekudotayim" من العبرية פעמיים נקודתיים. مما يعني "نقرا مزدوجا" أو "نقطة مزدوجة مرتين".

يحدث هذا الخطأ عادةً إذا وضعت بدون قصد :: في شفرتك.

أسئلة ذات صلة:

كابل بيانات:


ملحوظة: تغيير غير معرف

يحدث عندما تحاول استخدام متغير لم يتم تعريفه مسبقًا.

مثال نموذجي سيكون

foreach ($items as $item) {
    // do something with item
    $counter++;
}

إذا لم تعرِّف $counter قبل ، فستعمل الشفرة المذكورة أعلاه على تشغيل الإشعار.

والطريقة الصحيحة هي تعيين المتغير قبل استخدامه ، حتى لو كان مجرد سلسلة فارغة مثل

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

أسئلة ذات صلة:


Code doesn't run/what looks like parts of my PHP code are output

If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?> tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.

To actually run your PHP scripts, you need:

  • a web server which executes your script
  • to set the file extension to .php, otherwise the web server won't interpret it as such*
  • to access your .php file via the web server

* Unless you reconfigure it, everything can be configured.

This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:

file://C:/path/to/my/file.php

This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:

http://localhost/my/file.php

You may also want to check whether you're using short open tags <? instead of <?php and your PHP configuration has turned short open tags off.

Also see PHP code is not being executed, instead code shows on the page


Notice: Array to string conversion

This simply happens if you try to treat an array as a string:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

An array cannot simply be echo 'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Or loop the array:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.


Notice: Trying to get property of non-object error

Happens when you try to access a property of an object while there is no object.

A typical example for a non-object notice would be

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

In this case, $users is an array (so not an object) and it does not have any properties.

This is similar to accessing a non-existing index or key of an array (see Notice: Undefined Index ).

This example is much simplified. Most often such a notice signals an unchecked return value, eg when a library returns NULL if an object does not exists or just an unexpected non-object value (eg in an Xpath result, JSON structures with unexpected format, XML with unexpected format etc.) but the code does not check for such a condition.

As those non-objects are often processed further on, often a fatal-error happens next on calling an object method on a non-object (see: Fatal error: Call to a member function ... on a non-object ) halting the script.

It can be easily prevented by checking for error conditions and/or that a variable matches an expectation. Here such a notice with a DOMXPath example:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

The problem is accessing the nodeValue property (field) of the first item while it has not been checked if it exists or not in the $result collection. Instead it pays to make the code more explicit by assigning variables to the objects the code operates on:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Related errors:

  • إشعار: غير محدد مؤشر
  • Fatal error: Call to a member function ... on a non-object

Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. فمثلا:

$value = @(2 / 0);

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Related Questions:


Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .

مثال:

$var = "test";
echo $var["a_key"];

If you think the variable should be an array, see where it comes from and fix the problem there.





warnings