Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PHP: Problem mit serialize() und unserialize() (https://www.delphipraxis.net/50215-php-problem-mit-serialize-und-unserialize.html)

alcaeus 22. Jul 2005 00:26


PHP: Problem mit serialize() und unserialize()
 
Hallo ihr,

ausnahmsweise hab ich auch mal ein php-Problem. Ich versuche grad, ein array mit serialize() in die Datenbank zu schreiben. Zuerst fuelle ich das array:
Code:
$post_history[$count]['subject'] = str_replace("\'", "''", str_replace('"', '\\"', (addslashes($row['post_subject'])));
Da serialize die Daten mit einem " begrenzt, muss ich es quoten, und das laut php-Referenz sogar doppelt, da ein quote-Zeichen anscheinend beim Schreiben in die mySQL-Datenbank draufgeht. Die Daten werden mit einem einfachen serialize() in die Datenbank geschrieben:
Code:
serialize($post_history)
Soweit so gut, es steht auch ein \" in der Datenbank. Wenn ich nun aber laengere Daten in die Datenbank schreibe, die auch nicht unbedingt ein " enthalten, so fehlen mir nach dem Auslesen anscheinend 4 Bytes, und deshalb schlaegt dieser Aufruf fehl:
Code:
$post_history = unserialize($postrow['post_history']);
Die Daten werden in ein LONGTEXT-Feld geschrieben, und auch die Verwendung eines BLOB-Feldes hat nichts gebracht.

Hatte jemand schon mal aehnliche Probleme, oder sonst einen Tipp wie ich das Problem loesen kann?

Greetz
alcaeus

generic 22. Jul 2005 08:38

Re: PHP: Problem mit serialize() und unserialize()
 
ich kann mich noch dran erinnern das irgend ein php4 probleme mit der funktion hatte.

check mal das mantis von php.

Panthrax 22. Jul 2005 15:00

Re: PHP: Problem mit serialize() und unserialize()
 
Salut.

In der Tat; Unserialize verhält sich schon unerwartet, aber man kann es nachvollziehen. (Übrigens ist es in PHP 5 dasselbe wie in PHP 4.) Aber das Paar Serialize und Unserialize versteht seine Rückgaben als gegenseitigen Parameter. Die Problematik ist, die richtigen Escapesequenzen für die SQL-Statements zu generieren.

Hier der Vorschlag "Text entschärfen":

Code:
$StringWithQuotes = 'Ich zitiere: "Ich zitiere: \'...\'"';

// Text entschärfen
$StringWithQuotes = serialize(base64_encode($StringWithQuotes));

print($StringWithQuotes); // testhalber ausgeben

// ab damit in die Datenbank
mysql_connect('localhost','user','password');
mysql_select_db('test');
mysql_query('INSERT INTO alcaeus (TextColumn) VALUES (\''.$StringWithQuotes.'\')');

// und wieder raus aus der Datenbank
$L = mysql_query('SELECT * FROM alcaeus');
while($Row = mysql_fetch_row($L))
{
   print_r($Row);
   $StringWithQuotes = $Row[1];
   print($StringWithQuotes);
   // Text scharf machen
   print(base64_decode(unserialize($StringWithQuotes)));
   print('
');
}
Der wesentliche Punkt ist: Der Text enthält Zeichen bzw. Zeichenkombinationen die Nebeneffekte haben. Es würde genügen diese zu maskieren. Im Vorschlag werden rigeros alle maskiert; mit Base64. Ein anderer Algorithmus, der die Zeichen auf eine Zeichenmenge abbildet, bei der besagte Zeichen bzw. Zeichenkombinationen nicht auftreten würde den selben Zweck erfüllen. Natürlich muss die Abbildung eineindeutig sein.

Alternativ könnte man unter Berücksichtigung des MySQL-Dialekts '`' (accent grave, backtick) als Delimiter verwenden. Also: `Ich zitiere "Ich zintiere '...'"`. Letzteres ist spekulativ. Ich habe es nicht getestet.

Ich hoffe geholfen zu haben.

Panthrax.

P.S.: Ich halte den Missbrauch von Akzenten als Stringdelimiter für eine der schwachsinnigsten Erfindungen. Solch eine Erfindung kann nur aus der anglophonen Welt kommen, wo man wahrscheinlich nicht einmal weiß das "Backtick" und "Fronttick" eigentlich "accent grave" und "accent acute" heißen, um als selbige eingesetzt zu werden. Es gibt und gab genug andere Delimiter und Delimitersysteme die sich bereits etabliert hatten und es noch immer uneingeschränkt sind. Da lob' ich mir Delphi...

alcaeus 22. Jul 2005 15:10

Re: PHP: Problem mit serialize() und unserialize()
 
Hallo ihr,

erstmal danke fuer die Antworten.

Die Loesung mit base64_encode gefaellt mir gut, allerdings werd ich das wahrscheinlich doppelt machen muessen: einmal fuer den Post-Text selbst, und nach dem serialize() nochmal fuer den den gesamten String. Da man pro base64_encode mit ca. 33% mehr Speicherplatzverbrauch rechnen muss, ist das auch nicht das gelbe vom Ei.
Ich werde mal versuchen, die Quotes zu escapen, so dass der String keine Probleme mit serialize() macht. Nach dem Serialize geht dann nochmal ein base64_encode ueber den String drueber, und das sollte dann alles, was in SQL Probleme machen kann, eliminieren. Beim Auslesen dann analog: base64_decode, dann unserialize(), und dann noch die Slashes rauswerfen. Das duerfte dann hoffentlich funktionieren. Ich werds heute Abend irgendwann mal durchtesten und dann Bescheid sagen.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz