иногда данные записываются в БД не полностью.

SergXP

Постоялец
Регистрация
8 Мар 2008
Сообщения
66
Реакции
11
Всем привет!

Интересная ситуация, проблема возникает через раз.
Есть некая таблица, и в ней поле `action_text` типа TEXT.

в коде, происходит сжимание массива serialize() и записываем это в поле..

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

Вот пример, неполной записи в поле action_text:
PHP:
a:7:{i:0;s:8:"ljxm1208";i:1;s:33:"Людмила Наурузова";i:2;s:1:"2";i:3;s:2:"65";i:4;s:50:"Вегетарианство и веганство";i:5;s:3:"394";i:6;s:100:"Обоснуйте пожалуйста разве Вы не едите сырые фрукты. п

можете объяснить причину этого? проблема с транзакциями или что?

Спасибо)
 
Глянька в код, может перед заносом в базу скрипт обрезает ее?
 
Всем привет!
Интересная ситуация, проблема возникает через раз.
Есть некая таблица, и в ней поле `action_text` типа TEXT.
в коде, происходит сжимание массива serialize() и записываем это в поле..
так вот, иногда нормально, иногда не полностью.
Вот пример, неполной записи в поле action_text:
PHP:
a:7:{i:0;s:8:"ljxm1208";i:1;s:33:"Людмила Наурузова";i:2;s:1:"2";i:3;s:2:"65";i:4;s:50:"Вегетарианство и веганство";i:5;s:3:"394";i:6;s:100:"Обоснуйте пожалуйста разве Вы не едите сырые фрукты. п
можете объяснить причину этого? проблема с транзакциями или что?
Спасибо)
1)Прежде чем говорить о транзакциях, не сочтите за труд привести тип используемой таблицы и вообще СУБД.
2) Какой стоит формат строк(динамический, статический или сжатый) в таблице? Возможно указан максимальный размер для записи в колонку и записываемые данные обрезаются до максимально допустимой величины.
 
Mysql, MyISAM, динамический
проблема в одном из методов класса:
PHP:
	// THIS METHOD CREATES AN EXCERPT FROM TEXT
	// INPUT: $body REPRESENTING THE TEXT TO RETRIEVE THE EXCERPT FROM
	//	  $chars (OPTIONAL) REPRESENTING THE NUMBER OF CHARACTERS FOR THE EXCERPT
	// OUTPUT: A STRING WITHOUT HTML REPRESENTING THE EXCERPT FOR THE BODY OF TEXT
	function forum_excerpt($body, $chars = 100) {
	  global $database;
	  // HTMLSPECIALCHARS_DECODE
	  $body = htmlspecialchars_decode($body, ENT_QUOTES);
	  // GET RID OF EXCESS WHITE SPACE
	  $body = preg_replace('/\s\s+/', ' ', $body);
	  // GET RID OF HTML
	  $body = strip_tags($body);
	  // GET RID OF BBCODE (QUOTES AND SUCH)
	  $body = $this->forum_quote_regex($body);
	  // TRUNCATE TO $chars
	  $body = substr($body, 0, $chars);
	  // HTMLSPECIALCHARS
	  $body = htmlspecialchars($body, ENT_QUOTES);
	  // RETURN EXCERPT
	  return $body;
	} // END forum_excerpt() METHOD
	// RECURSIVE REGEX ESCAPE
	// INPUT: 
	// OUTPUT:
	function forum_quote_regex($string) {
	  $regex = '/\[quote\=[^\]]*?\](.*?\[\/quote\])/is';
	  while(preg_match($regex, $string, $matches)) {
	    if(preg_match($regex, $matches[1], $new_matches)) {
	      $string = str_replace($matches[1], $this->forum_quote_regex($matches[1]), $string);
	    } else {
	      $string = str_replace($matches[0], ' ', $string);
	    }
	  }
	  return $string;
	} // END forum_excerpt() METHOD
вызывается:
PHP:
$msg = forum_excerpt($body);
после этого, уже массив вида
PHP:
$excerpt = Array($user->user_info['user_username'],
                 $user->user_displayname,
                 $forum_id,
                 $topic_id,
                 $topic_title,
                 $forumpost_id,
                 $msg);
$excerpt = serialize($excerpt);
в этот момент $excerpt просто не полный, массив не закрывается..
проверил, $msg = "okokokok"; все норм, массив сразу закрывается и записывается корректно.. значит проблема в одной из ф-нции,
указанные выше..

хм.. странно, нашел причину..
PHP:
 $body = strip_tags($body);
после этой обработки, массив криво обрабатывается через serialize..
 
function forum_excerpt($body, $chars = 100) {
.....
$body = substr($body, 0, $chars);
......
}
Итого 100 символов в БД а остальные курят :)
 
транзации нормально работают только на MySQL5 c InnoDB
тут может быть косяк если UTF8 и перезагружается mb_string поверх $body = substr($body, 0, $chars);
вместо $body = strip_tags($body); используй свою функцию, она сможет больше отфильтровать.
 
Назад
Сверху