unserialize

sid61

Mitglied
Hallo,
ich versuche derzeit das Problem zu lösen, Daten aus der Datenbank auszulesen.
Das Problem dabei ist, das in dem Feld field_value mehrere Daten enthalten sind (serialize). Nun möchte ich einige Daten aus diesem Feld dafür verwenden, um es für eine Darstellung einzusetzen. Dafür muss ich es mit unserialize bearbeiten.

Ich habe mal ein wenig herum experimentiert und den nachfolgenden Code ausprobiert. Nur bekomme ich immer wieder einen Fehler für folgende Zeile:

Warning: Invalid argument supplied for foreach()


Irgendwie komme ich nicht weiter, was mache ich hier falsch

PHP:
<?php
$conn = mysql_connect('localhost', 'mydb', 'mypass') or die(mysql_error());
mysql_select_db(mydb, $conn) or die(mysql_error());

$udata = mysql_query("SELECT field_value FROM mydb.jos_js_res_record_values j WHERE j.`field_id`=8;");
$row = mysql_fetch_array($udata);

$value = unserialize($row->field_value);
foreach($value as $row => $array) {
print_r($array[0]);
}
mysql_close();
?>

Kann jemand weiterhelfen ?

Gruss
Kasi
 
Zuletzt bearbeitet:
Also du solltest dich entscheiden ob du mysql_fetch_array machst:
PHP:
$row = mysql_fetch_array($udata);

$value = unserialize($row['field_value']);

oder mysql_fetch_object
PHP:
$row = mysql_fetch_object($udata);

$value = unserialize($row->field_value);

mysql_fetch_array zu verwenden und dann als Objekt darauf zuzugreifen geht eben nicht ,)
 
Hallo,
habe das jetzt geändert, aber der Fehler bleibt leider bestehen.
Warning: Invalid argument supplied for foreach()



PHP:
<?php

$udata = mysql_query("SELECT field_value FROM mydb.jos_js_res_record_values j WHERE j.`field_id`=8;");
$row = mysql_fetch_object($udata);

$value = unserialize($row->field_value);      
foreach($value as $row => $array) {
print_r($array[0]);
}
mysql_close();
?>

Der Inhalt des Feldes auf das ich zugreifen möchte, sieht wie folgt aus:
Code:
a:15:{s:6:"person";s:12:"Sven Krzizek";s:8:"address1";s:21:"Fürstenwalder Str.33";s:4:"city";s:8:"Heidesee";s:3:"zip";s:5:"15754";s:3:"lat";
s:18:"52.301524777458475";s:3:"lon";s:19:"13.798377513885498 ";s:3:"tel";s:7:"1234567";s:3:"fax";s:7:"7654321";s:3:"mob";
s:9:"123569236";s:3:"icq";s:0:"";s:3:"msn";s:0:"";s:5:"skype";
s:6:"sid361";s:2:"ym";s:0:"";s:3:"aol";s:0:"";s:6:"google";s:0:"";}

Irgendwas läuft immer noch falsch :-(
Kasi
 
Hi,

habe heute nochmal etwas anderes ausprobiert, aber ich bekomme nicht den Inhalt des Datenfeldes geliefert, sondern nur eine '3' - Wenn ich die gleiche SQL Abfrage mit dem MySQL Browser mache, bekomme ich 3 Datensätze angezeigt - aber eben mit dem serialisierten Inhalt wie im Beitrag davor (Beispiel des Inhaltes).

Folgenden Code habe ich mir gebastelt und bekomme eben eine 3 als Antwort, anstatt alle Inhalte des Feldes.

Ich komme einfach nicht drauf, was ich falsch mache...

PHP:
<?php
$database="mydb";
mysql_connect('localhost', 'mydbuser', 'mydbpass');
	@mysql_select_db($database) or die( "Unable to select database");
	$sql = "SELECT field_value FROM mydb.jos_js_res_record_values j WHERE j.`field_id`=8";
	$result = mysql_query($sql) or DBError("LINE: " .__LINE__. " $sql");
	$nRows = mysql_num_rows($result);
       echo $nRows;

	$javaScript = '';
	if ($nRows) {
		while ($str = mysql_fetch_array($result)) {
			print_r(unserialize($str['field_value']));
	}
	return $javaScript;
}
function assertTable() {
}
function DBError($sql){
	print "Error: \n" . mysql_error() . "\n";
	print "<hr>\n";
	print "$sql\n";
	print "<hr>\n";
	exit;
}


function unserialize_data($str, $objs = true) {
    if ($objs && preg_match_all('/O:\d+:"([a-zA-Z0-9_]+)":/', $str, $arr)) {
        $callback = ini_get('unserialize_callback_func');
        foreach ($arr[1] as $cls) {
            if (!class_exists($cls)) {
                call_user_func($callback, $cls);
            }
            if (!class_exists($cls)) {
                eval('class ' . $cls . ' { }');
            }
        }
    }
    return unserialize($str);  
}
?>

Es werden mit dieser Version keine Fehler mehr ausgegeben, aber dafür auch nicht der gewünschte Inhalt. Fiield8 enthält in der Tabelle den serialisierten $, aber in der Ausgabe wird mir nur die Anzahl Datensätze zurück gegeben, hier dann 3 Datensätze ?

Hier bin ich jetzt mit meinem Latein am Ende angelangt...

Würde mich freuen, wenn mir jemand sagen kann, was ich nun da falsch mache..

Gruss
Kasi
 
Zuletzt bearbeitet:
Kann keiner helfen ?

Hi,

hatte gehofft, das ich es vielleicht mit Hilfe lösen kann - hat keiner von euch eine Idee - wie ich das lösen könnte, oder was ich noch versuchen könnte. Komme hier einfach nicht weiter - im MySQL Query Browser wird mir das serialisierte Feld korrekt ausgegeben, aber mit der gleichen Abfrage unter PHP erscheint nichts.

Gruss
Kasi
 
huhu, hab da mal bisschen probiert bei mir funktionierts.
hab jetzt zwar keine datenbank, aber hab mir das array nachgebaut.

PHP:
<?php

$udata = mysql_query("SELECT field_value FROM mydb.jos_js_res_record_values j WHERE j.`field_id`=8;");
$row = mysql_fetch_assoc($udata);

$value = unserialize($row['field_value']);      
foreach($value as $row => $array) 
{
  echo $array."<br/>";
}

mysql_close();
?>

da es sich bei dem array das in der datenbank steht um ein eindimensionales array handelt, brauchst du $array nicht mit einem index aufrufen.

desweiteren nimm entweder:
mysql_fetch_row oder
mysql_fetch_assoc

fetch_row liefert dir ein array mit index (0..n)
fetch_assoc liefert dir ein assoziatives array

fetch_array liefert beides und is somit langsamer.

so long
 
huhu, hab da mal bisschen probiert bei mir funktionierts.
hab jetzt zwar keine datenbank, aber hab mir das array nachgebaut.

so long

Hallo,
das ging auch nicht, aber mittlerweile habe ich die Lösung gefunden. Es hing damit zusammen, das die Daten nicht korrekt ausgegeben wurden.

Nach dem ich dann mysql_query( "SET NAMES 'utf8'" );
vor die Abfrage geschrieben hatte, lief es einwandfrei.

Das war der ganze Zauber, ich war im Glauben, das UTF-8 drin iss also auch raus muss. Darauf machte mich dann ein User aus einem anderen PHP Forum aufmerksam und es ging dann ohne Probleme.

Dennoch euch allen vielen Dank für die Hilfe !
Gruss
Kasi
 
Zurück