PHP Finde den Fehler im Code nicht

mikelsdump

Ensign
Registriert
Aug. 2008
Beiträge
133
Hi,

ich versuche eine Eingabe in eine Tabellenamens "meva_an" zu machen über ein Userformular. Aber irgendwie werden meine Variablen $Code und §Positionen immer mit der Zahl 0 beschrieben, sprich die "else" bedingung tritt immer in Kraft. Kann mir jemand sagen, worin der Fehler liegt? (Siehe Code)

Weiß jemand einen Link, wo ich sehen kann, wann man welche Zeichen (', ", . , `, etc) verwenden muss, um Befehle korrekt auszuführen? Ich weiß leider nicht, mit welchem Begriff ich das googlen könnte. Wie nennt man diese Zeichen?

Wie ihr seht habe ich am Ende zwei Varianten der $sql variable - funktionieren tut nur die zweite. Gibt es eine Möglichkeit, die Accentegus (oder doch Accentographs?) zu umgehen?

Danke für jede Hilfe:)

PHP:
 <HTML>
 <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method=\"post\">
 </HTML>
 <?
 echo "<div class=\"AN\"> Auftrag definieren<br>";
 echo "1"."-";
 echo "<input type=\"Text\" name=\"Code\" id=\"Code\" value=\"\" size=\"2\" maxlength=\"3\">-";
 echo "<input type=\"Text\" name=\"Positionen\" id=\"Positionen\" value=\"\" size=\"2\" maxlength=\"3\">";
 
 
 echo "<br><br>";
 
 if (isset($_POST["Code"])) {
 
 $Code=htmlspecialchars($_POST["Code"]);
 $Positionen=htmlspecialchars($_POST["Positionen"]);
 }
 ELSE {
 $Code="";
 $Positionen="";
 }
 echo "<input type=\"submit\" value=\"Erstellen\"></form>";
 $sql=mysql_query("INSERT INTO meva_an (Lfd-Nr, Code, Positionen) values (NULL, '$Code', '$Positionen')");
 $sql=mysql_query("INSERT INTO `db1047982`.`meva_an` (`Lfd-Nr`, `Code`, `Positionen`) VALUES (NULL, '$Code', '$Positionen');");
 
Wieso lässt du dir nicht einfach mal alles, was in $_POST drinsteht ausgeben?
 
Erstmal solltest du HTML und PHP strikter trennen. Das HTML Formular ueber PHP ausgeben macht nur Probleme.

Und in deinem echo vom Code ist ein '-' hinten zuviel, nimm das mal raus.

Die Lfd-Nr musst du nicht eintragen. (Nur falls es der primary key ist und auf auto increment steht!)!

Dann beim SQL query noch: Alles einfach in den " " lassen und die einzelnen um die Werte escapen.

Ich poste mal eine von mir geschriebene Funktion zum einfuegen von Daten in eine Tabelle, dynamisch fuer jede Tabelle moeglich!
Ist auf den MS SQL Server ausgelegt, deswegen das SQL-prepare und Execute gegen SQL Injections. Sollte man also ein wenig anpassen falls du MySQL oder so nutzt ;)

PHP:
// fuegt einen neuen Datensatz in eine Tabelle ein
// Felder und Werte mssen als Arrays bergeben werte, dabei unbedingt auf die
// korrekte Reihenfolge der Werte achten!!!
// ALLE Werte mssen als String vorliegen!!!
// Bsp.:
//      Felder: array('FELD1', 'FELD2', 'FELD3', ...)
//      Werte;  array('WERT_FELD1', 'WERT_FELD2', 'WERT_FELD3', ...)
function insertDataset( $table = '', $fields = array( ), $values = array( ) ) {
    $firebug = FirePHP::getInstance( true );
    //$firebug->log($values);
    foreach( $fields as $key ) {
        if( $fields[count( $fields ) - 1] != $key ) {
            $fieldString .= '[' . $key . '], ';
        } else {
            $fieldString .= '[' . $key . ']';
        }
    }

    foreach( $values as $key ) {
        if( $values[count( $values ) - 1] !== $key ) {
            $valueString .= '\'' . preg_replace( "/'/", "''", $key ) . '\', ';
        } else {
            $valueString .= '\'' . preg_replace( "/'/", "''", $key ) . '\'';
        }
    }

    $sqlquery = sqlsrv_prepare( $GLOBALS['databaseServerConnection'], 'INSERT INTO [' . $table . '] (' . $fieldString . ')
        VALUES (' . $valueString . ')' );

    if( sqlsrv_execute( $sqlquery ) ) {
        return true;
    } else {
        return false;
    }
}


Danke nicht vergessen ;)
 
Zuletzt bearbeitet:
Hast du dir das HTML mal angesehen?
Code:
<HTML>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method=[B]\[/B]"post[B]\[/B]">
</HTML>
Dort ist nichts zu escapen. Ein Blick auf die URL hätte es aber verraten sollen, dass da was nicht stimmt.
 
Du solltest dir vor allem erstmal angewöhnen HTML Content und PHP zu trennen.

Bei dir wird nichts dynamisch in die Form eingefügt, also hat HTML an der Stelle auch nichts verloren.
Dein HTML Tag schließt auch zu schnell wieder.
Versuchs mal mit:
<HTML>
<HEAD></HEAD>
<BODY>
<FORM>
</BODY>
</HTML>

In PHP bedeuten " (Doppelte) dass eventuell vorkommende Variablen interpretiert werden.

Also wird in

echo "Hier steht ein $test";

der Wert von $test eingefügt.
 
Hey alle zusammen,

vielen Dank für die schnellen Hilfen, letzten Endes lag es aber offensichtlich daran, dass ich den Form-Tag beendet hatte bevor ich den submitbutton eingebunden hatte....:D Bööööser Schlamperfehler...ich glaub ich hab wirklich zu lange nicht mehr gecodet wenn selbst HTML mir nun Schwierigkeiten bereitet....
 
Der Fehler liegt am escapten method-Attribut, das html-Tag ist egal. Wenn du dir die URL ansiehst, wird nämlich alles per get übergeben, anstatt post.
 
Yuuri schrieb:
Der Fehler liegt am escapten method-Attribut, das html-Tag ist egal. Wenn du dir die URL ansiehst, wird nämlich alles per get übergeben, anstatt post.

Du hast recht, es wurde zunächst per GET übergeben. Ich habe die escapes dann rausgemacht, aber dann ging es immer noch nicht. Damit es funktionierte musste ich erst den submit button ins formular reinbringen. Danke nochmal :)
Ergänzung ()

Noch eine Frage:

Welche Möglichkeiten gibt es denn, dem user nach dem Abschicken zu sagen dass sein Eintrag erstellt wurde? (und dabei nochmal sämtliche Werte hinzuschreiben, die von ihm soeben eingetragen wuden?)
Denn es wäre ja möglich, dass der Eintrag des users nicht gleichzeitig auch die letzte Zeile in der Tabelle wäre, oder? (theoretisch kann es doch passieren, dass ein anderer user eine milisekunde später einen eintrag gemacht hat)
 
Zuletzt bearbeitet:
Pruefen ob der Query erfolgreich ausgefuehrt wurde, und wenn ja: ausgabe der daten welche du aus dem formular hast.
 
IC3HANDS schrieb:
Pruefen ob der Query erfolgreich ausgefuehrt wurde, und wenn ja: ausgabe der daten welche du aus dem formular hast.

Vielen Dank, über google hab ich dank deiner Schlagworte Hinweise gefunden, die mir halfen gültigen Code zu schreiben bzgl. der Prüfung.

Jetzt stellt sich noch das Problem mit der Ausgabe der Formulardaten...irgendwie will das bei mir nicht einzeln klappen. Meinem Verständnis nach sollte das funktionieren über
PHP:
echo $_POST[0];
den ersten Wert des Arrays darzustellen. Funktioniert aber nicht, stattdessen kommt:
Notice: Undefined offset: 0 in C:\xampp\htdocs\PPV\Counter.php on line 110
Ergänzung ()

Okay, meine Frage bzgl. des Array hat sich teilweise geklärt. Hätte natürlich die id "Code" oder "Positionen" angeben müssen statt Zahlen in den eckigen Klammern.

Nun ist es allerdings so, dass dies bei "Lfd-Nr" nicht funktioniert. Der übermittelte Wert ist immer NULL, weil Lfd-Nr primary key mit auto increment ist. Schätze hier geht es nicht anders als den autoincrement wert aus der Tabelle auszulesen, oder?
 
Was willst du machen? Neue Daten eintragen oder bestehende aktualisieren? Mit INSERT trägst du Daten ein, mit UPDATE aktualisierst du diese. In deinem Formular gibts auch gar kein Feld für Lfd-Nr, sowie übergibst du dem INSERT immer NULL für diese Spalte. Einen Autoincrement Wert zu ändern halte ich aber gänzlich für unangebracht, zumal dieser oft und gern als ID verwendet wird (da einzigartig).
 
Also wenn das Lfd-Nr wirklich übergeben werden muss würde ich mir Gedanken um das Minuszeichen (bzw. Bindestrich) im Namen machen ;) Dann klappt das schon.
Aber auto increment sollte sinnvoller sein...
 
Danke für eure Anregungen. Ich habe mich jetzt entschieden, die Bestätigung über den Eintrag doch aus der Tabelle auszulesen, eben wegen des autoincrement, das ja beim Formular nicht in Form einer Zahl übergeben wird. Ändern werd ich die Spaltenbezeichnung "Lfd-Nr" trotzdem :)

Ich habe das jetzt so versucht, aber irgendwie funktioniert das nicht
PHP:
$result=mysql_query("SELECT * FROM `db1047982`.`meva_an` ORDER BY `Lfd_Nr` DESC LIMIT 1");
echo $result["Lfd_Nr"];
 
Code:
$result = mysql_fetch_array( mysql_query( 'SELECT ...' ) );
 
Zurück
Oben