16. März 200619 j 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?
16. März 200619 j fehler in der mysql syntax wäre sinnvoll wenn du deinen code posten könntest btw dein querry-string
16. März 200619 j 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]
16. März 200619 j 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.
17. März 200619 j 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 ...
17. März 200619 j 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
17. März 200619 j 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.
18. März 200619 j 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
18. März 200619 j 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.
18. März 200619 j Ja, ich habe $_FILES durch $_POST ersetzt und jetzt funktioniert es alles, danke an alle. Bis zum nächsten Mal.
18. März 200619 j 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
20. März 200619 j 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
20. März 200619 j 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
21. März 200619 j 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 =('')
22. März 200619 j 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.