2010-08-13 2 views
0

Я пытаюсь получить дату, предоставленную через POST, а затем сформировать список дат за 12-недельный период с указанной даты начала. Эти даты затем войдут в БД, и будет выведено 12-недельное расписание, с которым пользователь может взаимодействовать (добавлять/редактировать/удалять).Проблемы с serialize() и unserialize() - вставка и выбор данных PHP MySQL

Я успешно с датой начала, генерация списка дат 12 недель и добавить это в БД в последовательной форме, но когда дело доходит до выбора даты для отображения, я получаю следующее сообщение об ошибке:

Notice: unserialize() [function.unserialize]: Error at offset 0 of xxx bytes in ... 

Вот мой код:

первый .php файл здесь, чтобы принять форму входа (даты), а затем получить список каждой даты в течение 12-недельного периода с даты начала и вставьте в БД:

Массив:

$start = strtotime($_POST['Start_Date']); 
$dates=array(); 
for($i = 0; $i<=84; $i++) 
{ 
    array_push($dates,date('Y-m-d', strtotime("+$i day", $start))); 
} 

$savetodb = serialize($dates); 

Вставка:

$sql = "INSERT INTO programme VALUES (NULL, '20', '".$_POST["Start_Date"]."' , ' ".$savetodb." ', '".$_POST["Programme_Notes"]."')"; 

второй .php файл здесь - ВЫБОР и десериализации:

$result = mysql_query("SELECT Programme_Dates FROM programme"); 

while($row = mysql_fetch_array($result)) 
    { 
    $dates = unserialize($row["Programme_Dates"]); 
    echo $dates; 

    } 

Из того, что я прочитал, что проблема может быть связана с колонкой DB, где сериализованный массив вставлен (т. е. слишком мал), но он установлен в TEXT, так что это должно быть правильно? Я также думал, что могут быть определенные символы в дате, вызывающие проблемы, но при тестировании с помощью «регулярного» массива (т.е. только текста) я получаю те же ошибки.

Любые предложения/подсказки очень ценятся, спасибо.

+0

Почему вы называете 'stripslashes'? Вы работаете с магическими кавычками? Ваш код, похоже, уязвим для [SQL injection] (http://en.wikipedia.org/wiki/SQL_injection). – Charles

+0

К сожалению, этого не должно быть - отредактировано, спасибо – Dave

+0

Вы проверили, что на самом деле находится в базе данных? Вы проверили значение $ row ["Programme_Dates"] после чтения из базы данных? Согласны ли они с тем, что, по вашему мнению, помещается в базу данных? – Craig

ответ

2

Почему вы используете стрипы? Моя ставка - вот в чем проблема. Удалите это оттуда и посмотрите, работает ли он.

В качестве побочного примечания следует избегать полос скольжения, как если бы данные, вероятно, были вставлены в базу данных, они должны быть экранированы должным образом, что не должно добавляться лишние косые черты. Если вам нужно сделать stripslashes из самих данных, я бы предложил использовать что-то вроде array_filterпосле вы несериализировали массив.

EDIT

Вы также должны смотреть в SQL Injection и как предотвратить это, так как ваш код suseptible для эксплуатации.

UPDATE

Заглядывая в коде вставки сериализированного массива с 2 дополнительными пробелами: ' ".$savetodb." ', попробуйте использовать только '".$savetodb."',, что и посмотреть, если это исправляет проблему.

+0

Спасибо - удалены полосы (которые не должны были быть там в первую очередь). Тем не менее те же ошибки, хотя – Dave

+0

Смотрите инструкцию о дополнительных пробелах. –

+0

Хорошо, теперь мы куда-то попадаем! Изъятие лишних пространств предполагало исправление ошибки. Теперь я получаю «Массив» в отличие от дат - сейчас должен исследовать это. Большое спасибо! – Dave

0

Я обнаружил, что значение сериализации, хранящееся в базе данных, преобразуется в другой формат. Поскольку в сериализованном хранилище данных используются метки кавычек, точка с запятой, скобка culry, mysql необходимо сохранить самостоятельно, поэтому он автоматически помещает «обратную косую черту»(), которая поступает из gpc_magic_quotes (CMIIW). Поэтому, если вы храните сериализованные данные и хотите использовать их, в интерфейсе вы должны использовать html_entity_decode(), чтобы убедиться, что у вас есть реальный формат, читаемый PHP.

здесь был мой пример:

$ser = $data->serialization; // assume it is the serialization data from database 
$arr_ser = unserialize(html_entity_decode($ser)); 

пи: Я попробовать и это работает, и убедитесь, что избежать этого типа должен храниться в таблицах (рискованно). таким образом, можно решить формат json, хранящийся в таблице.

Смежные вопросы