Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक क्रमबद्ध स्ट्रिंग की मरम्मत कैसे करें जो गलत बाइट गिनती लंबाई से दूषित हो गई है?

unserialize() [function.unserialize]: Error at offset invalid serialization data के कारण बकाया था अमान्य लंबाई के कारण

त्वरित सुधार

आप क्या कर सकते हैं recalculating the length . है क्रमबद्ध सरणी में तत्वों की

आप वर्तमान क्रमबद्ध डेटा

$data = 'a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15:"submit_comments";s:4:"open";s:5:"image";s:19:"C:fakepath100.jpg";}';

बिना पुनर्गणना के उदाहरण

var_dump(unserialize($data));

आउटपुट

Notice: unserialize() [function.unserialize]: Error at offset 337 of 338 bytes

पुन:गणना करना

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data);
var_dump(unserialize($data));

आउटपुट

array
  'submit_editorial' => boolean false
  'submit_orig_url' => string 'www.bbc.co.uk' (length=13)
  'submit_title' => string 'No title found' (length=14)
  'submit_content' => string 'dnfsdkfjdfdf' (length=12)
  'submit_category' => int 2
  'submit_tags' => string 'bbc' (length=3)
  'submit_id' => boolean false
  'submit_subscribe' => int 0
  'submit_comments' => string 'open' (length=4)
  'image' => string 'C:fakepath100.jpg' (length=17)

सुझाव .. मैं

इस तरह के त्वरित सुधार का उपयोग करने के बजाय ... मैं आपको सलाह दूंगा कि आप प्रश्न को

. से अपडेट करें
  • आप अपने डेटा को कैसे क्रमांकित कर रहे हैं

  • आप इसे कैसे सहेज रहे हैं ..

=============================संपादित करें 1 ==============================

त्रुटि

दोहरे उद्धरण " . के उपयोग के कारण त्रुटि उत्पन्न हुई थी इसके बजाय सिंगल कोट ' इसीलिए C:\fakepath\100.png C:fakepath100.jpg में कनवर्ट किया गया था

त्रुटि ठीक करने के लिए

आपको बदलना होगा $h->vars['submitted_data'] From (गाने पर काफी ध्यान दें ' )

बदलें

 $h->vars['submitted_data']['image'] = "C:\fakepath\100.png" ;

साथ

 $h->vars['submitted_data']['image'] = 'C:\fakepath\100.png' ;

अतिरिक्त फ़िल्टर

सीरियलाइज़ को कॉल करने से पहले आप इस सरल फ़िल्टर को भी जोड़ सकते हैं

function satitize(&$value, $key)
{
    $value = addslashes($value);
}

array_walk($h->vars['submitted_data'], "satitize");

यदि आपके पास यूटीएफ वर्ण हैं तो आप भी चला सकते हैं

 $h->vars['submitted_data'] = array_map("utf8_encode",$h->vars['submitted_data']);

भविष्य में क्रमबद्ध डेटा में समस्या का पता कैसे लगाएं

  findSerializeError ( $data1 ) ;

आउटपुट

Diffrence 9 != 7
    -> ORD number 57 != 55
    -> Line Number = 315
    -> Section Data1  = pen";s:5:"image";s:19:"C:fakepath100.jpg
    -> Section Data2  = pen";s:5:"image";s:17:"C:fakepath100.jpg
                                            ^------- The Error (Element Length)

findSerializeError समारोह

function findSerializeError($data1) {
    echo "<pre>";
    $data2 = preg_replace ( '!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'",$data1 );
    $max = (strlen ( $data1 ) > strlen ( $data2 )) ? strlen ( $data1 ) : strlen ( $data2 );

    echo $data1 . PHP_EOL;
    echo $data2 . PHP_EOL;

    for($i = 0; $i < $max; $i ++) {

        if (@$data1 {$i} !== @$data2 {$i}) {

            echo "Diffrence ", @$data1 {$i}, " != ", @$data2 {$i}, PHP_EOL;
            echo "\t-> ORD number ", ord ( @$data1 {$i} ), " != ", ord ( @$data2 {$i} ), PHP_EOL;
            echo "\t-> Line Number = $i" . PHP_EOL;

            $start = ($i - 20);
            $start = ($start < 0) ? 0 : $start;
            $length = 40;

            $point = $max - $i;
            if ($point < 20) {
                $rlength = 1;
                $rpoint = - $point;
            } else {
                $rpoint = $length - 20;
                $rlength = 1;
            }

            echo "\t-> Section Data1  = ", substr_replace ( substr ( $data1, $start, $length ), "<b style=\"color:green\">{$data1 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
            echo "\t-> Section Data2  = ", substr_replace ( substr ( $data2, $start, $length ), "<b style=\"color:red\">{$data2 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
        }

    }

}

डेटाबेस में सहेजने का एक बेहतर तरीका

$toDatabse = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RDS पर MySQL इंस्टेंस को स्पिन करने के लिए क्लाउड फॉर्मेशन टेम्प्लेट का उपयोग करें

  2. डेटाबेस, टेबल, कॉलम के संयोजन को कैसे बदलें?

  3. SQLite3 को MySQL में माइग्रेट करने का त्वरित आसान तरीका?

  4. MySQL में रैंक फ़ंक्शन

  5. MySQL:तालिका नहीं बना सकता (त्रुटि:150)