Справка по фатальной ошибке PHP - PullRequest
0 голосов
/ 26 октября 2009

Я получаю следующую ошибку.

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

Вот код.

$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);

Ответы [ 3 ]

1 голос
/ 26 октября 2009

Грег указал на вашу проблему: вы пытаетесь увеличить смещение строки count значения строки:

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

Вот что делает PHP:

(1) Оценить $obj['parent_id'], что приведет к строке.

(2) Попытка получить offet "count" из этой строки. Здесь возникает главный недостаток PHP: поскольку строки имеют смещения, к которым можно обращаться, используя обозначения в скобках для извлечения одиночных символов, PHP будет молча преобразовывать "count" в целое число . Следовательно, она будет обрабатывать строку как 1: $obj['parent_id'][1].

(3) Попытка увеличить смещение строки $string[1]++ приведет к вашей фатальной ошибке:

PHP Фатальная ошибка: невозможно увеличить / уменьшить перегруженные объекты или смещения строк in ... on line ...

PHP также укажет вам место вашей ошибки, а именно имя файла и номер строки. Вы пропустили эту часть в описании проблемы. В следующий раз, пожалуйста, включите эту информацию, сообщив нам, какая строка в вашем фрагменте кода является источником ошибки!

1 голос
/ 26 октября 2009

Ваш $obj['parent_id'] - это строка (содержащая число, например, "0") - это не массив с записью count. Это будет иметь больше смысла:

$obj['parent_id']++

Также на заметку, это очень запутанно:

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

Это будет иметь больше смысла:

if (empty($obj['parent_id'])) {
0 голосов
/ 26 октября 2009

Я думаю, что ваш код немного беспорядок!

//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']++;
        }
}

Я не оцениваю ваш стиль, но думаю, что если вы измените свой стиль кода, вам будет намного легче отслеживать ошибки.

Проблема в $obj['parent_id']['count']++; Это не число и не может использовать приращение. $obj['parent_id'] - это даже не массив, в котором есть элемент count. Более того, если вы хотите создать счетчик, он, вероятно, будет удален в следующем цикле, поскольку вы сохраните его в переменной $obj, которая будет перезаписана.

Я думаю, тебе нужно что-то подобное или нет. Не могу понять, какие именно критерии вы хотите в предложении if. Или что именно счетчик хочет посчитать? Сумма parent_ids или количество parent_id.

$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++);
        }
}

Надеюсь, это помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...