anpera.net https://anpera.dyndns.org/phpbb3/ |
|
function is_serialized() https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=4950 |
Seite 1 von 1 |
Autor: | Welv [ Sa 11 Jul, 2009 23:48 ] |
Betreff des Beitrags: | function is_serialized() |
Da ich ne Funktion brauche die mir folgendes ohne NOTICE-Fehler ausgibt... PHP: if(is_array(unserialize($str))) $str=unserialize($str); ...habe ich mir folgendes geschrieben PHP: <php function is_serialized($str){ //Prüft ob ein String mit serialize() serialisiert wurde //regex: fängt mit s an, :, beliebig viele zahlen, :, " oder {, beliebig viele Zeichen, hört mit ; oder } auf if(preg_match("/^s:[\d+]:[\"|\{].*(\;|\})$/", $str)) return true; else return false; } //Beispiel: $array=array("bla",1,array("asdf","fdsa")); $str=serialize($array); if(is_serialized($str)) $array=unserialize($str); ?> Vielleicht braucht sie ja jemand oder hat Verbesserungsvorschläge. |
Autor: | Salator [ So 12 Jul, 2009 02:45 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Einspruch! Wenn du ein Array serialisierst ist das erste Zeichen mit ziemlicher Sicherheit ein a, gefolgt von einem Doppelpunkt und der Anzahl der Elemente. $array=array("bla",1,array("asdf","fdsa")); $str=serialize($array); output($str); Wenn dein erstes Zeichen ein s ist, hast du eine String-Variable serialisiert. $array="test"; $str=serialize($array); output($str); Vielleicht hast du auch eine doppelte Serialisierung drin: $array=array("bla",1,array("asdf","fdsa")); $str=serialize($array); $str=serialize($str); output($str); |
Autor: | Welv [ So 12 Jul, 2009 10:27 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Huch, da is mir wohl irgendwo n Fehler unterlaufen. Danke, ich werds mal umschreiben. |
Autor: | Welv [ So 12 Jul, 2009 11:23 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Neben a für array und s für string, hab ich auch i für integer, b für, ich denke mal, bool (true/false) und d für dezimal? keine ahnung, auf jeden fall für zahl mit kommastelle, gefunden. PHP: function is_serialized($in){
//Prüft ob ein String mit serialize() serialisiert wurde if(is_string($in)){ $array="^a:\d+:\{.*(;})$"; $integer="^i:\d+;$"; $dezimal="^d:\d+\.\d+;$"; $string="^s:\d+:\".*(\";)$"; $bool="^b:(0|1);$"; if(preg_match("/(".$array.")|(".$integer.")|(".$dezimal.")|(".$string.")|(".$bool.")/", $in)) return true; else return false; }else return false; } |
Autor: | Auric [ So 12 Jul, 2009 15:07 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Dir ist aber schon klar, das die Überprüfung per regulärem Ausdruck wahrscheinlich rechenintensiver als eine simple Fehlerunterdrückung oder -Behandlung ist, oder? |
Autor: | Eliwood [ So 12 Jul, 2009 15:53 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Nur so ne Frage. Was spricht eigentlich dagegen, einfach die ersten zwei Buchstaben zu überprüfen? (Und was machst du, wenn ein Objekt serialisiert wurde? ;o) $this->bbcode_second_pass_code('', ' $type = NULL; if($var{1} == ':') { if($var{0} == 'a') $type = 'array'; elseif($var{0} == 's') $type = 'string'; } if($type !== NULL) return true; else return false;') PS: English für "Dezimalzahl" ist float. und f dürfte auch der entsprechende Buchstaben sein... |
Autor: | Chaosmaker [ So 12 Jul, 2009 18:51 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Probiers doch damit: $this->bbcode_second_pass_code('', '$check = serialize(false); if ($deineTolleVariable == $check || ($temp = @unserialize($deineTolleVariable)) !== false) { $deineTolleVariable = $temp; }') Spart die ganze Rumgeparserei und erschlägt hoffentlich alle Fälle. |
Autor: | Welv [ So 12 Jul, 2009 19:24 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Ich dachte dieses PHP: @unserialize($deineTolleVariable) schon versucht zu haben, was mir eine NOTICE brachte. Hab wohl irgendwo nen Fehler gemacht. Aber grundsätzlich wollt ich halt einfach was ohne Unterdrückung schreiben ![]() Chaosmaker hat geschrieben: Nur so ne Frage. Was spricht eigentlich dagegen, einfach die ersten zwei Buchstaben zu überprüfen? (Und was machst du, wenn ein Objekt serialisiert wurde? ;o) Wenn ein string mit a:... anfängt, muss es ja nicht unbedingt ein serialisierter sein. Wollts nur so genau wie möglich überprüfen. Stimmt, an Objekte hab ich noch ned gedacht, werd ich auch ned. Naja. wer will darfs behalten. Ich bleib nu doch bei @unserialize($var) ^^ |
Autor: | Auric [ So 12 Jul, 2009 21:34 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Wenn du bei @ bleibst, kannst du es auch in etwa so machen: $this->bbcode_second_pass_code('', 'function try_unserialize($data) { $pre_err = error_get_last(); $uns = @unserialize($data); $err = error_get_last(); if(!empty($err) || $err["line"] == $pre_err["line"]) { $uns = $data; } return $uns; }') Wobei der Abgleich mit unserialize(false) auch eine alternative ist. Leider wirft PHP bei soetwas keine verwertbare Exception, sonst ließe sich das ganze deutlich eleganter verarbeiten! Auric |
Autor: | Chaosmaker [ So 12 Jul, 2009 21:59 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Mit error_get_last funktionierts aber nur einmal - beim 2. unserialize (vorausgesetzt, daß zwischendurch nicht ein anderer Fehler auftrat) ist $err["line"] == $pre_err["line"] nämlich true (und !empty($err) muß natürlich empty($err) heißen, aber das ! war vmtl. nur ein Flüchtigkeitsfehler). @Welv: Bei Dir fehlte eben das @ davor, das für eine Fehlerunterdrückung sorgt, deshalb erschien die NOTICE-Meldung. Das ist in meinem kleinen Vierzeiler schon aus gutem Grund enthalten. ![]() |
Autor: | Welv [ So 12 Jul, 2009 22:19 ] |
Betreff des Beitrags: | Re: function is_serialized() |
Zitat: @Welv: Bei Dir fehlte eben das @ davor, das für eine Fehlerunterdrückung sorgt, deshalb erschien die NOTICE-Meldung. Das ist in meinem kleinen Vierzeiler schon aus gutem Grund enthalten. @Welv wäre gut gewesen, dann hätte es meinen Fehler vielleicht unterdrückt den ich bim Versuch mit @unserialize() begangen hab ![]() |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |