Oggi mi è capitato che un dato serializzato e memorizzato sul DB, non mi venisse de-serializzato ed un errore del tipo:

codice:
 Error at offset 45393 of 65533 bytes ...
era ritornato in output.

Cercando sulla rete ho trovato la causa di errori di questo tipo che generalmente capitano quando il valore numerico di lunghezza del campo non corrisponde alla lunghezza effettiva del campo.

Ho quindi creato questa semplice funzione che corregge la stringa serializzata passata in ingresso restituendone una versione corretta.

La condivido con voi nel caso possa servire a qualcuno:

Codice PHP:
function correctSerialized($str){
   
preg_match_all ('/s:([0-9]+):"(.*?)"/',$str,$totals);
   
$totals $totals[0];
                
   foreach (
$totals as $info){
      
$sTemp explode(":",$info);
      
$sTemp[2] = str_replace('"','',$sTemp[2]);
      if (
$sTemp[1] != strlen($sTemp[2])){
         
$old 's:'.$sTemp[1].':"'.$sTemp[2].'"';
         
$new 's:'.strlen($sTemp[2]).':"'.$sTemp[2].'"';
         
$str str_replace ($old,$new,$str);          
      }
    }
    return 
$str;

In pratica la funzione utilizza una espressione regolare per controllare il valore numerico del campo con la sua effettiva lunghezza. Se i due valori non corrispondono, controlla la lunghezza e ricrea il pezzo di stringa da sostituire.

Ciao e alla prossima...