mySQL-Error
Sebastian Becker
- datenbank
Hallo,
ich habe anscheinend einen lausigen - und vermutlich ganz simplen - Fehler in meiner mySQL-Syntax, den ich aber ums Verrecken nicht finde.
Wenn ich den auszuführenden SQL-string in PhpMyAdmin eingebe, ist alles O.K.. Wenn ich ihn aber mit meinem eigenen Skript ausführen möchte, kommt folgende Fehlermeldung ...
1064: 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 ''speisekarte'; CREATE TABLE IF NOT EXISTS 'speisekarte' ( 'id'
Mein Script (Auszug) steht unten.
Welcher begnadete mySQL-Experte hilft mir auf die Sprünge?
Danke, Grüße aus berlin,
Sebastian
$sql_str="DROP TABLE IF EXISTS 'speisekarte';\n";
$sql_str.="CREATE TABLE IF NOT EXISTS 'speisekarte' (
'id' int(11) NOT NULL auto_increment,
'number' varchar(50) default NULL,
'category' varchar(50) default NULL,
'description_de' varchar(255) default NULL,
'ingredients_de' varchar(255) default NULL,
'description_en' varchar(255) default NULL,
'ingredients_en' varchar(255) default NULL,
'euro' varchar(50) default NULL,
KEY 'ID' ('id')
)
TYPE=MyISAM AUTO_INCREMENT=333 ;\n";
// ...
$result=mysql_query($sql_str);
if(!$result)echo mysql_errno() . ": " . mysql_error(). "\n";
// ...
Hallo Sebastian,
ich habe anscheinend einen lausigen - und vermutlich ganz simplen - Fehler in meiner mySQL-Syntax, den ich aber ums Verrecken nicht finde.
ja, Du benutzt einfache Anführungszeichen statt Backticks als (hier nicht erforderliche) Maskierungszeichen.
Wenn ich den auszuführenden SQL-string in PhpMyAdmin eingebe, ist alles O.K..
Nö, nicht wenn Du exakt diesen String eingibst :-)
$sql_str="DROP TABLE IF EXISTS 'speisekarte';\n";
Vergleiche das Maskierungszeichen, das PhpMyAdmin einfügt mit dem von Dir verwendeten.
Freundliche Grüße
Vinzenz
hi,
ich habe anscheinend einen lausigen - und vermutlich ganz simplen - Fehler in meiner mySQL-Syntax, den ich aber ums Verrecken nicht finde.
ja, Du benutzt einfache Anführungszeichen statt Backticks als (hier nicht erforderliche) Maskierungszeichen.
Darüber hinaus ist es nicht möglich, mehr als eine Query mit mysql_query() abzusetzen.
gruß,
wahsaga
Hallo, Ihr beiden,
ja, Du benutzt einfache Anführungszeichen statt Backticks als (hier nicht erforderliche) Maskierungszeichen.
Darüber hinaus ist es nicht möglich, mehr als eine Query mit mysql_query() abzusetzen.
Danke, schon mal sehr gute Hinweise für jemanden, der noch nicht allzuviel Erfahrung mit mySQL hat! :-)
[Warum das jeweils so ist, will ich besser nicht fragen ...]
Leider kommt jetzt folgende Fehlermeldung ...
1064: 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 ';CREATE TABLE IF NOT EXISTS speisekarte
( id
int(11) NOT NULL
Die Tabelle wird also nicht erzeugt ...
Code siehe unten. Any ideas?
Danke, Grüße,
Sebastian
$sql_str.="CREATE TABLE IF NOT EXISTS speisekarte
(
id
int(11) NOT NULL auto_increment,
number
varchar(50) default NULL,
category
varchar(50) default NULL,
description\_de
varchar(255) default NULL,
ingredients\_de
varchar(255) default NULL,
description\_en
varchar(255) default NULL,
ingredients\_en
varchar(255) default NULL,
euro
varchar(50) default NULL,
KEY ID
(id
)
)
TYPE=MyISAM AUTO_INCREMENT=333 ;";
$sql_str.="INSERT INTO speisekarte
VALUES($counter
, $number
, $category\_descr
, $descr\_de
, $ingr\_de
, $descr\_en
, $ingr\_en
, $price\_euro
);\n";
Hallo Sebastian,
Leider kommt jetzt folgende Fehlermeldung ...
1064: 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
lies Dir nochmals wahsagas Posting durch :-)
';CREATE TABLE IF NOT EXISTS
speisekarte
(id
int(11) NOT NULL
Schau Dir das erste Zeichen Deines Statements an.
> $sql_str.="CREATE TABLE IF NOT EXISTS `speisekarte` (
Ein Punkt zuviel.
$sql_str.="INSERT INTO
speisekarte
VALUES($counter
,$number
,$category\_descr
,$descr\_de
,$ingr\_de
,$descr\_en
,$ingr\_en
,$price\_euro
);\n";
Nein, Du kannst mit PHP immer noch nur ein SQL-Statement auf einmal an MySQL schicken. Du musst also Deine drei Statements nacheinander ausführen lassen:
1. DROP TABLE
2. CREATE TABLE
Diese beiden Schritte könntest Du duch TRUNCATE TABLE ersetzen.
3. INSERT INTO
Jedes einzelne Statement erfordert ein mysql_query().
Eine Frage: Warum löschst Du die Tabelle und legst sie wieder erneut an? Wird das ein Installationsskript?
Freundliche Grüße
Vinzenz
Hallo, Vinzenz,
ich kann Deine freundliche Erklärung nur zum Teil nachvollziehen und poste mal besser einen umfassenderen Auszug aus meinem schon etwas nachbgebesserten Code (s.u.).
Eine Frage: Warum löschst Du die Tabelle und legst sie wieder erneut an? Wird das ein Installationsskript?
Zum Testen erst mal ja, und vielleicht auch später ...
Z.Zt. hole ich die Daten in der Schleife aus einer Excel-Tabelle und will die entsprechende Datenbank jedesmal neu anlegen, wenn ein aktualisiertes Excel-File hochgeladen wird.
Später soll es dann auch möglich sein, die Speisekarte über ein Datenbank-Backend zu administrieren. Bis ich das fertig habe, wird es aber sicherlich noch eine Weile dauern, denn solange dessen Nutzeroberfläche nicht superkomfortabel ist (am besten mit Drag-n-Drop-Positionierung der Einträge, direkter Aktualisierung mit Ajax/httpxmlrequest, etc.) ist es für den Anwender einfacher, die Daten jeweils in dem Excel-File zu bearbeiten.
So sieht die Speisekarte übrigens aus (z.Zt. noch IE only) ...
Vielen Dank, Grüße,
Sebastian
// database configuration
$mysql_host = 'localhost';
$mysql_dbname = 'dbname';
$mysql_username = 'username';
$mysql_password = 'password';
$menu_file='speisekarte';
// database connection
$dbh=mysql_connect($mysql_host,$mysql_username,$mysql_password)or die('No mySQL connection');
if(!$dbh)echo mysql_errno() . ": " . mysql_error(). "\n"; // test
$db_select=mysql_select_db($mysql_dbname)or die('No connection to selected database');
if(!$db_select)echo mysql_errno() . ": " . mysql_error(). "\n"; // test
$sql_str='';
$sql_str.="DROP TABLE IF EXISTS $menu_file;";
$sql_str.="CREATE TABLE IF NOT EXISTS $menu_file (
id
int(11) NOT NULL auto_increment,
number
varchar(50) default NULL,
category
varchar(50) default NULL,
description\_de
varchar(255) default NULL,
ingredients\_de
varchar(255) default NULL,
description\_en
varchar(255) default NULL,
ingredients\_en
varchar(255) default NULL,
euro
varchar(50) default NULL,
KEY ID
(id
)
)
TYPE=MyISAM AUTO_INCREMENT=333 ;";
$result=mysql_query($sql_str);
if(!$result)echo mysql_errno() . ": " . mysql_error(). "\n";
$counter=0;
// hier kommt eine Schleife
$sql_str='';
$sql_str.="INSERT INTO $menu\_file
VALUES($counter
, $number
, $category\_descr
, $descr\_de
, $ingr\_de
, $descr\_en
, $ingr\_en
, $price\_euro
);\n";
$result=mysql_query($sql_str);
if(!$result)echo mysql_errno() . ": " . mysql_error(). "\n"; // test
// Ende der Schleife
mysql_close($dbh);
Hallo Sebastian,
So sieht die Speisekarte übrigens aus (z.Zt. noch IE only) ...
bitte die Navigation schleunigst an die richtige Stelle bringen ;-)
$sql_str='';
$sql_str.="DROP TABLE IF EXISTS $menu_file;";
Das ist eine SQL-Anweisung
$sql_str.="CREATE TABLE IF NOT EXISTS $menu_file (
id
int(11) NOT NULL auto_increment,
number
varchar(50) default NULL,
category
varchar(50) default NULL,
description\_de
varchar(255) default NULL,
ingredients\_de
varchar(255) default NULL,
description\_en
varchar(255) default NULL,
ingredients\_en
varchar(255) default NULL,
euro
varchar(50) default NULL,
KEYID
(id
)
)
TYPE=MyISAM AUTO_INCREMENT=333 ;";
jetzt enthält $sql_str _zwei_ SQL-Anweisungen. Wie wahsaga Dir bereits schrieb, kann mysql_query nur _eine_ Query absetzen. Das Problem an dieser Stelle könntest Du mit TRUNCATE TABLE
beheben.
$result=mysql_query($sql_str);
$sql_str='';
$sql_str.="INSERT INTO$menu\_file
VALUES($counter
,$number
,$category\_descr
,$descr\_de
,$ingr\_de
,$descr\_en
,$ingr\_en
,$price\_euro
);\n";
... viele INSERT INTO-Anweisungen. Schau Dir im MySQL-Handbuch, Abschnitt INSERT die Syntax für Multiline-INSERT an. Du kannst kommagetrennt in runde Klammern gefasste Wertlisten übergeben. Dann hast Du nur _ein_ SQL-Statement.
Freundliche Grüße
Vinzenz
echo $begrüßung;
$sql_str='';
$sql_str.="DROP TABLE IF EXISTS $menu_file;";
$sql_str.="CREATE TABLE IF NOT EXISTS $menu_file (
mysql_query() lässt aus Sicherheitsgründen mittlerweile nur noch einen Befehl pro Aufruf zu. Damit soll verhindet werden, dass durch unzureichende Prüfung von Eingabewerten Abfragen entstehen, die vom Programmierer nicht gewollt sind. Gegeben sei:
$sql = "SELECT * FROM table WHERE username='$username'";
Wenn $username ungeprüft vom Anwender übernommen wird und auch keine Sonderzeichen maskiert werden (Stichwort: mysql_real_escape_string()), könnte jemand beispielsweise
'; DELETE table WHERE '1'='1
eingegeben haben, was zu
$sql = "SELECT * FROM table WHERE username=''; DELETE table WHERE '1'='1'";
führen würde.
echo "$verabschiedung $name";