PHP Ölümcül hata Yardım

4 Cevap php

Ben şu hatayı alıyorum.

Fatal error: Cannot increment/decrement overloaded objects nor string offsets

İşte kodudur.

$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT id, label, link_url, parent_id FROM dyn_menu ORDER BY parent_id, id ASC");

if (!$dbc) {
	// There was an error...do something about it here...
	print mysqli_error();
}

while ($obj = mysqli_fetch_assoc($dbc)) {
	if (!empty($obj['parent_id']) == 0) {
		echo $parent_menu . $obj['id']['label'] = $obj['label'];
		echo $parent_menu . $obj['id']['link'] = $obj['link_url'];
	} else {
		echo $sub_menu . $obj['id']['parent'] = $obj['parent_id'];
		echo $sub_menu . $obj['id']['label'] = $obj['label'];
		echo $sub_menu . $obj['id']['link'] = $obj['link_url'];
		echo $parent_menu . $obj['parent_id']['count']++;
	}
}
mysql_free_result($dbc);

4 Cevap

Sizin $obj['parent_id'] bir dize (bir sayı içeren, örneğin "0") - bu bir count girişi ile bir dizi değil. Bu daha mantıklı olur:

$obj['parent_id']++

Ayrıca bir yan not, bu çok kafa karıştırıcı:

if (!empty($obj['parent_id']) == 0) {

Bu daha mantıklı olur:

if (empty($obj['parent_id'])) {

Greg sorunu dikkat çekti: Sen count bir dize değeri ofset bir dize artırmak için çalışıyoruz:

echo $parent_menu . $obj['parent_id']['count']++;

İşte PHP ne olduğunu:

(1) bir dize neden, $obj['parent_id'] değerlendirin.

(2) Bu dize Kayma "count" almak için çalışılıyor. Burada, PHP büyük bir kusur oluşur: dizeleri tek karakterler, PHP will silently convert "count" to an integer ayıklamak amacıyla köşeli parantez kullanılarak ulaşılabilir uzaklıklar beri. Bu nedenle, bu gibi dizi tedavi edecek 1, $obj['parent_id'][1].

(3) increment a string offset $string[1]++ sizin ölümcül bir hataya neden olacaktır çalışılıyor:

PHP Ölümcül hata: increment / eksiltme nesneleri aşırı olamaz, ne de string offsets in ... on line ...

PHP de hata konumu, yani dosya adı ve satır numarası işaret eder. Senin sorunun açıklamasından bu kısmı atlanmış. Bir dahaki sefere hata kaynağıdır kod parçacığını olan satırı bize anlatarak bu bilgileri de lütfen!

Senin kod karmaşa biraz olduğunu düşünüyorum!

//What did you think here? (!empty() == 0)
while ($obj = mysqli_fetch_assoc($dbc)) {
        if (!empty($obj['parent_id']) == 0) {
                // Echo with assignment trying to save variables?
                echo $parent_menu . $obj['id']['label'] = $obj['label'];
                echo $parent_menu . $obj['id']['link'] = $obj['link_url'];
        } else {
                echo $sub_menu . $obj['id']['parent'] = $obj['parent_id'];
                echo $sub_menu . $obj['id']['label'] = $obj['label'];
                echo $sub_menu . $obj['id']['link'] = $obj['link_url'];
                echo $parent_menu . $obj['parent_id']['count']++;
        }
}

Ben senin tarzını yargılamak değilim, ama ben size kod stilini değiştirmek eğer hataları izlemek için çok daha kolay olacağını düşünüyorum.

The problem is at $obj['parent_id']['count']++; This is not a number and cannot use increment. $obj['parent_id'] is not even an array that has 'count' element. Moreover if you want to create a counter this will probably be deleted in the next loop as you save it on $obj variable which will be overwritten.

Ben böyle bir şey, ya da gerek bence. Eğer if fıkrasında ne istediğini tam kriterleri çözemiyorum. Veya tam olarak ne sayacı saymak istiyor? Parent_ids toplamı veya parent_id miktarı.

$counter = 0;
while ($obj = mysqli_fetch_assoc($dbc)) {
        if (empty($obj['parent_id'])) {
                echo $parent_menu . $obj['label'];
                echo $parent_menu . $obj['link_url'];
        } else {
                echo $sub_menu . $obj['parent_id'];
                echo $sub_menu . $obj['label'];
                echo $sub_menu . $obj['link_url'];
                echo $parent_menu . ($counter++);
        }
}

Bu yardımcı umut

                echo $parent_menu . $obj['parent_id']['count']++;

Sadece yeni bir satıra artış adım hareket.