Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Ein SQL syntax Fehler in der PHP Code

Empfohlene Antworten

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?

fehler in der mysql syntax ;)

wäre sinnvoll wenn du deinen code posten könntest btw dein querry-string

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]

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.

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 ...

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 ;)

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.

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 

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.

Ja, ich habe $_FILES durch $_POST ersetzt und jetzt funktioniert es alles, danke an alle.

Bis zum nächsten Mal.

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

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

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

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

Danke dir JesterDay, jetzt hab ich ganz verstanden über den SQL-Injections

MfG max

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.