Эта тема на forum.dklab.ru


Дмитрий К.: Примитивная ошибка, объясните, pls!
Добрый день!
Вот дочитал книгу Д.Котерова "Самоучитель PHP4" до описания гостевухи (генератор данных).
Денвер установил + PHP ExpertEditor. Всё работает.
Но вот никак не пойму, в чём ошибка, когда запускаю скрипт, выдаётся: Fatal error: Unsupported operand types in z:\home\localhost\www\gbook.php on line 20

Скрипт почти такой же, как в книге:

<?php

define("gbook","gbook.dat");
define("counter","counter.dat");

function loadbook()
{ $f=@fopen(gbook,"rb"); if(!$f) return array();
$book=unserialize(fread($f,1000000)); fclose($f);
return $book;
}

function savebook()
{ $f=fopen(gbook,"wb");
fwrite($f,serialize($book));
fclose($f);
}

$book=loadbook();
if(!empty($add)) {
$book=array(time()=>$last)+$book; // Вот это и есть строка №20
savebook();
}

foreach($book as $id=>$entry) {
echo("Время: $id, Имя: $entry, Сообщение: $entry");
}

?>

Запускал всё это на localhost, и на бесплатном сервере с php (h12.ru) - везде та же ошибка.
Подскажите, пожалуйста, начинающему, в чем ошибка?

На всякий случай: из формы идут такие переменные:
name="last" (имя)
name="last" (сообщение)
name="add" кнопка отправить.

Спасибо, буду рад услышать ответы!
BikerSoul:
echo $out = array() + unserialize(serialize("stroka"));
echo $out = "ok ".unserialize(serialize("stroka"));

видите разницу?
Дмитрий К.:
Я так понимаю, Вы имеете ввиду, что к массиву нельзя прибавлять строку? Строки соединяются точкой, массивы - плюсиком?
Я вообще убрал "+$book" из строки 20. Теперь всё работает, вот только создаваемый файл gbook.dat как создаётся размером в 2 байта, так и остаётся таким, хотя, как я понимаю, скрипт должен сериализовать в него массив $book. Почему он этого не делает? На экран вроде выводит всё корректно (только в функции savebook() не совсем понятно почему пришлось перед $book поставить @, вроде скрипт обращается к определению функции уже после того, как $book был определён???).
И ещё такие соображения: и всётаки чем плоха строка $book=array(time()=>$last)+$book; ? (может я невнимательно читал книгу?)
loadbook() возвращает массив $book, array(time()=>$last) - тоже массив. Как их ещё по другому-то складывать. Или проблема в том, что при первом открытии в файле gbook.dat ничего нет, поэтому нечего превращать в массив и возвращается пустая строка? А как тогда это обойти? Писать без этих функций?
bæv:
массивы - плюсиком?
Это Вы откуда взяли?
Дмитрий К.:
Д.Котеров "Самоучитель PHP4", Глава 10.Ассоциативные массивы, Слияние массивов...стр.173: "...слияние массивов, т.е. создание массива, содержащего как элементы одного, так и другого массива. Реализуется это при помощи оператора +..."
Еще есть на эту тему в главе 13.Работа с массивами, Слияние массивов...стр.232, но там написано, что функцию array_merge нужно использовать вместо плюса преимущественно в списках.
Дмитрий Котеров:
Все правильно, "+" можно использовать для массивов. У Вас где-то еще ошибка. Попробуйте поставить в разных местах скрипта команды:
echo "<pre>"; print(r(переменная); echo "</pre>";
и посмотреть, что будет выдаваться.
Dmitri R. S.:
Дмитрий Котеров:
Очепятка в коде: print_r, а не print(r
Константин Жинько [tIT]:
Лучше var_dump(переменная1, переменная2, переменная3...[, переменнаяN])
Дмитрий К.:
Ну проверил. Вот таким образом:

define("gbook","gbook.dat");

function loadbook()
{ $f=@fopen(gbook,"rb"); if(!$f) return array();
$book=unserialize(fread($f,1000000)); fclose($f);
return $book;
}

function savebook()
{ $f=fopen(gbook,"wb");
fwrite($f,serialize(@$book));
fclose($f);
}

$book=loadbook();
echo "<pre>"; print_r($book); echo "</pre>";
var_dump($book);
if(!empty($add)) {
$book=array(time()=>$last); // +$book пока убрал.
echo "<pre>"; print_r($book); echo "</pre>";
var_dump($book);
savebook();
}

В первом случае $book даёт Null, во втором - корректный ассоциативный массив. Теперь вопросы:
1) Почему savebook() не сохраняет $book-массив? Судя по нейзменности файла gbook.dat, сохраняется либо $book=Null, либо вообще ничего не происходит.
2) Как всё-таки поступить со сложением массивов? Null как я понял нельзя прибавить к ассоциативному массиву? И зачем нужна строка return array(); ?
Господа, пожалуйста, прочитайте код программы и сообщите об ошибке, как мне представляется, для Вас в отличие от меня, должно сразу стать понятным, в чём проблема. А, самое главное, как можно подкорректировать код, чтобы всё заработало?
Спасибо!
Dmitri R. S.:
tIT:
[оффтопик]
var_dump стоит использовать для проверки типов.
Если надо просто читать массив - print_r более читабельный, имхо. Даже в мане так написано :)
[/оффтопик]
bæv:
должно сразу стать понятным, в чём проблема
Честно: мне понятно, когда код через кнопочку "Вставить код" вставляют, а так -- я путаюсь.
Дмитрий Котеров:
savebook();
Вы в параметрах $book не передаете. Вот она ничего и не сохраняет.
Дмитрий К.:
Да, спасибо, я вчера разобрался. Не совсем понятно, почему тогда зацикливание было раньше, чем обращение к savebook(), ну да ладно, надеюсь, потом дойдёт.
Всем спасибо, тему закрываю!

Вопрос решен, тему можно закрыть.

Эта тема на forum.dklab.ru