2014-07-09 4 views
1

Я пытаюсь вставить большой сериализованный объект в базу данных MySQL, используя PDO. Попытка вставить непосредственно дает:Как вставить сжатые данные с помощью PDO?

PDOStatement::execute() [pdostatement.execute]: SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_packet_allowed' bytes

Там, кажется, несколько возможных способов решения этого, но моя первая липкость является gzcompress, в результате чего его вниз от 2383731 до 155955 байт (используя уровень сжатия 6). Но я теперь изо всех сил, чтобы вставить результат по другой причине:

PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lob) VALUES ('[некоторые двоичные данные свергнула здесь]'

Вот основная суть кода:

$value = gzcompress(serialize($lob)); 
    $stmt = $conn->prepare("INSERT INTO saved (lob) VALUES (:value)"); 
    $stmt->bindParam(':value', $value, PDO::PARAM_LOB); 
    $stmt->execute(); 

Примеры в documentation все, кажется, используют потоки файлов, а не двоичные данные, хранящиеся в строке, поэтому не уверен, что это действительно. Может ли кто-нибудь посоветовать?

+1

Какое значение имеет [PDO :: ATTR_EMULATE_PREPARES] (http://www.php.net/manual/en/pdo. setattribute.php)? Взгляните на http://stackoverflow.com/questions/10113562/pdo-mysql-use-pdoattr-emulate-prepares-or-not (принятый ответ). – VMai

+0

Не уверен, что он по умолчанию, но попытался установить его как true, так и false и увидел ту же ошибку для обоих. –

ответ

1

ошибка звучит, как вам нужно добавить кавычку вокруг имени поля:

INSERT INTO saved (`lob`) VALUES (:value) 
+0

Отлично! Фактическое имя столбца было «все», но изменило имена здесь, чтобы защитить невинных, - моя собственная глупость, забыв, что «все» - [зарезервированное слово] (http://dev.mysql.com/doc/refman/5.0 /en/reserved-words.html). Большое спасибо. –

+1

Я был reculant, чтобы опубликовать это, потому что lob зарезервирован только в oracle, но отлично: D – meda

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