PHP Variablenübergabe von hidden <input>

  • Hallo,

    ich habe das Problem, daß eine identische HTML- und PHP-Seite im Firefox und im IE unterschiedlich angezeigt wird. Funktion der Seiten ist zum Einen die Eingabe von Daten in Texfelder und das Schreiben der Daten in einen DB. In der HTML-Datei sind die Initialwerte in 2 versteckten Eingabefeldern hinterlegt:

    Zitat von Editor

    <input name = "krit" type = "hidden" value = "x1, x2, x3, x4">
    <input name = "sort" type = "hidden" value = "ASC">


    In der PHP-Seite wird das folgendermaßen ausgelesen:

    Zitat von Editor

    if ($_POST["krit"] != "") $krit = $_POST["krit"];
    else if ($_GET["krit"] != "") $krit = $_GET["krit"];

    Damit wird ein SQL-Statement zusammengebaut:

    Zitat von Editor

    SELECT x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, kel FROM sb ORDER BY x1, x2, x3, x4 ASC

    Das klappt beim IE problemlos. Wird die Seite allerdings mit dem Firefox geöffnet, übergibt er irgendwie nicht die Werte und es kommt nur ein unvollständiges Statement zusammen.

    Zitat von Editor

    SELECT x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, kel FROM sb ORDER BY

    Was kann man da machen damit die Werte übergeben werden? Ich benutze den Firefox 0.9.x, weis nicht mehr genau. Bei Bedarf kann ich das noch nachliefern.

  • zuerst:

    $_POST['var'] => daten aus einem formfeld var
    $_GET['var'] => ?var=lol&wert=rofl
    $_REQUEST['var'] => eins der beiden, frag mich aber nicht welches dann genommen wird ;)

    <form action="test.php?inc=rolf" method="post"> <<< $_GET daten
    <input name="lol" <<< $_POST daten (wenn method post, ansonsten isses auch get)

    gib mal dein gesamtes script bzw. die url und lass das sql statement ausgeben.
    Am Fx liegts bestimmt nicht, ich denke eher da ist irgendwo ein typo im formular oder so.
    So kann man nichts machen, ich kann dir versichern, der fx übergibt get und post daten vollkommen korrekt :)

  • Ok, erstmal die Adresse mit Testdaten: Klick

    Hier die "Startseite":
    <body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
    <form action = "input.php" method = "post">
    <table >
    <tr>
    <td>Koords: </td>
    <td><input name = "koords"></input></td>
    </tr>
    .
    .
    .
    <tr>
    <td>Kelo: </td>
    <td><input name = "kelo"></input></td>
    </tr>
    </table>
    <input type = "submit">
    <input type = "reset">
    </form>
    <form action="all.php" method="post">
    <select name = "race">
    <option value = "human" selected>Mensch</option>
    <option value = "kando">Kandorianer</option>
    <input name = "krit" type = "hidden" value = "x1, x2, x3, x4">
    <input name = "sort" type = "hidden" value = "ASC">
    </select>
    <br>
    <input type = "submit" id = "all" value="Alle anzeigen">
    </form>
    </body>

    hier das Script für die Eingabe, da klappt das auslesen bei POST:
    <?php

    $koords = $_POST["koords"];
    $eisen = $_POST["eisen"];
    .
    .
    $carb = $_POST["carb"];
    $kelo = $_POST["kelo"];

    if (($koords == 0) || ($eisen == 0) || ($titan == 0) || ($treib == 0) || ($h2o == 0) || ($korn == 0) || ($neutr == 0) || ($anti == 0) || ($carb == 0) || ($kelo == 0)) echo "Eingabe fehlt<br>";
    else
    {
    // Koords auseinanderschneiden
    $x = explode(":", $koords);


    $db = MYSQL_CONNECT("host", "user", "pw") or die ("<H3>Datenbankserver nicht erreichbar</H3>");
    MYSQL_SELECT_DB("db") or die ( "<H3>Datenbank nicht vorhanden</H3>");
    // echo "Eingaben vollständig<br>";

    $sql = "INSERT INTO db (x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, car, kel) VALUES ('$x[0]', '$x[1]', '$x[2]', '$x[3]', '$eisen', '$titan', '$treib', '$h2o', '$korn', '$neutr', '$anti', '$carb', '$kelo')";
    echo "sql = $sql";
    echo "<br>";
    $result = MYSQL_QUERY($sql) or die ("SQL-Insert-Statement nicht ausführbar");

    $code = MYSQL_ERRNO($db);

    if ($code == 1062)
    {
    echo "daten schon vorhanden<br>";
    }
    else if ($code == 0)
    {
    echo "daten eingefügt<br>";
    }
    else
    {
    echo "Code = ";
    echo $code;
    echo "<br>";
    }
    $result = MYSQL_QUERY("SELECT x1 FROM db") or die ("SQL-Select-Statement nicht ausführbar");
    $anz = MYSQL_NUM_ROWS($result) or die ("Zeilenanzahl nicht auslesbar<");
    echo "$anz Datensätze momentan vorhanden<br>";
    MYSQL_CLOSE($db) or die("Connection konnte nicht geschlossen werden");
    }

    ?>

    und hier das andere PHP-Skript:
    <?php

    function trimkoords($x1, $x2, $x3, $x4)
    {
    $x1str = strval($x1);
    $x2str = strval($x2);
    $x3str = strval($x3);
    $x4str = strval($x4);

    $koords = $x1str.':'.$x2str.':'.$x3str.':'.$x4str;

    return $koords;
    }

    if ($_POST["race"] != "") $race = $_POST["race"];
    else if ($_GET["race"] != "") $race = $_GET["race"];
    echo "race = $race";
    echo '<br>';

    $border = 105;

    if ($_POST["krit"] != "") $krit = $_POST["krit"];
    else if ($_GET["krit"] != "") $krit = $_GET["krit"];
    echo "krit = $krit";
    echo '<br>';

    if ($_POST["ord"] != "") $sort = $_POST["ord"];
    else if ($_GET["ord"] != "") $sort = $_GET["ord"];
    echo "sort = $sort";
    echo '<br>';

    $sql = '';

    $db = MYSQL_CONNECT("host", "user", "pw") or die ("<H3>Datenbankserver nicht erreichbar</H3>");
    MYSQL_SELECT_DB("db") or die ('<H3>Datenbank nicht vorhanden</H3>');

    $sort = strtoupper($sort);
    if ($race == 'human')
    {
    $sql = "SELECT x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, car FROM db ORDER BY $krit $sort";
    $result = mysql_query($sql);
    }
    else if ($race == 'kando')
    {
    $sql = "SELECT x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, kel FROM db ORDER BY $krit $sort";
    $result = mysql_query($sql);
    }
    echo "sql = $sql";
    $anz = MYSQL_NUM_ROWS($result);

    // Tabellenbeginn
    echo '<table border>';

    // Überschrift
    echo "<tr> <td><a href=\"$PHP_SELF?race=$race&krit=x1,x2,x3,x4&sort=asc\">Koords</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=eis&sort=desc\">Eisen</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=tit&sort=desc\">Titan</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=tre&sort=desc\">Treib</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=h2&sort=desc\">H2O</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=korn&sort=desc\">Korn</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=neu&sort=desc\">Neutro</a></td>";
    echo "<td><a href=\"$PHP_SELF?race=$race&krit=ant&sort=desc\">Anti</a></td>";
    if ($race == 'human') echo "<td><a href=\"$PHP_SELF?race=$race&krit=car&sort=desc\">Carb</a></td> </tr>";
    else if ($race == 'kando') echo "<td><a href=\"$PHP_SELF?race=$race&krit=kel&sort=desc\">Kelo</a></td> </tr>";

    for ($i = 0; $i < $anz; $i++)
    {
    // Koordinaten
    $x1 = MYSQL_RESULT($result, $i, "x1");
    $x2 = MYSQL_RESULT($result, $i, "x2");
    $x3 = MYSQL_RESULT($result, $i, "x3");
    $x4 = MYSQL_RESULT($result, $i, "x4");
    if (function_exists("trimkoords")) $ko = trimkoords($x1,$x2,$x3,$x4);
    else echo "Funktion nicht vorhanden";

    $ei = MYSQL_RESULT($result, $i, "eis");
    $ti = MYSQL_RESULT($result, $i, "tit");
    $tr = MYSQL_RESULT($result, $i, "tre");
    $h2 = MYSQL_RESULT($result, $i, "h2");
    $kn = MYSQL_RESULT($result, $i, "korn");
    $ne = MYSQL_RESULT($result, $i, "neu");
    $an = MYSQL_RESULT($result, $i, "ant");
    if ($race == "human")
    {
    $ca = MYSQL_RESULT($result, $i, "car");
    $average = $ei + $ti + $tr + $h2 + $kn + $ne + $an + $ca;
    $average = $average / 8;
    }
    else if ($race == "kando")
    {
    $ke = MYSQL_RESULT($result, $i, "kel");
    $average = $ei + $ti + $tr + $h2 + $kn + $ne + $an + $ke;
    $average = $average / 8;
    }

    // Tabellenzeile mit -zellen
    if ($average > $border) echo "<tr> <td><b>$ko</b></td>";
    else echo "<tr> <td>$ko</td>";
    .
    .
    .
    if ($an >= 110) echo "<td><font color=#00FF00>$an</font></td>";
    else if ($an <= 90) echo "<td><font color=#FF0000>$an</font></td>";
    else echo "<td><font color=#000000>$an</font></td>";

    if ($race == "human")
    {
    if ($ca >= 110) echo "<td><font color=#00FF00>$ca</font></td>";
    else if ($ca <= 90) echo "<td><font color=#FF0000>$ca</font></td>";
    else echo "<td><font color=#000000>$ca</font></td>";
    }
    else if ($race == "kando")
    {
    if ($ke >= 110) echo "<td><font color=#00FF00>$ke</font></td> </tr>";
    else if ($ke <= 90) echo "<td><font color=#FF0000>$ke</font></td> </tr>";
    else echo "<td><font color=#000000>$ke</font></td> </tr>";
    }
    }

    // Tabellenende
    echo "</table>";
    echo "<label>Fett = Durchschnitt > $border</label><br>";

    MYSQL_CLOSE($db);
    ?>

    Da bin ich mal gespannt ob es nur ein Schreibfehler irgendwo ist, ich finde ihn nicht :wink: . Ein paar unwichtige Sachen habe ich rausgekürtzt, ist aber trotzdem so lange :(

  • also "submit query" geht bei mir schonmal...

    Zitat

    sql = INSERT INTO sbtest (x1, x2, x3, x4, eis, tit, tre, h2, korn, neu, ant, car, kel) VALUES ('2', '2', '2', '', '2', '2', '2', '2', '2', '2', '2', '2', '2')
    Planetdaten eingefügt
    7 Datensätze momentan vorhanden
    Zur&uumlck


    ah ich hab den fehler. Allerdings hab ich den bei dir im Code den du hier abgeliefert hast nicht gefunden. Sondern nur auf der Seite. (input)

    Fällt dir was auf? Da stehen immer Leerzeichen vorne dran. demnach müsste in deinem auswertungsscript $_POST[' krit'] exisiterien, aber ich empfehle dir beim formular die leerzeichen zu entfernen.

    Achja, noch paar allgemeine Tipps:
    if (($koords == 0) || ($eisen == 0) || ($titan == 0) || ($treib == 0) || ($h2o == 0) || ($korn == 0) || ($neutr == 0) || ($anti == 0) || ($carb == 0) || ($kelo == 0))
    ewig lange abfrage
    kürzer ist:
    if($koords==0 || $eisen==0
    kürzer ist
    if(!$koords || !$eisen ...) echo "da fehlt was"; else echo "jo, ok so";
    am kürzesten ist
    if($koords && $eisen && ...) echo "jo, ok so"; else echo "da fehlt was";
    (am sinnvollsten wäre hier halt noch $_POST['eisen'] usw. zu verwenden)

    und, was wichtig werden wird je komplizierter deine scripte werden: $_POST oder $_GET setzt du niemals auf eine "normale" variable um (aslo $var z.B.)
    Das macht dir nur Probleme, so wenn die beiden Bereiche (intern und extern) getrennt hälst, haben die user viel weniger möglichkeiten deinem script doch irgendeine variable unterzuschieben falls du sie später evt. doch verwendest.
    Wenn du weißt, dass die Daten aus einem POST formular kommen, dann darfst du auch nur $_POST verwenden. und nicht noch prüfen ob $_GET vielleicht auch noch infos enthält. Du legst fest wie die variablen übertragen werden, dann nimm sie auch so an. (wenn die daten doch aus beiden stammen können nimm $_REQUEST, weil beide gleichzeitig auszufüllen wäöre eh schwachsinn)

    echo "Code = ";
    echo $code;
    echo "<br>";

    kürzer und übersichtlicher ist echo 'Code = '.$code.'<br />';

    Naja. Abschließend noch 2 Links, die du dir unbedingt durchlesen solltest, sind sehr hilfreich.
    http://tut.php-q.net/einruecken.html
    http://www.dclp-faq.de/q/q-security-variablen.html

  • Jut danke erstmal für die Antwort! Das mit den Leerzeichen gibt mir noch Rätsel auf, weil ich nicht wirklich weis woher die auf einmal kommen, ich suche mal :wink: .

    Die weiteren Ratschläge hören sich sinnvoll an, werde die mal umsetzen. Die Abfrage ob evtl GET auch was liefert habe ich geschrieben, weil ich beim ersten Senden des "Formulars" für die all.php POST verwende. Im PHP-Script beim erneuten Aufrufen von all.php aber per GET die Werte übergebe, da ich damals nicht wußte wie es mit POST geht (wenn überhaupt). Praktischer wäre hier sicher das zu vereinheitlichen und eine Methode wegzulassen.

    Ok mit dem Einrücken, sieht etwas seltsam aus :) . Eigentlich mache ich das schon vernünftig, aber ich muß mich wohl noch etwas an den Meybohm Phase 5 gewöhnen :wink: .

  • Nein, einrücken ist eigentlich ganz simpel:
    wenn du eine abfrage hast, also irgendwas wo klammern { } kommen (auch da wo man sie weglassen könnte) verfährt man am besten nach folgendem verfahren:

    abfrage, klammer auf, enter, 2 leerzeichen (3 muss man soviel tippen und 1 übersieht man leicht) dann irgendwelchen code. dann enter, dann sind die 2 leerzeichen alleine da und dan abschließende klammer auf der höhe wo die abfrage anfing.

    Hat man ein if/elseif/else construkt wird das else[if] immer von den klammern "umschlossen". Also } else {

    bsp:

    Code
    if(true) {
      echo "trifft ein";
    } elseif(false) {
      echo "trifft nie ein";
    } else {
      exit;
    }

    Und achja. Du verwendest als Syntax-"theme" auch brav php4_v3? Und nicht das beknackte HTML in PHP oder wie das heißt?


    hmpf. denk dir die 2 leerzeichen dazu wenn sie net da sind....