Undefined variable: sql ; mysqli::query(): Empty query; Undefined variable: sql

  • Moin,


    das INSERT funktioniert jetzt. Aber jetzt habe ich das Problem, dass angeblich meine $sql nicht definiert sei...

    Hier die Fehlermeldungen:


    Notice: Undefined variable: sql in C:\xampp\htdocs\spiel\endscreen.php on line 43
    Warning: mysqli::query(): Empty query in C:\xampp\htdocs\spiel\endscreen.php on line 43
    Notice: Undefined variable: sql in C:\xampp\htdocs\spiel\endscreen.php on line 46



    CODE:


    <html>


    <head>

    </head>


    <body>





    <form action="" method="post" name="formular1">

    <p><b>Ihren Namen hier eingeben</p></b>

    <input type="text" name="user" value="" size="50" maxlength="150" required/>

    <input type="submit" name="Button" value="Absenden">



    <?php

    # Error wird gemeldet

    error_reporting(-1);


    $servername = "localhost";

    $username = "root";

    $password = "";

    $dbname = "numberguess";


    # Connection wird erstellt

    $conn = new mysqli($servername, $username, $password, $dbname);

    # Connection prüfen

    if ($conn->connect_error)

    {

    die("Verbindung fehlgeschlagen: " . $conn->connect_error);

    }





    if (isset($_POST['user']))

    {

    $user = $_POST['user'];

    $sql = "INSERT INTO stats (user) VALUES ('$user')";

    }


    if ($conn->query($sql) === TRUE) {

    echo "Neue Verbindung hergestellt";

    } else {

    echo "Fehler: " . $sql . "<br>" . $conn->error;

    }


    $conn->close();


    ?>

    </body>

  • Fehler behoben:

    Habe einfach unten die den kompletten if block oben mit bei isset rein getan.


    also so hier:


    <html>


    <head>

    </head>


    <body>





    <form action="" method="post" name="formular1">

    <p><b>Ihren Namen hier eingeben</p></b>

    <input type="text" name="user" value="" size="50" maxlength="150" required/>

    <input type="submit" name="Button" value="Absenden">



    <?php

    # Error wird gemeldet

    error_reporting(-1);


    $servername = "localhost";

    $username = "root";

    $password = "";

    $dbname = "numberguess";


    # Connection wird erstellt

    $conn = new mysqli($servername, $username, $password, $dbname);

    # Connection prüfen

    if ($conn->connect_error)

    {

    die("Verbindung fehlgeschlagen: " . $conn->connect_error);

    }





    if (isset($_POST['user']))

    {

    $user = $_POST['user'];

    $sql = "INSERT INTO stats (user) VALUES ('$user')";


    if ($conn->query($sql) === TRUE) {

    echo "Neue Verbindung hergestellt";

    } else {

    echo "Fehler: " . $sql . "<br>" . $conn->error;

    }

    }



    $conn->close();








    ?>

    </body>

  • Das Grundproblem ist immer noch der erste Aufruf der Seite.

    Du hast keine Ahnung, was isset() überhaupt macht, oder? Du musst Dich mit den Befehlen/Funktionen, die Du verwendest vertraut machen, sprich: Doku lesen!


    Beim ersten Aufruf der Seite, existieren keine POST-Daten, weil es eine reine GET-Anforderung ist.

    Da $sql im Wahrheitsblock von isset($_POST['user']) definiert wird, existiert es außerhalb des Scope nunmal nicht!

  • Wenn man keine Ahnung hat was manche Befehle bedeuten hilft ja die Doko.

    Ab und zu hilft es aber auch schon wenn man sich die Befehle übersetzen läßt ( Wenn man kein Englisch kann ) und

    dann kommt bei isset() " IST EINGESTELLT " raus..

    Damit sollte man auch schon was anfangen können, vorallem wenn man merkt das in den if isset() Block auf einmal was Funktioniert.

  • Mir ist schon klar, dass isset eine Var. prüft ob Sie exestiert.... Deswegen mache ich das ja ...

    Kurzzeitig ging es mit den Fehlern, also da kam kein Fehler, so wie ich es als Lösung oben hatte, aber jetzt sind wieder Fehler da. bzw. das wieder beim refreshen, wieder Daten geschickt werden... Warum??

    #UPDATED

  • Dann zeig uns doch mal Code. Und immer dran denken das Php auf Server läuft und das man die änderungen erst nach den Reload sieht. Bevor ich hier was versuche zu erklären und es sowieso nicht hinbekomme ,zeig uns mal deinen Code dazu


    aber jetzt sind wieder Fehler da. bzw. das wieder beim refreshen, wieder Daten geschickt werden... Warum??

    He.Du meinst wenn du nach den Senden nochmal die Seite Aktualiesierst ? Ja das ist halt so das die Daten die du vorher eingegeben hast dann nochmal gesendet werden.Um sowas zu verhindern gibt es ja auch möglichkeiten mit php das doppeltes senden erst gar nicht gespeichert wird

  • CODE:


  • Schau dir zur sicheren Programmierung aufjedenfall folgenden Beitrag an: Sichere Programmierung in PHP.

    Ok. Habe ich das richtig dort verstanden, dass man einfach nur Prepared Statements, viele If Abfragen ggf. auch isset() machen muss?

  • DevFlash :


    Ja genau.


    Dein gezeigter Code lässt weiterhin eine SQL-Injetcton zu. Nutze am besten Prepared Statements. Dies ist meiner Meinung nach die beste Methode sich vor SQL-Injections zu schützen. In prepare wird die Query vorbereitet und erst im execute werden der Query die gefilterten aussenstehende Daten hinzugefügt.


    Zitat


    viele If Abfragen ggf. auch isset()

    Was meinst du damit?


    Grüße,

    Stef

  • Bezügl. diesem Problem, wurde mir auch oft gesagt, dass sich bei so einer Situation am besten mit MVC macht, weil man dann dieses Problem, was ich zurzeit habe verhindern kann.

  • Hey


    Bezügl. diesem Problem, wurde mir auch oft gesagt, dass sich bei so einer Situation am besten mit MVC macht, weil man dann dieses Problem, was ich zurzeit habe verhindern kann.

    Wie Arne bereits gesagt hat ist das ein Design Pattern. Dies stellt nur eine bessere Trennung der Bereiche da. Mehr macht es nicht.


    Auch da musst du den Code selbst programmieren. Da musst du die Sicherheitslücke SQL-Injection selbst beheben. Dies erreichst du wie gesagt mit der Anwendung von Prepared Statements.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!