Dokument durchsuchen. Boolsche Werte. Undefined Index.
ChrisD
- php
0 Der Martin
0 ChrisD0 Der Martin
0 ChrisD
0 ChrisB
Hi.
Ich mlchted gerne ein Textdokument durchsuchen nach einem string.
Ich suche also praktisch sowas:
istvorhanden($string, $inText)
Als Rückgabewert wäre natürlich True/False perfekt.
Und damit bin ich bei meinem nächsten Problem.
Bei mir gehen die booslschen Werte flöten.
Wenn ich einer privaten Variable $_var den Wert false gebe und danach abfrage:
if($this->_var==false) echo "HURRA!";
Er machts nicht..
Problem 3.
$var1 =($_POST['form1']=="true") ? $_POST['form2'] : '';
$var2 =$_POST['form3'.((intval($nr) || $nr==0) ? $nr : '')];
$var3 =$_POST['form4'.((intval($nr) || $nr==0) ? $nr : '')];
Ich bekomme halt:
Undefing Index von: form 1, form 3, form 4 (form2 komischerweise nicht)
Was kann ich dagegen tun?
Viele Grüße!!!
Hallo,
Ich suche also praktisch sowas:
istvorhanden($string, $inText)
also praktisch sowas.
Als Rückgabewert wäre natürlich True/False perfekt.
Im negativen Fall bekommst du dein false schon; im Erfolgsfall aber sogar die Position des gesuchten Ausdrucks im String.
Wenn ich einer privaten Variable $_var den Wert false gebe und danach abfrage:
if($this->_var==false) echo "HURRA!";
Er machts nicht..
Wer ist "er"?
Wenn Programmcode nicht das tut, was er Programmierer will, liegt's entweder an falscher Logik, oder an unerwarteten Inhalten von Variablen.
Ich kann weder das eine noch das andere beurteilen, weil du mit notwendigen Informationen hinterm Berg hältst.
Aber wenn du selbst weiterforschen willst, solltest du den Inhalt deiner Variablen mal untersuchen. Ein var_dump($this) oder auch var_dump($this->_var) sollte dir Aufschluss darüber geben, ob du hier ein Problem hast.
Dass dein error_reporting auf E_ALL steht, setze ich natürlich voraus.
$var1 =($_POST['form1']=="true") ? $_POST['form2'] : '';
$var2 =$_POST['form3'.((intval($nr) || $nr==0) ? $nr : '')];
$var3 =$_POST['form4'.((intval($nr) || $nr==0) ? $nr : '')];
>
> Ich bekomme halt:
> Undefing Index von: form 1, form 3, form 4 (form2 komischerweise nicht)
Und was enthält $\_POST wirklich? - form2 wird deshalb nicht beanstandet, weil es nicht ausgewertet wird.
> Was kann ich dagegen tun?
Debugging!
Übrigens ist es unbeholfen und manchmal sogar hinderlich, eine boolsche Variable noch explizit auf true oder false zu vergleichen. Ein einfaches
if (var)
oder
if (!var)
ist übersichtlicher zu lesen. PHP hat ein paar Hinterhalte, wo man tatsächlich explizit auf false testen muss - dann aber nicht nur auf Gleichheit, sondern auf Identität (== oder != vs. === oder !==).
So long,
Martin
--
"Mutti, hier steht, das Theater sucht Statisten. Was sind Statisten?" - "Das sind Leute, die nur rumstehen und nichts zu sagen haben." - "So wie Papa?"
Hi.
also praktisch sowas.
Ja ich dachte nur es gibt irgendwie ne Alternative zu file_get_content() + strpos()..
»» Wenn ich einer privaten Variable $_var den Wert false gebe und danach abfrage:
»»if($this->_var==false) echo "HURRA!";
»» Er machts nicht..Wer ist "er"?
Na der Browser. Er gibt mir das "HURRA" nicht aus obwohl er müsste.
Dass dein error_reporting auf E_ALL steht, setze ich natürlich voraus.
Error-Reporting ist natürlichh an E_ALL, sogar mit E_STRICT, damit er mir jeden schei** anzeigt.
Es kommt nichts.
wenn ich da nur echo "HURRA!" hinschreibe schon. Also ich hab schon soweit debugged das ich weiß er kommt auf jeden Fall bis zu der Stelle.
Er geht sogar weiter! Es tritt also kein Abbruchfehler auf o.ä.
Aber er reicht boolsche Werte nicht weiter. Auch wenn ich ihn als Parameter übergeben lassen. Richtig komisch.
»» ~~~php
$var1 =($_POST['form1']=="true") ? $_POST['form2'] : '';
»» $var2 =$_POST['form3'.((intval($nr) || $nr==0) ? $nr : '')];
»» $var3 =$_POST['form4'.((intval($nr) || $nr==0) ? $nr : '')];
> »»
> »» Ich bekomme halt:
> »» Undefing Index von: form 1, form 3, form 4 (form2 komischerweise nicht)
>
> Und was enthält $\_POST wirklich? - form2 wird deshalb nicht beanstandet, weil es nicht ausgewertet wird.
$\_POST enthält formulareingaben. Aber es geht darum das E\_STRICT mir das Undefind Index angibt von form 1,2,4.
Dazu muss ich sagen das ich das Skript ohne Formulareingabe aufgerufen habe.
Also ohne $\_POST. Klar das sie keinen Wert hat. Aber ich will nicht das mein Logginmechanismus das ganze mitloggt, aber E\_STRICT soll anbleiben.
> ist übersichtlicher zu lesen. PHP hat ein paar Hinterhalte, wo man tatsächlich explizit auf false testen muss - dann aber nicht nur auf Gleichheit, sondern auf Identität (== oder != vs. === oder !==).
Ich schaus mir nochmal genauer an.
Hallo,
»» also praktisch sowas.
Ja ich dachte nur es gibt irgendwie ne Alternative zu file_get_content() + strpos()..
von Files war erstmal keine Rede - du fragtest nach einer Funktion "Ist String A in String B enthalten?", und ich habe dir eine vorgeschlagen.
»» »»
if($this->_var==false) echo "HURRA!";
Na der Browser. Er gibt mir das "HURRA" nicht aus obwohl er müsste.
Der Browser gibt hier nur das aus, was PHP (also der Server) ihm liefert. Wenn hier keine Ausgabe erfolgt, dann ist die Bedingung $this->_var==false also zweifellos *nicht* erfüllt. Der Ausdruck ist entweder undefiniert oder enthält irgendeinen Wert, der im boolschen Sinn nicht false ergibt.
wenn ich da nur echo "HURRA!" hinschreibe schon. Also ich hab schon soweit debugged das ich weiß er kommt auf jeden Fall bis zu der Stelle.
Ja, aber du weißt immer noch nicht mit absoluter Sicherheit, welche Werte deine Variablen enthalten. DAS solltest du genau und kritisch überprüfen, deswegen hatte ich dir extra var_dump() ans Herz gelegt.
»» »» Undefing Index von: form 1, form 3, form 4 (form2 komischerweise nicht)
»» Und was enthält $_POST wirklich?
$_POST enthält formulareingaben.
Das ist klar, das hatte ich nicht gemeint. Ich hatte gemeint, dass du die Werte kontrollieren solltest!
Dazu muss ich sagen das ich das Skript ohne Formulareingabe aufgerufen habe.
Also ohne $_POST. Klar das sie keinen Wert hat.
Arrrgh! Wie willst du deinen Code sinnvoll testen, wenn du ihn unter ganz anderen Bedingungen aufrufst? Dann erübrigt sich doch jeder weitere Schritt.
Aber ich will nicht das mein Logginmechanismus das ganze mitloggt, aber E_STRICT soll anbleiben.
Das muss ich jetzt nicht verstehen, oder?
So long,
Martin
von Files war erstmal keine Rede - du fragtest nach einer Funktion "Ist String A in String B enthalten?", und ich habe dir eine vorgeschlagen.
Bei mir war aber zu Anfang die Rede davon in einem Textdokument nach einem String zu suchen bzw "ist STRING in .txt vorhanden"? True/False
Ja, aber du weißt immer noch nicht mit absoluter Sicherheit, welche Werte deine Variablen enthalten. DAS solltest du genau und kritisch überprüfen, deswegen hatte ich dir extra var_dump() ans Herz gelegt.
ES ist zum _kotzen_.
Weißt du was das hier mir ausgibt?:
$done = false;
var_dump($done);
$object=new Views_Newsletter_Check();
var_dump($done);
if(!$done) echo "2";
Ausgabe:
bool(false)
Eigendlich müsste es dies aber 2x ausgeben + eine "2".
bool(false)bool(false)2
Aber er gibt nur das erste aus.
»» Aber ich will nicht das mein Logginmechanismus das ganze mitloggt, aber E_STRICT soll anbleiben.
Das muss ich jetzt nicht verstehen, oder?
Nee schon gut. =D Ich sage dir jetzt nur: E_STRICT und E_ALL sind beide an.
Hallo,
»» von Files war erstmal keine Rede - du fragtest nach einer Funktion "Ist String A in String B enthalten?", und ich habe dir eine vorgeschlagen.
Bei mir war aber zu Anfang die Rede davon in einem Textdokument nach einem String zu suchen
genau, und ich hatte gedanklich "Textdokument" -> "String" assoziiert, was deine beispielhafte Pseudofunktion auch noch suggerierte. An Dateien habe ich dann nicht gedacht.
Weißt du was das hier mir ausgibt?:
$done = false;
var_dump($done);
$object=new Views_Newsletter_Check();
var_dump($done);
if(!$done) echo "2";
>
> Ausgabe:
> bool(false)
Hmm. Also wird das zweite var\_dump() und auch das abschließende echo nicht mehr erreicht. Hat der Konstruktor Views\_Newsletter\_Check() vielleicht irgendwo ein exit, das das gesamte Script beendet? Denn irgendwo innerhalb dieser Konstruktor-Funktion geht dir offensichtlich der Kontrollfluss verloren. Da solltest du weiterforschen.
> Eigendlich müsste es dies aber 2x ausgeben + eine "2".
> bool(false)bool(false)2
Ja - wenn der Programmablauf linear durchläuft.
So long,
Martin
--
Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.
Hmm. Also wird das zweite var_dump() und auch das abschließende echo nicht mehr erreicht. Hat der Konstruktor Views_Newsletter_Check() vielleicht irgendwo ein exit, das das gesamte Script beendet? Denn irgendwo innerhalb dieser Konstruktor-Funktion geht dir offensichtlich der Kontrollfluss verloren. Da solltest du weiterforschen.
Ja und das isses eben. Hab ja schon gesagt das der KOnstruktor schlichtweg NICHTS tut.
hier:
public function __construct(){}
hier:
public function __construct(){}
>
Wenn ich ihn auskommentiere mit
`#public function __construct(){}`{:.language-php}
Gehts immernoch nicht.
Ach und ich hab mal in den Konstruktor echo "ok" eingegeben. Wird nicht ausgegeben, also aht er wohl schon ein Problem mit dem Aufrufen.
Hi,
Error-Reporting ist natürlichh an E_ALL, sogar mit E_STRICT, damit er mir jeden schei** anzeigt.
Es kommt nichts.
Kommt den "anderer Schei**" - oder generell gar nichts?
display_errors auch auf on?
Er geht sogar weiter! Es tritt also kein Abbruchfehler auf o.ä.
Aber er reicht boolsche Werte nicht weiter. Auch wenn ich ihn als Parameter übergeben lassen. Richtig komisch.
Wer soll was weiter reichen, und von wo nach wo?
»» ~~~php
$var1 =($_POST['form1']=="true") ? $_POST['form2'] : '';
»» $var2 =$_POST['form3'.((intval($nr) || $nr==0) ? $nr : '')];
»» $var3 =$_POST['form4'.((intval($nr) || $nr==0) ? $nr : '')];
> > »»
> > »» Ich bekomme halt:
> > »» Undefing Index von: form 1, form 3, form 4 (form2 komischerweise nicht)
Das bedeutet also schlicht und einfach, dass $\_POST keine Einträge mit den Indices 'form1', 'form3' und 'form4' enthält. Und da ein nicht vorhandenes $\_POST['form1'] auch ganz sicher nicht == "true" ist, wird auf $\_POST['form2'] gar kein Zugriff versucht, also dafür auch keine undefined index-Meldung, selbst wenn es ebenfalls fehlt.
Ist dir bekannt, wie man an einer solchen Stelle \*sauber\* programmiert? Erst mal abfragen, ob Eintrag vorhanden, dann ggf. darauf zugreifen. isset/empty helfen weiter.
> Dazu muss ich sagen das ich das Skript ohne Formulareingabe aufgerufen habe.
> Also ohne $\_POST. Klar das sie keinen Wert hat. Aber ich will nicht das mein Logginmechanismus das ganze mitloggt, aber E\_STRICT soll anbleiben.
Dann gewöhne dir an, saubere Scripte zu schreiben, und kein zufällig "funzenden".
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.