mauer: sscanf: Länge des gescannten Wertes

Hallo

habe vor, ein Datum aus der Datenbank vom Englischen Format ins Deutsche zu übertragen. Da ich vor kurzem C gelernt habe, ist mir die Funktion scanf bekannt, und habe diese auch in PHP entdeckt (PHP programmiere ich allerdings schon seit Jahren).

Folgenden Code habe ich bisher geschrieben (das angegebene Datum ist nur exemplarisch):

  
	$datetime="2009-08-01 14:50:33";  
	$s = sscanf($datetime, "%04d-%02d-%02d %02d:%02d:%02d");  
	print_r($s);  

Doch in der Ausgabe wird deutlich, dass die Daten, die z.B. 09 heißen, zu 9 abgeändert werden, obwohl ich die Längenangabe "2" vermerkt habe.
Da habe ich bestimmt einen Denkfehler drin. Ich finde ihn nur nicht. Könnt ihr mir helfen?

Lg
Mauer

  1. Da habe ich bestimmt einen Denkfehler drin. Ich finde ihn nur nicht. Könnt ihr mir helfen?

    var_dump() anstatt print_r() wird dir ggf. den entscheidenden Hinweis liefern.

    1. var_dump() anstatt print_r() wird dir ggf. den entscheidenden Hinweis liefern.

      Tut es aber leider nicht. Da steht im Prinzip dasselbe drin, was ich schon weiß - 0en werden abgetrennt, egal ob am Anfang oder am Ende des Wertes.

      1. Tut es aber leider nicht. Da steht im Prinzip dasselbe drin, was ich schon weiß

        Nein tut es sicher nicht - siehe Martins Antwort :)

      2. var_dump() anstatt print_r() wird dir ggf. den entscheidenden Hinweis liefern.

        Tut es aber leider nicht. Da steht im Prinzip dasselbe drin, was ich schon weiß - 0en werden abgetrennt, egal ob am Anfang oder am Ende des Wertes.

        Der Unterschied ist doch, dass dir bei var_dump() auch der jeweilige Variablen-Typ mit angezeigt wird. Und wie suit schon bemerkte, sollte dir das in Kombination mit Martins Antwort eigentlich deutlich machen, wo dein (Denk-)Fehler liegt.

        Gruß Gunther

  2. Hi,

    habe vor, ein Datum aus der Datenbank vom Englischen Format ins Deutsche zu übertragen.

    das kommt mir schon spanisch vor. ;-)
    Nein, im Ernst: Ein Datumswert sollte in der Datenbank eigentlich sprach- und formatneutral gespeichert sein, und erst bei der Abfrage im gewünschten Format aufbereitet werden - und zwar durch die Datenbank selbst.

    »» 	$datetime="2009-08-01 14:50:33";  
    
    > 	$s = sscanf($datetime, "%04d-%02d-%02d %02d:%02d:%02d");  
    > 	print_r($s);
    
    

    Doch in der Ausgabe wird deutlich, dass die Daten, die z.B. 09 heißen, zu 9 abgeändert werden, obwohl ich die Längenangabe "2" vermerkt habe.

    Warum wundert dich das? Du bekommst von sscanf() ein Array aus Zahlenwerten zurück. Wie Zahlenwerte dargestellt werden, entscheidet erst die Ausgabe, in diesem Fall print_r(). Natürlich gibt dir print_r() z.B. den Wert 9 aus und nicht "09", denn die Information, wie diese Zahlenwerte in dem String vorlagen, der von sscanf geparst wurde, ist längst verloren.
    Nebenbei wäre die Angabe 09 in einem Zahlen-Kontext auch sowohl in PHP als auch in C syntaktisch falsch. Denn eine führende Null bedeutet Oktal-Schreibweise, und im oktalen System gibt es keine Ziffer 9.

    Da habe ich bestimmt einen Denkfehler drin. Ich finde ihn nur nicht.

    Jetzt besser?

    So long,
     Martin

    --
    You say, it cannot be love if it isn't for ever.
    But let me tell you: Sometimes, a single scene can be more to remember than the whole play.