Notice unitialized String..
TomIRL
- php
0 AllesMeins3 Christian Kruse1 Tom
0 Tom0 Gratulation: 100.000 ;-)
e70 dedlfix
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
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
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
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
你好 TomIRL,
if (!isset ($f) or $f[0]!=""){...
Statt $f[0] != "" benutze lieber !empty($f[0])
再见,
CK
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
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
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
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 ;-)
Ob der Link hier durchgeht?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
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
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
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
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®
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.
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
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