TomIRL: Notice unitialized String..

Moin,
Ich hab da heute auch mal gerade ein Problem:
Folgende Notice kann ich mir nicht erklären:

Notice: Uninitialized string offset: blabablabal...

In der Betroffenen Zeile(n) steht im Prinzip folgendes:

$f=auslesen($db, $sql);

if (!isset ($f) or $f[0]!=""){...

Die Notice wird mir immer dann angezeigt, wenn der Ausdruck in der Bedingung nicht erfüllt wird.

Vermutlich stehe ich mal wieder auf dem Schlauch oder habe ein grundsätzliches Strukturproblem im Code...
(Der Code ist ist nicht von mir. Jaja würdet ihr auch behaupten wenn ihr eine solch däm,liche Frage stellen würdet, ich weiss.)
Wer kann mir mal den entscheidenden Schubs geben?

TomIRL

  1. Hiho,

    Da ich leider nicht weiss was dein auslesen(); macht kann ich eigentlich nur raten. Aber wahrscheinlich dürfte einfach $f[0] nicht definiert sein.

    Marc

    1. Moin,

      Hiho,

      Da ich leider nicht weiss was dein auslesen(); macht kann ich eigentlich nur raten. Aber wahrscheinlich dürfte einfach $f[0] nicht definiert sein.

      Hm mein "auslesen" liest aus einer mysql DB eine übergebene sql Anweisung aus....

      ToMIRL

      1. Hello,

        Hm mein "auslesen" liest aus einer mysql DB eine übergebene sql Anweisung aus....

        und was gibt es zurück, wenn das nicht geklappt hat?
        Was Fehlerbehandlung bedeutet, muss man Dir doch nicht mehr erzählen ;-))

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  2. 你好 TomIRL,

    if (!isset ($f) or $f[0]!=""){...

    Statt $f[0] != "" benutze lieber !empty($f[0])

    再见,
     CK

    --
    Treffen sich zwei Geraden. Sagt die eine: "Beim nächsten Mal gibst du einen aus."
    http://wwwtech.de/
    1. Hello,

      if (!isset ($f) or $f[0]!=""){...

      Statt $f[0] != "" benutze lieber !empty($f[0])

      Das ist keine gute Idee, da empty() dann auch bei

      $f = '0 Fehler, lieber Tom';

      true zurückgeben würde.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. Hello Tom,

    $f=auslesen($db, $sql);

    if (!isset ($f) or $f[0]!=""){...

    Das liegt daran, dass PHP die Variablen eben nicht "klassisch" anlegt, sondern mehrschichtig.
    In der einen Schicht wird der Typ vermerkt
    In der anderen Schicht der "Wert", der durchaus auch ein "Zeiger" sein kann

    Angenommen, die Funktion auslesen() liefert 'false', wenn sie keinen gültigen Rückgabe_wert_ erzeugen konnte, dann ist die Variable zwar in der Namenstabelle angelegt, und ein Typ festgelegt, aber es existiert kein Wert und daher auch keine Ausdehnung in der Wert-Achse. $f[0] wäre aber schon das erste Element in der Wertachse und wurde gar nicht angelegt.

    Die richtigte Abfrage müsste also lauten

    if(!isset ($f) or $f===false)

    oder

    if(!isset ($f) or strlen($f)==0)   ## die benutze ich immer..., ggf. ergänzt durch trim()

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Moin,
      Also Christans Vorschlag liefert die funktionsfähige Lösung...
      Dein Vorschlag bringt die Fehlermeldung raus, macht aber meine Anweisung immer wahr.
      Deshalb will ich dann doch noch mal in die Struktur einsteigen...
      Ich sollte eigentlich mal 2 Stunden ums Haus rennen, dann klappts auch wieder besser mit dem programmieren.
      Also was mache ich genau:
      $sql="....

      Die Funktion auslesen sieht wie folgt aus:
      function auslesen ($db,$sql){

      $data="";

      $zeilen = mysql_query($sql,$db);
               //print ("$sql");
              //echo mysql_errno() . ": " . mysql_error() . "\n";
                  //$i=mysql_num_rows($zeilen);
                  //print ("$i");
               if (!$zeilen) die("Anfrage war nicht erfolgreich");
               else
               while ($f = mysql_fetch_array($zeilen))
                     {$data[]=$f;
                       }
                          //print_r ($data);
               return $data;
               }
      Hm und dann soll im Prinzip wenn meine SQL Anweisung brauchbaren Ergebnisse liefert eine Fehlermeldung kommen.
      Wenn nicht dann ist alles Schick..
      Hm hoffentlich verständlich..
      ToMIRL

      1. Hello,

        Moin,
        Also Christans Vorschlag liefert die funktionsfähige Lösung...

        Aber nur auf den ersten Blick.

        Dein Vorschlag bringt die Fehlermeldung raus, macht aber meine Anweisung immer wahr.

        Ich habe das ja auch nicht fertig programmiert für Dich, sondern nur den Weg gezeigt.

        Deshalb will ich dann doch noch mal in die Struktur einsteigen...

        Das ist zu vermuten, denn bei einer gut geschrieben Funktion sollte es genügen, hinterher den Fehlerwert abzufragen und nichts anderes. Wenn sie einen String produzieren soll, dann solltest Du auch einen zurückgeben, wenn alles geklappt hat und 'false' zurückgeben, wenn irgendetwas nicht geklappt hat. Oder ggf. noch besser: einen eingenen Fehlerkanal aufmachen für definierte Fehlernummern. PHP bietet ja schließlich mit list() und arrays als Rückgabewerte diese Möglichkeit.

        list($error, $value) = funktionsblock(...);

        Ich sollte eigentlich mal 2 Stunden ums Haus rennen, dann klappts auch wieder besser mit dem programmieren.

        Ja, komm doch auf einen Schneespaziergang vorbei. Allerdings habe ich nicht eingekauft.
        Mit vernünftigen Winterreifen fährst Du doch nur zwei Stunden ;-)

        http://www.viamichelin.com/viamichelin/deu/dyn/controller/ItiWGJSFullMapGeneration?firstMapId=-.gnajeksbkdhl&rnd=1107015580360&E_wg=210505030jS1705029171526954055ITIWG51102153deu004o1032101c101116100z11032400008QmVybGlu000010081139s0100131h10111b10141103240000007Mzc0NDQ00100e123lpc53744410013010010072005029039.004-1.00110001001001001001001003deu011&mapId=-.gnajeksbkdhl&mapType=3&mapSize=big&function=okMap&pim=false

        Ob der Link hier durchgeht?

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  4. Hi,

    ohne eure Diskussion stören zu wollen - achtet mal auf den Parameter t in der URI: http://***/?t=100000&m=611746

    Nicht schlecht, 100.000 Threads ;-)

    Nur mal so nebenbei angemerkt...

    E7

    1. Hello,

      ohne eure Diskussion stören zu wollen - achtet mal auf den Parameter t in der URI: http://***/?t=100000&m=611746

      Nicht schlecht, 100.000 Threads ;-)

      Na, dann habe wir doch schon einen schönen Spitznamen für Tom: "Mister 100.000st Thread".

      Wenn ich jetzt noch wüsste, wie ich das "st" hier hochstellen kann im Forum, wär ich doch glücklich ;-))

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
    2. Hallo,

      Nicht schlecht, 100.000 Threads ;-)

      Oh, ein Anlass, sich den ersten Thread anzuschauen. "Damals", 1998, hat es noch zwei Tage gedauert, bis eine Antwort kam...

      Tja, "times are changing".

      Gruß
      Lachgas

      --
      Keine Verbesserung ist zu klein oder geringfügig, als dass man sie nicht durchführen sollte. (Adorno)
    3. Moin!

      ohne eure Diskussion stören zu wollen - achtet mal auf den Parameter t in der URI: http://***/?t=100000&m=611746
      Nicht schlecht, 100.000 Threads ;-)
      Nur mal so nebenbei angemerkt...

      Und schon in den Nachrichten: http://www.it-schule.de/nachricht_zeigen.php?id=137&start=1&bereich_id=2

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  5. Da es mir nicht scheint, als ob meine Vorposter das Problem gelöst hätten, versuche ich mich mal daran.

    Notice: Uninitialized string offset: blabablabal...

    In der Betroffenen Zeile(n) steht im Prinzip folgendes:

    $f=auslesen($db, $sql);

    if (!isset ($f) or $f[0]!=""){...

    Zuerst mal ist in der if-Anweisung nicht richtig, dass du zwar testest, ob $f existiert, dann jedoch nicht prüfst, ob auch $f[0] existiert.

    Desweiteren konnte ich den Fehler nachstellen, indem ich $f = ''; setzte.
    Der Fehler kam allerdings nicht mehr wenn $f einen string länger als 0 enthielt. Das verwunderte mich etwas, da ein string ja kein Array-Element mit Index 0 ($f[0]) beinhaltet. Die Doku klärte mich dann auf, dass aus Kompatibilitätsgründen noch die mittlerweile missbilligte []-Syntax zum Zugreifen auf einzelne Zeichen in String funktioniert. Normalerweise macht man das mit {}.

    Mein Tipp: mach doch mal ein var_dump($f); (ein echo '<pre>'; vorher ist empfehlenswert) und schau dir Typ und Inhalt an, dann sollte alles etwas klarer werden, hoffe ich.

    1. Moin!

      if (!isset ($f) or $f[0]!=""){...

      Zuerst mal ist in der if-Anweisung nicht richtig, dass du zwar testest, ob $f existiert, dann jedoch nicht prüfst, ob auch $f[0] existiert.

      Das führt dann eigentlich direkt zur Lösung, die Existenz von $f[0] mittels isset() direkt zu prüfen. Das geht nämlich auch und erzeugt keine Notice.

      Allerdings wäre es im Kontext der Funktion auslesen() hier zutreffender, wenn nicht nur die Existenz des allerersten Elements geprüft würde, sondern ob $f tatsächlich ein Array ist. Dies geht eigentlich am elegantesten, indem auslesen() im Fehlerfall nicht mit die() aussteigt, sondern einen definierten Wert (in PHP üblich ist false) zurückgibt, der dann abgefragt werden kann.

      if ($f === false) { // irgendwas ist hier falsch gelaufen

      So rein programmablauftechnisch ist diese Abfrage nämlich aktuell Blödsinn. Wenn bei der SQL-Abfrage was schiefläuft, dann endet das Programm mit die(). Hier nachträglich nochmal abzufragen bewirkt also sowieso nichts - auslesen() müßte geändert werden.

      Ich bin sowieso der Meinung, Funktionen sollten niemals mit die() aussteigen, sondern definierte Rückgabewerte (notfalls eben false) liefern - dann muß das Hauptprogramm - und NUR dieses - entsprechend reagieren, falls was schiefgeht.

      - Sven Rautenberg

      1. Moin,

        Zuerst mal ist in der if-Anweisung nicht richtig, dass du zwar testest, ob $f existiert, dann jedoch nicht prüfst, ob auch $f[0] existiert.

        Das führt dann eigentlich direkt zur Lösung, die Existenz von $f[0] mittels isset() direkt zu prüfen. Das geht nämlich auch und erzeugt keine Notice.

        Jaein.. das ist aus den von Dir

        Allerdings wäre es im Kontext der Funktion auslesen() hier zutreffender, wenn nicht nur die Existenz des allerersten Elements geprüft würde, sondern ob $f tatsächlich ein Array ist. Dies geht eigentlich am elegantesten, indem auslesen() im Fehlerfall nicht mit die() aussteigt, sondern einen definierten Wert (in PHP üblich ist false) zurückgibt, der dann abgefragt werden kann.

        if ($f === false) { // irgendwas ist hier falsch gelaufen

        Genau das hab ich gemacht, die Funktion liefert einen ordentlichen Rückgabewert, wenn sie fehlschlägt. Bzw. wenn die Anzahl der Datensätze leer ist.

        Übrigens die Funktion ist nicht bei die ausgestiegen, sondern brachte  eine Fehlermeldung.
        Die Ergebnissmenge war allerdings Null und deshalb ist gar nix passiert.
        Wie gesagt ich habs halt komplett neu geschrieben, eh ich mich weiter mit der schlamopigen Programmierung rumgeschlagen habe.
        TomIRL