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

Тема в разделе "PHP", создана пользователем SergXP, 8 мар 2011.

Модераторы: latteo
  1. SergXP

    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:"Обоснуйте пожалуйста разве Вы не едите сырые фрукты. п
    можете объяснить причину этого? проблема с транзакциями или что?

    Спасибо)
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    144
    Симпатии:
    107
    Глянька в код, может перед заносом в базу скрипт обрезает ее?
     
  3. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    1)Прежде чем говорить о транзакциях, не сочтите за труд привести тип используемой таблицы и вообще СУБД.
    2) Какой стоит формат строк(динамический, статический или сжатый) в таблице? Возможно указан максимальный размер для записи в колонку и записываемые данные обрезаются до максимально допустимой величины.
     
  4. SergXP

    SergXP Постоялец

    Регистр.:
    8 мар 2008
    Сообщения:
    66
    Симпатии:
    11
    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($bodyENT_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($body0$chars);
          
    // HTMLSPECIALCHARS
          
    $body htmlspecialchars($bodyENT_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..
     
  5. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    function forum_excerpt($body, $chars = 100) {
    .....
    $body = substr($body, 0, $chars);
    ......
    }
    Итого 100 символов в БД а остальные курят :)
     
  6. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    транзации нормально работают только на MySQL5 c InnoDB
    тут может быть косяк если UTF8 и перезагружается mb_string поверх $body = substr($body, 0, $chars);
    вместо $body = strip_tags($body); используй свою функцию, она сможет больше отфильтровать.