madmax00 Geschrieben 16. März 2006 Geschrieben 16. März 2006 Hallo, Leute. ich habe wieder eine Frage. Seit paar Tagen kann ich keine Lösung für meine Fehler finden. Der Fehler heißt so: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1. Was soll das bedeuten? Kann mir jemand sagen? Zitieren
Trux Geschrieben 16. März 2006 Geschrieben 16. März 2006 fehler in der mysql syntax wäre sinnvoll wenn du deinen code posten könntest btw dein querry-string Zitieren
madmax00 Geschrieben 16. März 2006 Autor Geschrieben 16. März 2006 ja bitte <?php include("../MyRusTel/connect.php"); $Bundesland = array(1 => "Baden Württemberg", "Bayern", "Berlin", "Brandenburg", "Bremen", "Hamburg", "Hessen", "Mecklenburg-Vorpommern", "Niedersachsen", "Nordrhein-Westfalen", "Rheinland-Pfalz", "Saarland", "Sachsen", "Sachsen-Anhalt", "Schleswig-Holstein", "Thüringen"); $Branche = array(1 => "Recht", "Reisen", "Portale"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content=" text/html; charset=utf-8"> <title>Unbenanntes Dokument</title> </head> <body> <form action="Registrierung.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000"> <table> <tr> <td>Name / Имя</td> <td><input type="text" name="Name" size="50"></td> </tr> <tr> <td>Beschreibung / Описание</td> <td><textarea name="Beschreibung" cols="39" rows="20"></textarea></td> </tr> <tr> <td>Strasse / Улица</td> <td><input type="text" name="Strasse" size="50"></td> </tr> <tr> <td>PLZ / Индех</td> <td><input type="text" name="PLZ" size="50"></td> </tr> <tr> <td>Ort / Город</td> <td><input type="text" name="Ort" size="50"></td> </tr> <tr> <td>Bundesland / Земля Германии</td> <td> <select size="1" name="Bundesland"> <?php for($i=0; $i<=16; $i++){ echo "<option"; echo " value=\"".$i."\">".$Bundesland[$i]."</option>\n"; } ?> </select> </tr> <tr> <td>Telefon / Телефон</td> <td><input type="text" name="Telefon" size="50"></td> </tr> <tr> <td>Mobil / Мобильный</td> <td><input type="text" name="Mobil" size="50"></td> </tr> <tr> <td>Fax / Факс</td> <td><input type="text" name="Fax" size="50"></td> </tr> <tr> <td>E-Mail</td> <td><input type="text" name="E-Mail" size="50"></td> </tr> <tr> <td>Homepage</td> <td><input type="text" name="Homepage" size="50"></td> </tr> <tr> <td>Branche / Отрасль</td> <td> <select size="1" name="Branche"> <?php for($i=0; $i<=3; $i++){ echo "<option"; echo " value=\"".$i."\">".$Branche[$i]."</option>\n"; } ?> </select></td> </tr> <tr> <td colspan="2"><input type="submit" value="speichern" name="btnSpeichern"></td> </tr> </table> </form> <?php // Wenn der Button speichern gedrueckt wurde if (isset($_POST['btnSpeichern'])) { $strDBName = "myrustel"; $insert_sql= "INSERT INTO kundendaten SET"; if(!empty($_FILES['Name'])) { $insert_sql.=", Name='".mysql_escape_string($_REQUEST['Name'])."'"; //$insert_sql.="', Name='".htmlentities($_REQUEST['Name'], ENT_NOQUOTES); } if(!empty($_FILES['Beschreibung'])) { $insert_sql.=", Beschreibung='".mysql_escape_string($_REQUEST['Beschreibung'])."'"; //$insert_sql.="', Beschreibung='".htmlentities($_REQUEST['Beschreibung'], ENT_NOQUOTES); } if(!empty($_FILES['Strasse'])) { $insert_sql.=", Strasse='".mysql_escape_string($_REQUEST['Strasse'])."'"; //$insert_sql.="', Strasse='".htmlentities($_REQUEST['Strasse'], ENT_NOQUOTES); } if(!empty($_FILES['PLZ'])) { $insert_sql.=", PLZ='".mysql_escape_string($_REQUEST['PZL'])."'"; //$insert_sql.="', PLZ='".htmlentities($_REQUEST['PLZ'], ENT_NOQUOTES); } if(!empty($_FILES['Ort'])) { //$insert_sql.=", Ort='".mysql_escape_string($_REQUEST['Ort'])."'"; $insert_sql.="', Ort='".htmlentities($_REQUEST['Ort'], ENT_NOQUOTES); } if(!empty($_FILES['Bundesland'])) { $insert_sql.=", Bundesland='".mysql_escape_string($_REQUEST['Bundesland'])."'"; // $insert_sql.="', Bundesland='".htmlentities($_REQUEST['Bundesland'], ENT_NOQUOTES); } if(!empty($_FILES['Telefon'])) { $insert_sql.=", Telefon='".mysql_escape_string($_REQUEST['Telefon'])."'"; //$insert_sql.="', Telefon='".htmlentities($_REQUEST['Telefon'], ENT_NOQUOTES); } if(!empty($_FILES['Mobil'])) { $insert_sql.=", Mobil='".mysql_escape_string($_REQUEST['Mobil'])."'"; //$insert_sql.="', Mobil='".htmlentities($_REQUEST['Mobil'], ENT_NOQUOTES); } if(!empty($_FILES['Fax'])) { $insert_sql.=", Fax='".mysql_escape_string($_REQUEST['Fax'])."'"; //$insert_sql.="', Fax='".htmlentities($_REQUEST['Fax'], ENT_NOQUOTES); } if(!empty($_FILES['E-Mail'])) { $insert_sql.=", E-Mail='".mysql_escape_string($_REQUEST['E-Mail'])."'"; //$insert_sql.="', E-Mail='".htmlentities($_REQUEST['E-Mail'], ENT_NOQUOTES); } if(!empty($_FILES['Homepage'])) { $insert_sql.=", Homepage='".mysql_escape_string($_REQUEST['Homepage'])."'"; // $insert_sql.="', Homepage='".htmlentities($_REQUEST['Homepage'], ENT_NOQUOTES); } if(!empty($_FILES['Branche'])) { $insert_sql.=", Branche='".mysql_escape_string($_REQUEST['Branche'])."'"; //$insert_sql.="', Branche='".htmlentities($_REQUEST['Branche'], ENT_NOQUOTES); } // SQL- Statement ausführen und bei einem Fehler die MySQL- Fehlermeldung ausgeben $Ergebnis = mysql_query($insert_sql, $connect) or die (mysql_error()); } ?> </body> </html> [/PHP] Zitieren
xmurrix Geschrieben 16. März 2006 Geschrieben 16. März 2006 In allen if()-Aweisungen überprüfst du auf Werte von $_FILES, also wird die SQL-Anweisung nie vollständig und halb fertig an die DB geschickt das solltest du mit $_REQUEST machen, also if(!empty($_REQUEST['Name'])) { $insert_sql.=", Name='".mysql_escape_string($_REQUEST['Name'])."'"; //$insert_sql.="', Name='".htmlentities($_REQUEST['Name'], ENT_NOQUOTES); } [/PHP] Außerdem solltest du einen Schalter einbauen, der auf True gesetzt wird, wenn mindesten ein Feld korrekte Daten hat. Ansonsten hast du wieder ein unvollständiges Statement, wenn der User nichts eingibt und das Formular abschickt. Zitieren
baba007 Geschrieben 17. März 2006 Geschrieben 17. März 2006 kannst du mal bitte das : $Ergebnis = mysql_query($insert_sql, $connect) or die (mysql_error()); entfernen und das echo $insert_sql; [/PHP] einfügen bitte ? Das Ergebnis hier posten ... Zitieren
Joe Kinley Geschrieben 17. März 2006 Geschrieben 17. März 2006 Ausserdem wird immer zu Beginn das Komma gesetzt, dies darf beim ersten Mal nicht passieren.... Also UPDATE Table SET , column = value Des darf net sein Zitieren
geloescht_JesterDay Geschrieben 17. März 2006 Geschrieben 17. März 2006 Das Problem dürfte wohl das Komma sein, aber was mir aufgefallen ist: if(!empty($_FILES['Name'])) { $insert_sql.=", Name='".mysql_escape_string($_REQUEST['Name']) [/php] Warum nutzt du $_FILES und $_REQUEST? Als input type hast du überall nur text. Frag doch mit $_POST ab, dann bist du sicher, dass es von da kommt, wo es herkommen soll. Eine wirkliche Sicherheitlücke o.ä. kann ich jetzt hier nicht ausmachen, aber ein aufruf von meinserver/meinedatei.php?name=murks Reicht ja, um da was einzutragen. Wie gesagt, so direkt ein Fehler oder eine Lücke ist es wohl nicht, aber du solltest dir dennoch angewöhnen mit $_POST und $_GET zu arbeiten, nicht mit $_REQUEST. Zitieren
madmax00 Geschrieben 18. März 2006 Autor Geschrieben 18. März 2006 kannst du mal bitte das : PHP-Code: $Ergebnis = mysql_query($insert_sql, $connect) or die (mysql_error()); entfernen und das PHP-Code: echo $insert_sql; einfügen bitte hab ich gemacht, es kam bei mir dann einer Meldung INSERT INTO kundendaten SET Zitieren
~tine~ Geschrieben 18. März 2006 Geschrieben 18. März 2006 Hast du denn mal die bereits geposteten Hinweise zum Ändern deines Quellcodes beachtet und umgesetzt? Beispielsweise das $_FILES durch $_POST oder $_REQUEST ausgetauscht? Mit $_FILES wird dein Skript nicht funktionieren. Zitieren
madmax00 Geschrieben 18. März 2006 Autor Geschrieben 18. März 2006 Ja, ich habe $_FILES durch $_POST ersetzt und jetzt funktioniert es alles, danke an alle. Bis zum nächsten Mal. Zitieren
madmax00 Geschrieben 18. März 2006 Autor Geschrieben 18. März 2006 Leute, ich habe direkt noch eine Frage: Wie kann ich alle geeigneten Zeichen in entsprechende HTML-Codes umwandeln. Ich habe gerade mit htmlentities versucht, aber es klappt irgendwie nicht. if(!empty($_POST['Name'])) { $insert_sql.=" Name='".mysql_real_escape_string(htmlentities($_REQUEST['Name'], ENT_NOQUOTES))."'" ; } [/PHP] Wenn ich eingebe: [b][color=Red]"Test"[/color][/b] der gibt mir [b][color=red]\"Test\"[/color][/b] aus. was mache ich wieder falsch? MfG max Zitieren
geloescht_JesterDay Geschrieben 20. März 2006 Geschrieben 20. März 2006 Wenn ich eingebe: "Test" der gibt mir \"Test\" aus. was mache ich wieder falsch? Nichts, das macht mysql_real_escape_string. Die Funktion ist dazu da, Zeichen, die auch in SQL-anweisungen vorkommen können zu "escapen" (also z.B. den \ davor). Tust du das nicht, steht da dann zwar "Test" drin, aber dein Skript ist anfällig für SQL-Injections Zitieren
madmax00 Geschrieben 20. März 2006 Autor Geschrieben 20. März 2006 Nichts, das macht mysql_real_escape_string. Die Funktion ist dazu da, Zeichen, die auch in SQL-anweisungen vorkommen können zu "escapen" (also z.B. den \ davor). Tust du das nicht, steht da dann zwar "Test" drin, aber dein Skript ist anfällig für SQL-Injections Hallo, dann habe ich sofort noch eine Frage: ist das besser (oder welche Unterschied auch aus Sicherheit Sichten), dass ich nicht mysql_real_escape_string sondern htmlentities benutzen werde? nicht if(!empty($_POST['Name'])) { $insert_sql.=" Name='".mysql_real_escape_string($_POST['Name'])."'" ; } [/PHP] sondern [PHP] if(!empty($_POST['Name'])) { $insert_sql.=" Name='".htmlentities($_POST['Name'], ENT_NOQUOTES)."'" ; } so kann ich auch " und ' ohne Probleme zu speichern Mit freundlichen Grüßen max Zitieren
geloescht_JesterDay Geschrieben 21. März 2006 Geschrieben 21. März 2006 ist das besser (oder welche Unterschied auch aus Sicherheit Sichten), dass ich nicht mysql_real_escape_string sondern htmlentities benutzen werde? [...] so kann ich auch " und ' ohne Probleme zu speichern Du beantwortest deine Frage ja gleich selber htmlentities ist nicht dasselbe und gegen SQL-Injections nicht hilfreich. Hast du die verlinkte Seite überhaupt angesehen? ' wird in SQL für Strings benutzt, wenn du das also vom Benutzer eingeben läßt, kann der damit auch böse Dinge tun: $loginname = $_POST["name"]; $password = $_POST["pass"]; $sql = "SELECT user_id FROM USER WHERE loginname = '$loginname' AND password = md5('$password')"; Benutzereingabe: name: hugo pass: 123') OR TRUE=TRUE OR pass =(' sql->SELECT user_id FROM USER WHERE loginname = 'hugo' AND password = md5('123') OR TRUE=TRUE OR pass =('') Zitieren
madmax00 Geschrieben 21. März 2006 Autor Geschrieben 21. März 2006 Danke dir JesterDay, jetzt hab ich ganz verstanden über den SQL-Injections MfG max Zitieren
geloescht_JesterDay Geschrieben 22. März 2006 Geschrieben 22. März 2006 ICh bin gerade daran, was von mir zu ändern und da hab ich mir meine "escape" Funktion nochmal angesehen: function quote_smart($value, $Enc_HTML = FALSE) { // stripslashes, falls nötig if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // escapen falls kein integer if (!is_numeric($value)) { if(version_compare(phpversion(),"4.3.0")=="-1") { $value = mysql_escape_string($value); } else { $value = mysql_real_escape_string($value); } } //*** html entities if ($Enc_HTML) $value = htmlentities($value, ENT_QUOTES); return $value; } [/php] mit stripslashes entfernst du die \ wieder (kann bei deinem Auslesen hilfreich sein). Da das von PHP manchmal selbst gemacht wird (aber nicht 100% für SQL), hier an Anfang u.U. erstmal entfernen. EDIT: Bei mysql_real_escape_string kannst du die Verbindungskennung mitgeben (also was du von mysql_connect zurückbekommst). Damit werden evtl. Sprachunterschiede etc. berücksichtigt. Ich hab meine Funktion erst später eingeführt und an den Stellen wo sie aufgerufen wird die Verbindung nicht immer im Zugriff, deswegen hab ich es weggelassen. Wenn möglich sollte man das aber mitbenutzen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.