Zum Inhalt springen

Ein SQL syntax Fehler in der PHP Code


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 =('')

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...