PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : php5: boolesche Überraschung!



BlueJay
12-07-2005, 11:25
Seltsam sind die Boole'schen Variable auch in php:



function check_start($spielid,$pfad)
{ $ok=false;
$filnam=$pfad.'g_'.$spielid.'.csv';
$text=file($filnam); $zellen=split(',',trim($text[0]));
if ($spielid==4000) $ok=(count($zellen>2)); else $ok=(count($zellen)>4);
$k=count($zellen);
echo "Count: $k - $ok \n";
return $ok;
}


Böse Falle:
Diese Variante liefert für $k (count($zellen)) eine 2, aber für $ok eine 1!
Folglich wrid ein falscher zweig ausgeführt.



function check_start($spielid,$pfad)
{ $ok=false;
$filnam=$pfad.'g_'.$spielid.'.csv';
$text=file($filnam); $zellen=split(',',trim($text[0]));
$k=count($zellen);
if ($spielid==4000) $ok=($k>2); else $ok=($k>4);
echo "Count: $k - $ok \n";
return $ok;
}


nun hat sich $ok "in Luft ausgelöst", die weitere Abfrage ergibt dann latürnich false. Damit kann man leben.

Aber mathematisch korrekt?

so long,
Bluejay

sagi
12-07-2005, 12:04
beim 1. Codebeispiel hast du ein Problem mit den Klammern:


$ok=(count($zellen>2));

solle vermutlich


$ok=(count($zellen)>2);

sein.

Was genau meinst du mit "In Luft aufgelöst"?

BlueJay
12-07-2005, 14:12
oops, natürlich war es korrekt geklammert. Nur der korrekt laufende Teil war gecopypasted.

Und mit verschwunden mein ich, da war kein Inhalt (mehr) oder die Variable schnöde geunsettet!.

Unangenehm wird nun damit die folgende Sache:



// Eingaben:
foreach ($_POST as $key=>$value)
{ echo "Schlüssel:$key Wert: $value<br> \n"; }

if (isset($_POST["spielerid"])) $spielerid=trim($_POST['spielerid']);
else
{ $spielerid=trim($_POST['spielerid']);
echo "Spielerid=$spielerid*<br>";
anmelden($spielername,$dpath);
die();
}

echo "Modus:$modus<br>\n";



resetten ist ein Submit-Button, einer von den beiden zug_setzen und resetten. Beide scheinen spielerid zu plätten.

Output:
Schlüssel:spielerlid Wert: 4000
Schlüssel:modus Wert: 1
Schlüssel:zug Wert: -1
Schlüssel:resetten Wert: Spiel abbrechen
Spielerid=*

1.Zeile: im Post-Array vorhanden
letzte Zeile: ... da isset weg!

'ne Idee?

so long,
BlueJay


sorry, ich sehe gerade, dass unser Webmaster trotz der Beteuerung, php5 am Laufen zu haben, (nach dem kürzlichen Plattencrash) php 4.3.11 aufgespielt hat.

undefined
12-07-2005, 17:11
Sorry aber dein Code ist nicht gerade der sauberste und kaum lesbar, schalte mal dein error_reporting() hoch damit du deine Fehler siehst.

error_reporting( E_STRICT );
Du erwartest eine POST Variable wo keine ist ;)

BlueJay
12-07-2005, 20:21
Du erwartest eine POST Variable wo keine ist ;)

Que?
Beim Check der POST-Variablen wird sie noch klar, fett und deutlich angezeigt (foreach-Schleife, erster Teil des Outputs, da isse ja, klar und deutlich!)

Bei der konkreten Abfrage auf speziell diese Variable isse weg,
ergo: falscher Zweig wird angesprungen, und das ist eigentlich das Hauptproblem, zumindest hier.

Der Block, den du (zu Recht) anmeckerst:
Sorry, wenn ich dich damit verwirrt habe, etwas abzufragen, was nicht da sein kann, aber irgendwie muss man ja rausbekommen, was los ist.
(letzte Zeile des Outputs)

E_STRICT bringt keinen Output, da der Webmaster das php5 deinstalliert hat (hat er heute abend gestanden).

E_ALL meckert nur die "getürkte" Ausgabe der nicht mehr existenten Variablen an.

Aber die POST-Variable spielerid ist *vorher* geplättet worden.
Warum? Hat php4.3.11 damit Probleme?

so long,
BlueJay

(ach ja, ich programmiere immer noch im ANSI-Stil und werde es mir wohl nicht mehr abgewöhnen, da man mehr auf einer Seite sieht und doch eine recht gute Blockübersicht hat.)

undefined
12-07-2005, 21:34
Also ich kann bei mir keinen Fehler sehen, das die würde ich mal weglassen damit dein Script nicht beendet wird.


echo "<pre>";
var_dump( $_POST );
echo "</pre>";

function anmelden()
{
echo "<pre>anmelden():";
var_dump( func_get_args() );
echo "</pre>";
}

$spielername = "Tester";
$dpath = "A";
$modus = "B";

if ( isset($_POST["spielerid"]) && $_POST['spielerid'] != '' ) {
$spielerid = trim( $_POST['spielerid'] );
} else {
$spielerid = 0;
echo "Spielerid=$spielerid*<br>";
anmelden($spielername,$dpath);
// die();
}

echo "Modus:" . $modus . " " . $spielerid . "<br>\n";

BlueJay
12-07-2005, 21:59
Also ich kann bei mir keinen Fehler sehen, das die würde ich mal weglassen damit dein Script nicht beendet wird.

Hab ich gemacht, und hinter der Abfrage auf $_POST['spielerid'] nochmal die Variablen ausgeben lassen, und: das Dingens ist wieder da!

Modus wird korrekt angepasst und angestrebte Tätigkeit ausgeführt.

Nur:
der Zweig mit dem logon (else-Zweig) wird trotzdem durchlaufen, und in dem gibt es die Variable nicht.

Der Webmaster spielt gerade mit den Settings (aus anderen Gründen) und murmelte was von Update, ich denke mal, ich stoppe die Angelegenheit für heute.

sagi
13-07-2005, 01:32
Schlüssel:spielerlid Wert: 4000

spielerlid?

BlueJay
13-07-2005, 10:26
spielerlid?
Autsch, war wohl zu warm gestern!

(Und wie fast immer saß das Problem vor dem Bildschirm)

Danke,
BlueJay