Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сериализованный массив в БД
 
 автор: alba   (19.03.2007 в 09:49)   письмо автору
 
 

Здравствуйте.
В текстовом поле таблицы БД храню в сериализованном виде масив с информацией о закаченных пользователем файлах, структура массива следующая: 'newname' => 'сгенерированное имя файла', 'name' => 'старое имя файла', 'note' => 'примечание к файлу'

Cначала пользователь прикрепляет файлы (точно также, как и на mail.ru, т.е. выбираешь файл -> кнопка "Прикрепить", потом снова выбрать файл ->прикрепить и т.д.), информация об этих файлах помещается в массив и записывается в сессию следующим образом:


$_SESSION["files"]=serialize($fls);


Затем, после того как все файлы прикреплены, массив помещается в БД следующим образом:

$fls=addslashes($_SESSION["files"]);
далее запись $fls в бд...


так вот, когда я выбираю все записи связанные с конкретным пользователем (их в бд может быть много, соответственно и массивов с инфой о закаченых файлах тоже может быть много ), и вывожу их в цикле, то чтение из результата выборки идет нормально до тех пор, пока не попадется запись с массивом хранящим информацию о файлах НЕ изображениях, т.е. если пользователь загружал изображения, то все нормально, а если это файл zip или какой другой, то цикл чтения результата выборки прерывается... хотя если не производить чтения поля с сериализованым масивом, то цикл отрабатывает до конца... Чтение массива произвожу следующим образом:

$fls=$answers->files_answer!="" ? unserialize($answers->files_answer) : array();


Я думаю причина ошибки не в том какие файлы загружал, пользователь, а в чем-то другом, может я не так записываю массив в БД... Подскажите пожалуйста, как правильно записать сериализованный массив в БД и извлеч его...

   
 
 автор: Alba   (19.03.2007 в 09:57)   письмо автору
 
   для: alba   (19.03.2007 в 09:49)
 

А щас еще выдал ошибку :
Notice: unserialize() [function.unserialize]: Error at offset 87 of 126 bytes in... в строке

$pics=$answers->files_answer!="" ? unserialize($answers->files_answer) : array();


Я так понимаю это что-то с магическими кавычками связано...

   
 
 автор: Trianon   (19.03.2007 в 10:13)   письмо автору
 
   для: alba   (19.03.2007 в 09:49)
 

Какого типа поле используется для хранения массива?

   
 
 автор: Alba   (19.03.2007 в 10:17)   письмо автору
 
   для: Trianon   (19.03.2007 в 10:13)
 

типа TEXT

   
 
 автор: Trianon   (19.03.2007 в 10:23)   письмо автору
 
   для: Alba   (19.03.2007 в 10:17)
 

лучше бы тип BLOB выбрать....
А размер достаточный?

   
 
 автор: Alba   (19.03.2007 в 10:26)   письмо автору
 
   для: Trianon   (19.03.2007 в 10:23)
 

размер достаточный... я явно не задавал его
А что за тип BLOB? я никогда его не использовал..

   
 
 автор: Trianon   (19.03.2007 в 10:32)   письмо автору
 
   для: Alba   (19.03.2007 в 10:26)
 

binary large object block - блок данных, структура которых определяется приложением - фактически то, что у Вас и происходит.

   
 
 автор: Alba   (19.03.2007 в 10:42)   письмо автору
 
   для: Trianon   (19.03.2007 в 10:32)
 

изменил тип и всеравно глюки...

   
 
 автор: Trianon   (19.03.2007 в 10:46)   письмо автору
 
   для: Alba   (19.03.2007 в 10:42)
 

Дамп таблицы можете привести? Лучше - аттачем.

   
 
 автор: Alba   (19.03.2007 в 10:57)   письмо автору
889 байт
 
   для: Trianon   (19.03.2007 в 10:46)
 

держите...

   
 
 автор: Alba   (19.03.2007 в 11:04)   письмо автору
 
   для: Alba   (19.03.2007 в 10:57)
 

я делаю компонент конкурсов. нужно чтобы участники в рамках конкурса могли либо отвечать на вопросы в произвольной форме, либо отвечали на вопросы с вариантами ответов (тест типа) или же могли прикрепить файлы (прикольные фото, программы и т.д.)... ответы соответственно хранятся в полях: txt_answer, test_answer и files_answer. так же в этой таблице id конкурса и id участника

   
 
 автор: Alba   (19.03.2007 в 11:32)   письмо автору
 
   для: Alba   (19.03.2007 в 11:04)
 

ну кто-нибудь поможет мне?
я уже два дня с этой херью потерял, уже бесюся...

   
 
 автор: Trianon   (19.03.2007 в 12:18)   письмо автору
 
   для: Alba   (19.03.2007 в 11:32)
 


<?php
include ('config.inc.php');

$sql "SELECT * FROM ngt_con_answers";
$res mysql_query($sql);

for(
$base = array(); $row mysql_fetch_assoc($res); $base[$row['id']] = $row)
    if(isset(
$row['files_answer']) && $row['files_answer'] != 0)
        
$row['files_answer_array'] = $x unserialize($row['files_answer']);
echo 
'<pre>';
print_r($base);

?>


Всё идет.
Одного не понимаю. Зачем вместо сериализированного объекта ноль в поле вписывать.
90% времени на этом убил.

   
 
 автор: Alba   (19.03.2007 в 12:23)   письмо автору
 
   для: Trianon   (19.03.2007 в 12:18)
 

Спасибо. Ща попробую

>Одного не понимаю. Зачем вместо сериализированного объекта ноль в поле вписывать.
>90% времени на этом убил.

да это я когда тип поля на blob, а потом обратно на текст менял нули сами подставились, а я даже и не подумал их убрать... :)

   
 
 автор: Alba   (19.03.2007 в 12:37)   письмо автору
 
   для: Alba   (19.03.2007 в 12:23)
 

Чет вообще гон какой-то...
Заменил вот это:

for($j=0, $n=count($pics); $j<$n; $j++){
    $pic=$pics[$j];


вот на это:

foreach($pics as $pic){


и все заработало...

А ваш код оказался точно таким же как и мой, только написан немного подругому...

   
 
 автор: Trianon   (19.03.2007 в 12:40)   письмо автору
 
   для: Alba   (19.03.2007 в 12:37)
 

Совершенно естественно, если элементы в массив укладывались по строковым ключам, а не нарастающим от нуля числовым индексам.

   
 
 автор: Alba   (19.03.2007 в 12:56)   письмо автору
 
   для: Trianon   (19.03.2007 в 12:40)
 

вот именно что по числовым индексам, вот что вывел print_r:

Array ( [0] => Array ( [newname] => usr_1174297814.jpg [name] => ЭТО ТОЖЕ.jpg [note] => Фотка ) 
[1] => Array ( [newname] => usr_1174297826.jpg [name] => моя фото.jpg [note] => Еще фотка ) 
[2] => Array ( [newname] => usr_1174297845.jpg [name] => ЭТО ТОЖЕ.jpg [note] => Третья фотка ) )

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования