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




debugging warnings (25)

ما هذا؟

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

لماذا هذا؟

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

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

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

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

القائمة

انظر أيضا


Answers

Fatal error: [TraitA] and [TraitB] define the same property ([$x]) in the composition of [ClassC]

Occurs when a class attempts to use multiple Traits , where two or more of those Traits have defined a property by the same name, and with the property having differing initial values.

مثال:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

Problematic: While it's possible to resolve conflicts between competing methods , there is currently no syntax that would resolve a conflict between two competing properties. The only solution at this time is to refactor ; ie, avoid a conflict between property names that produces a fatal error.

Related Questions:


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:


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

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

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

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

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

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

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


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

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

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

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

كابل بيانات:


تحذير: [وظيفة] تتوقع المعلمة 1 أن تكون موردًا ، منطقيًا معطى

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

الموارد هي type PHP (مثل السلاسل أو الأعداد الصحيحة أو الكائنات). المورد هو فقاعة غير شفافة لا تحتوي على قيمة ذات معنى في حد ذاتها. المورد محدد ومحدّد بواسطة مجموعة معينة من وظائف أو تمديد PHP. على سبيل المثال ، يعرّف ملحق Mysql نوعين من الموارد :

هناك نوعان من الموارد المستخدمة في وحدة MySQL. The first one is the link identifier for a database connection, the second a resource which holds the result of a query.

The cURL extension defines another two resource types :

... a cURL handle and a cURL multi handle.

When var_dump ed, the values look like this:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

That's all most resources are, a numeric identifier ( (1) ) of a certain type ( (curl) ).

You carry these resources around and pass them to different functions for which such a resource means something. Typically these functions allocate certain data in the background and a resource is just a reference which they use to keep track of this data internally.

The " ... expects parameter 1 to be resource, boolean given " error is typically the result of an unchecked operation that was supposed to create a resource, but returned false instead. For instance, the fopen function has this description:

Return Values

Returns a file pointer resource on success, or FALSE on error.

So in this code, $fp will either be a resource(x) of type (stream) or false :

$fp = fopen(...);

If you do not check whether the fopen operation succeed or failed and hence whether $fp is a valid resource or false and pass $fp to another function which expects a resource, you may get the above error:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

You always need to error check the return value of functions which are trying to allocate a resource and may fail :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Related Errors:


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

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

مثال نموذجي لإشعار 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

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


لا شيء ينظر. الصفحة فارغة وأبيض.

يُعرف أيضًا باسم الصفحة البيضاء للموت أو الشاشة البيضاء للموت . يحدث هذا عند إيقاف تشغيل الإعلام عن الخطأ وحدث خطأ فادح (خطأ لغوي غالباً).

إذا قمت بتمكين تسجيل الخطأ ، فستجد رسالة الخطأ الملموسة في سجل الأخطاء. عادة ما يكون ذلك في ملف يسمى "php_errors.log" ، إما في موقع مركزي (على سبيل المثال /var/log/apache2 في العديد من بيئات Linux) أو في دليل البرنامج النصي نفسه (يستخدم أحيانًا في بيئة استضافة مشتركة).

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

يمكن القيام بذلك بسهولة عن طريق إضافة شفرة PHP التالية في الجزء العلوي من البرنامج النصي:

ini_set('display_errors', 1); error_reporting(~0);

سيقوم الرمز بتشغيل عرض الأخطاء وتعيين التقارير إلى أعلى مستوى.

بما أن ini_set() يتم تنفيذه في وقت التشغيل ، فليس له أي تأثير على أخطاء التحليل اللغوي / التركيب اللغوي. ستظهر هذه الأخطاء في السجل. إذا كنت ترغب في عرضها في الإخراج كذلك (على سبيل المثال في مستعرض) ، يجب عليك ضبط الأمر display_startup_errors على true . افعل ذلك سواء في php.ini أو في .htaccess أو بأي طريقة أخرى تؤثر على التكوين قبل وقت التشغيل .

يمكنك استخدام نفس الأساليب لتعيين توجيهات error_log و error_log لاختيار موقع ملف السجل الخاص بك.

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

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

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


إشعار: استخدام XXX ثابت غير محدد - يفترض أنه "XXX"

أو ، في PHP 7.2 أو أحدث:

تحذير: استخدام XXX ثابت غير محدد - يفترض "XXX" (سيؤدي هذا إلى حدوث خطأ في إصدار مستقبلي من PHP)

يحدث هذا الإشعار عند استخدام رمز مميز في التعليمة البرمجية ويبدو أنه ثابت ، ولكن لم يتم تحديد ثابت بهذا الاسم.

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

فمثلا:

// Wrong
echo $array[key];

// Right
echo $array['key'];

من الأسباب الشائعة الأخرى هي علامة $ (الدولار) مفقودة أمام اسم المتغير:

// Wrong
echo varName;

// Right
echo $varName;

أو ربما أخطأت في كتابة بعض الكلمات الرئيسية أو الكلمات الرئيسية الأخرى:

// Wrong
$foo = fasle;

// Right
$foo = false;

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

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


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

خطأ فادح: استدعاء دالة عضو ... على كائن غير

يحدث مع التعليمات البرمجية المشابهة لـ xyz->method() حيث xyz ليس كائنًا وبالتالي لا يمكن استدعاء هذه method .

هذا خطأ فادح من شأنه أن يوقف البرنامج النصي (إشعار التوافق الأمامي: سوف يصبح خطأ قابل للمسح يبدأ بـ PHP 7).

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

مثال typical سيكون

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

في المثال أعلاه ، لا يمكن إعداد الاستعلام prepare() سيتم تعيين false إلى $statement . سيؤدي محاولة استدعاء الأسلوب execute() إلى خطأ فادح لأن false هو "غير كائن" لأن القيمة هي قيمة منطقية.

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

إذا فشل حتى ->prepare ثم لم يتم تمرير الكائن مقبض قاعدة البيانات $pdo الخاص بك إلى النطاق الحالي . ابحث عن المكان الذي تم تعريفه فيه. ثم تمريرها كمعلمة أو تخزينها كخاصية أو مشاركتها عبر النطاق العالمي.

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

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

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

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

  • دعوة إلى وظيفة عضو على كائن غير
  • قائمة جميع 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


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.


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 إلى تغيير أو فقدان أو تعديل سجل أو جدول أو قاعدة بيانات كاملة. هذه مشكلة أمنية خطيرة للغاية!

كابل بيانات:


خطأ فادح: حجم الذاكرة المسموح بها من بايت 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) .

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


تحذير: لا يمكن تعديل معلومات العنوان - تم إرسال الرؤوس بالفعل

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

هذا هو E_WARNING ولن يتوقف البرنامج النصي.

مثال نموذجي سيكون ملف قالب مثل هذا:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

ستحاول الدالة session_start() إرسال رؤوس مع ملف تعريف ارتباط جلسة العمل إلى العميل. ولكن PHP أرسلت بالفعل رؤوسًا عندما كتبت عنصر <html> إلى تدفق الإخراج. سيكون عليك نقل session_start() إلى الأعلى.

يمكنك حل هذه المشكلة عن طريق المرور بالخطوط قبل التعليمة البرمجية التي تعمل على التحذير والتحقق من مكان مخرجاتها. نقل أي رأس إرسال رمز قبل هذا الرمز.

غالبًا ما يتم إغفال إخراج خطوط جديدة بعد إغلاق PHP ?> يعتبر ممارسة قياسية ليتم حذفها ?> عندما يكون هذا هو آخر شيء في الملف. وبالمثل ، هناك سبب آخر شائع لهذا التحذير وهو عندما يكون <?php الافتتاحي يحتوي على مساحة فارغة ، أو سطر ، أو حرف غير مرئي قبله ، مما يؤدي إلى قيام خادم الويب بإرسال الرؤوس والمساحة البيضاء / السطر الجديد وبالتالي عند تعذر بدء PHP في التحليل. لتقديم أي رأس.

إذا كان ملفك يحتوي على أكثر من شفرة <?php ... ?> في ذلك ، فلا يجب أن يكون لديك أي مسافات بينهما. (ملاحظة: قد يكون لديك عدة كتل إذا كان لديك رمز تم إنشاؤه تلقائيًا)

تأكد أيضًا من عدم وجود أية علامات ترتيب بايت في التعليمة البرمجية الخاصة بك ، على سبيل المثال عندما يكون ترميز البرنامج النصي هو UTF-8 مع BOM.

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


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

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

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

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

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

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

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

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


Warning: mysql_connect(): Access denied for user 'name'@'host'

This warning shows up when you connect to a MySQL/MariaDB server with invalid or missing credentials (username/password). So this is typically not a code problem, but a server configuration issue.

  • See the manual page on mysql_connect("localhost", "user", "pw") for examples.

  • Check that you actually used a $username and $password .

    • It's uncommon that you gain access using no password - which is what happened when the Warning: said (using password: NO) .
    • Only the local test server usually allows to connect with username root , no password, and the test database name.

    • You can test if they're really correct using the command line client:
      mysql --user="username" --password="password" testdb

    • Username and password are case-sensitive and whitespace is not ignored. If your password contains meta characters like $ , escape them, or put the password in single quotes .

    • Most shared hosting providers predeclare mysql accounts in relation to the unix user account (sometimes just prefixes or extra numeric suffixes). See the docs for a pattern or documentation, and CPanel or whatever interface for setting a password.

    • See the MySQL manual on Adding user accounts using the command line. When connected as admin user you can issue a query like:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Or use Adminer or WorkBench or any other graphical tool to create, check or correct account details.

    • If you can't fix your credentials, then asking the internet to "please help" will have no effect. Only you and your hosting provider have permissions and sufficient access to diagnose and fix things.

  • Verify that you could reach the database server, using the host name given by your provider:
    ping dbserver.hoster.example.net

    • Check this from a SSH console directly on your webserver. Testing from your local development client to your shared hosting server is rarely meaningful.

    • Often you just want the server name to be "localhost" , which normally utilizes a local named socket when available. Othertimes you can try "127.0.0.1" as fallback.

    • Should your MySQL/MariaDB server listen on a different port, then use "servername:3306" .

    • If that fails, then there's a perhaps a firewall issue. (Off-topic, not a programming question. No remote guess-helping possible.)

  • When using constants like eg DB_USER or DB_PASSWORD , check that they're actually defined .

    • If you get a "Warning: Access defined for 'DB_USER'@'host'" and a "Notice: use of undefined constant 'DB_PASS'" , then that's your problem.

    • Verify that your eg xy/db-config.php was actually included and whatelse.

  • Check for correctly set GRANT permissions .

    • It's not sufficient to have a username + password pair.

    • Each MySQL/MariaDB account can have an attached set of permissions.

    • Those can restrict which databases you are allowed to connect to, from which client/server the connection may originate from, and which queries are permitted.

    • The "Access denied" warning thus may as well show up for mysql_query calls, if you don't have permissions to SELECT from a specific table, or INSERT / UPDATE , and more commonly DELETE anything.

    • You can adapt account permissions when connected per command line client using the admin account with a query like:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • If the warning shows up first with Warning: mysql_query(): Access denied for user ''@'localhost' then you may have a php.ini-preconfigured account/password pair .

    • Check that mysql.default_user= and mysql.default_password= have meaningful values.

    • Oftentimes this is a provider-configuration. So contact their support for mismatches.

  • Find the documentation of your shared hosting provider:

  • Note that you may also have depleted the available connection pool . You'll get access denied warnings for too many concurrent connections. (You have to investigate the setup. That's an off-topic server configuration issue, not a programming question.)

  • Your libmysql client version may not be compatible with the database server. Normally MySQL and MariaDB servers can be reached with PHPs compiled in driver. If you have a custom setup, or an outdated PHP version, and a much newer database server, or significantly outdated one - then the version mismatch may prevent connections. (No, you have to investigate yourself. Nobody can guess your setup).

More references:

Btw, you probably don't want to use mysql_* functions anymore . Newcomers often migrate to mysqli , which however is just as tedious. Instead read up on PDO and prepared statements .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


خطأ في التحليل: خطأ في بناء الجملة ، 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 تحليل / أخطاء النحو ؛ وكيفية حلها؟

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

هذا الخطأ يأتي في 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];

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


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


خطأ فادح: استدعاء دالة غير محددة 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

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.


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

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

ضع في اعتبارك أنك تحاول عرض كل حرف من $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"

ربما كنت تستخدم إصدار PHP القديم





php mysql debugging warnings