anpera.net
https://anpera.dyndns.org/phpbb3/

Problem mit unserialize() bei ' oder " im String
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=5105
Seite 1 von 1

Autor:  Silva [ Mi 17 Feb, 2010 19:18 ]
Betreff des Beitrags:  Problem mit unserialize() bei ' oder " im String

Hallo zusammen,

ich bin beim Programmieren über ein Problem gestolpert, das ich irgendwie nicht gelöst bekomme. Und zwar möchte ich längere Texte (also gewöhnliche Strings) als serialisiertes Array in meiner Datenbank speichern und abrufen - was auch soweit klappt. Wenn allerdings in einem dieser Strings ' oder " vorkommen, gibt mir unserialize() false zurück anstatt des Arrays. Ich hab bereits versucht, beides zu escapen (zuerst mit addslashes(), dann mit mysql_real_escape_string()) - und als das nicht funktionierte, habe ich sogar zur Funktion htmlspecialchars() gegriffen, um so sämtliche Störfaktoren aus den Strings zu bekommen. Geholfen hat's leider nicht, bekomme weiterhin false zurück. Habt ihr eine Idee, wie ich dieses Problem lösen kann? Hab schon einige andere Threads in diesem Forum zu ähnlichen Themen durchstöbert, aber leider keine Lösung gefunden.

Cheers,
Silva

(Meinen Server findet ihr hier. Unten stehenden Code findet ihr in der bio.php, gespeichert werden die Strings in der prefs_new.php. Mein Server hat die Dragonslayer Edition V2.5 als Basis.)

Uhm.. an Code gibt es ja nicht viel, eigentlich nur diesen hier:

PHP:
$result2 = db_query("SELECT xcharbios FROM account_extra_info WHERE acctid=".$row['acctid']);
$row2 = db_fetch_assoc($result2);
$xcbios2 = unserialize($row2['xcharbios']);

Und in der Datenbank steht das hier:
a:2:{s:9:"xcharbio1";s:11:"muh "";s:9:"xcharbio2";s:2:"hu";}

Sagt mir einfach, was ihr noch braucht, ich poste es dann umgehend.

Autor:  Harthas [ Mi 17 Feb, 2010 20:24 ]
Betreff des Beitrags:  Re: Problem mit unserialize() bei ' oder " im String

Eigentlich sollte serialize mit Single-Quotes und Double-Quotes zurecht kommen.
Könntest du ev. mal zeigen, wie ein solches Text-Array aussieht, und wie du es serialisierst, speicherst?

Autor:  Silva [ Mi 17 Feb, 2010 20:33 ]
Betreff des Beitrags:  Re: Problem mit unserialize() bei ' oder " im String

Voilà:

PHP:
// 1. X-Charbio
if(isset($_POST['xcharbio1']) && $rowex['biotime'] != BIO_LOCKED)
{
$long = preg_replace('/\r\n|\r|\n/', '', $_POST['xcharbio1']); // Zeilenumbrüche raus
$max_l = getsetting('xcharbiomaxlength',4096);
$long = substr($long,0,$max_l);
$xcbios['xcharbio1'] = stripslashes($long);
$array_aei_changes['xcharbios']['xcharbio1'] = htmlspecialchars($long);
$array_aei_changes['biotime'] = date("Y-m-d H:i:s");
}
[...]
if( sizeof($array_aei_changes) > 0 )
{
if (isset($array_aei_changes['xcharbios']['xcharbio1']))
{
$array_aei_changes['xcharbios'] = serialize($array_aei_changes['xcharbios']);
}
user_set_aei($array_aei_changes);
}

Funktion user_set_aei():
PHP:
function user_set_aei ($changes,$acctid=0,$where="") {

global $session;

if(!sizeof($changes)) {return(false);}

$acctid = ($acctid == 0 ? $session['user']['acctid'] : $acctid);

$sql = "UPDATE account_extra_info SET acctid=acctid";

foreach($changes as $field => $val) {

$sql .= ",".$field." = '".$val."'";

}

$sql .= " WHERE ".($acctid > 0 ? " acctid=".$acctid : "").($where != "" ? $where : "")." LIMIT 1";

$res = db_query($sql);

return( db_affected_rows() );

}


edit: Das kommt davon, wenn man zu früh abschickt... -.-
Was genau meinst du mit "wie ein solches Text-Array aussieht"? Ein Beispiel habe ich ja oben schon gepostet. Das Datenbank-Feld selbst ist ein Textfeld.

Autor:  Silva [ Fr 19 Feb, 2010 21:23 ]
Betreff des Beitrags:  Re: Problem mit unserialize() bei ' oder " im String

Des Rätsels Lösung:

PHP:
function mb_unserialize($serial_str)
{
$serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
//$serial_str= str_replace("\r", "", $serial_str);
//$serial_str= str_replace("\n", "", $serial_str);
return unserialize($serial_str);
}

Hier gefunden.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/