AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein PHP: Problem mit serialize() und unserialize()
Thema durchsuchen
Ansicht
Themen-Optionen

PHP: Problem mit serialize() und unserialize()

Ein Thema von alcaeus · begonnen am 22. Jul 2005 · letzter Beitrag vom 22. Jul 2005
Antwort Antwort
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

PHP: Problem mit serialize() und unserialize()

  Alt 22. Jul 2005, 00:26
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

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

  Alt 22. Jul 2005, 08:38
ich kann mich noch dran erinnern das irgend ein php4 probleme mit der funktion hatte.

check mal das mantis von php.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

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

  Alt 22. Jul 2005, 15:00
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...
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

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

  Alt 22. Jul 2005, 15:10
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz