Was ist an dieser SQL-Syntax falsch?
-
Aber ich muss doch auch Sachen mit Leerzeichen in die Tabelle eintragen können oder meinst du jetzt "1.Eintrag" etc..?
Gilt das mit den Hochkommata auch für Variable? Dachte immer nur für Zeichenketten. Naja habs eingebaut, fehler ist derselbe
-
Pille456 schrieb:
Aber ich muss doch auch Sachen mit Leerzeichen in die Tabelle eintragen können oder meinst du jetzt "1.Eintrag" etc..?
Gilt das mit den Hochkommata auch für Variable? Dachte immer nur für Zeichenketten.
Die Variable enthält doch eine Zeichenkette, oder?
Pille456 schrieb:
"1.Eintrag" etc..?
Ja.
Was genau hast du eingebaut, und wie sieht der SQL Befehl jetzt aus?
-
basti33 schrieb:
Die Variable enthält doch eine Zeichenkette, oder?
sure, aber bei C++ macht man doch bei Variablen auch keine "". Naja andere Sprache, andere Sitten
Mein Code sieht bisher so aus:
//Verbindung herstellen //füllen von $Wahl1,$Wahl2,$Wahl3 $SQL = "UPDATE TestTabelle SET 1. Eintrag = '$Wahl1', 2. Eintrag = '$Wahl2', 3. eintrag = '$Wahl3', Voll? = 'true' WHERE ID = 'Ich';"; mysql_query($SQL);
Ich werd in der Tabelle die Spaltennamen von "1. Eintrag" usw. mal zusammenziehen und ändern. Aber müsste SQL bei einem solchen Fehler nicht ehr sowas sagen wie "Hilfe finde Spalte nicht.." anstatt Syntax-Fehler?
Edit:
Hab aus "1. Eintrag" "1.Eintrag" in der Datenbank gemacht und den Code entsprechend geändert, half aber nicht...
-
Versuch doch mal deinen Code außerhalb von PHP in eines dieser Datenbankverwaltungsprogramme einzugeben und schau, ob er da funktioniert.
-
Hab mal alles mögliche rumprobiert, aber kommt fast immer der selbe Fehler(manchmal kommt ein Error ohne Fehler o.O) raus:
Syntax-Error.
-
Du musst auch "voll?" in Anführungszeichen schreiben.
Tipp: nimm lieber vernünftige Spaltennamen, die nur aus alphanumerischen Zeichen und dem Unterstrich bestehen. Außerdem sollten sie nicht mit Zahlen anfangen.
-
Hallo,
Pille456 schrieb:
sure, aber bei C++ macht man doch bei Variablen auch keine "". Naja andere Sprache, andere Sitten
Du hast den Code nicht verstanden, den du da zu produzieren versuchst. MySQL bekommt von deiner "PHP-Variablen" überhaupt nichts mehr mit. Du deklarierst für MySQL (und "in" SQL, nicht "in" PHP!) einen String (der den Inhalt der PHP-Variablen enthält), daher die Anführungszeichen.
Stell dir PHP (in diesem Fall) wie eine Art Präprozessor für die SQL-Query vor. Nachdem die Variable interpoliert wurde, sind die Anführungszeichen nötig!#define variable irgendein Text // ... std::cout << variable; // Funktioniert nicht std::cout << "variable"; // Funktioniert
Abgesehen davon, dass die Namen ungünstig sind, probiere einmal Folgendes:
UPDATE `TestTabelle` SET `1. Eintrag` = 'Bla 1', `2. Eintrag` = 'Bla 2', `3. Eintrag` = 'Bla 3', `Voll?` = 1 WHERE ID = 'Ich' LIMIT 1
Zudem noch einige weitere Hinweise, die für dich evtl. bedeutend sein könnten;
1. MySQL kennt keine Bool'schen Datentypen. BOOL ist ein Synonym für TINYINT(1).
2. Strings als IDs sind böse.
3. Lies dir bitte mal einen guten Text zum Thema SQL Injection durch(z.B. http://de.wikipedia.org/wiki/SQL_Injection und in dem Kontext auch http://de.php.net/manual/de/function.mysql-real-escape-string.php )
-
Die `` hab ich schon versucht, brachte auch keine Abhilfe...
Bei den bool kann ich als synoym aber trotzdem true und false verwenden oder?
Wie soll ich das deiner Meinung nach mit der ID sonst machen? Soll ich die Index-Nummer angeben?
-
Schick mal deine komplette, interpolierte Query so, wie du sie an MySQL übergibst.
Was "true/false" angeht:
Ich konnte im Manual keine Angabe dazu finden, ob du true/false benutzen kannst. Ohne Garantie würde ich daher einfach mal sagen, das ginge nicht. Aber was wäre an 1 und 0 so viel schlimmer als an true und false (abgesehen von der eingesparten Tipparbeit ;))IDs werden normalerweise als INT (BIGINT in großen Systemen) deklariert. Dazu kommt noch ein Primärschlüsselindex auf das Feld, und du brauchst dich um gar nichts mehr kümmern
Das ist auch die einzig sinnvolle Variante, da MySQL sehr schwer mit nichtnumerischen Indizes effektiv arbeiten kann.
-
Was meinst du mit "interpolieren"?
Wie kann man eine Query interpolieren?
-
Ich meinte, die Query mit interpolierten Variablen.
Sorry wegen der unklaren (gut, zugegeben falschen) Formulierung
-
Hmm, Interpolation.
Egal.
-
TomasRiker schrieb:
Hmm, Interpolation.
Egal.Das dachte ich mir auch gerade, als ich es nachgeschalgen hatte^^
Also der Code (jetzt angepasst für meine Seite) sieht so aus:
global $DbVerbindung; global $ProjektSatz; $DbVerbindung = mysql_connect("","",""); $ProjektSatz = mysql_db_query("gsfprojekt", "select * from Schülerliste"); $Wahl1 = $_POST['Wahl1']; $Wahl2 = $_POST['Wahl2']; $Wahl3 = $_POST['Wahl3']; $SQL = "UPDATE Schülerliste SET 1.Wahl = '$Wahl1', 2.Wahl = '$Wahl2', 3.Wahl = '$Wahl3', Gewählt = 1 WHERE ID = '2'; //Was soll ich nun da genau angeben? LIMIT 1;"; echo "<p>".$SQL."</p><br>"; //Zum Fehler testen mysql_query($SQL); echo "<p> Fehler: ".mysql_error()."</p>";//Zum Fehler testen
$SQL enthält folgendes:
UPDATE Schülerliste SET 1.Wahl = 'Projekt 1', 2.Wahl = 'Projekt 2', 3.Wahl = 'Projekt 3', Gewählt = 1 WHERE ID = '2'; LIMIT 1;
-
UPDATE `Schülerliste` SET `1.Wahl` = 'Projekt 1', `2.Wahl` = 'Projekt 2', `3.Wahl` = 'Projekt 3', `Gewählt` = 1 WHERE `ID` = 2 LIMIT 1
So ist es zumindest syntaktisch korrekt, vorausgesetzt `1.Wahl`, `2.Wahl` und `3.Wahl` sind existierende String-Spalten der existierenden Tabelle `Schülerliste` sowie `Gewählt` zbd `ID` entsprechend numerische (*INT*). Aber wie bereits gesagt, du solltest keine Umlaute im Namen verwenden (Zeichensatzprobleme möglich), und Sonderzeichen nach Möglichkeit auch nicht (historisch Bedingt, zudem gibt es Namenskonventionen. In wiefern - und ob überhaupt - MySQL hier definiert, weiß ich allerdings nicht).
btw. http://en.wikipedia.org/wiki/Variable#Variable_interpolation
-
Ok...
hab nochmal alles neugetippt und die `` überall gesetzt, wo man sie sozusagen setzten kann^^
Nun gehts... DANKE schonmal dafürDas nächste Problem ist nun aber, dass die ID unbekannt ist bzw. ich gerade gar nicht weiss wie ich die denn nun "richtig" angeben soll...
-
Ich kann mir nicht vorstellen, dass der Spaltenname "1.Wahl" möglich ist.
Sonderzeichen haben hier nichts zu suchen. Hast Du Dir die Tabelle
Schülerliste schon mal angesehen?tfa
-
ICh habs sie selber per phpAdmin angelegt...
-
Pille456 schrieb:
Das nächste Problem ist nun aber, dass die ID unbekannt ist bzw. ich gerade gar nicht weiss wie ich die denn nun "richtig" angeben soll...
Woher kommt denn die ID? Irgendwoher muss sie ja schließlich bekannt sein.
@Stichwort Namenskonventionen habe ich u.a. das hier gefunden:
http://homepage.mac.com/kelleherk/iblog/C711669388/E1751512668/index.html
-
du kannst eine spalte mit namen 1.xy anlegen. wen du sie aber nicht in einfachen hochkomas setzt dann wertet mysql die so aus:
1.xy
alias.spaltedu hast aber keine alias.
genauso verhält es sich bei tabellennamen.
1.xc
datenbank.tabelle
damit aknn amn z.b. eine verbindung zur db xx aufbauen und trotzdem auf db 1 tabelle xc zugreifen.
ist überigens bei MSSQL auch so.
Dort musst du aber Tabellennamen mit sonderzeichen in [] setzen.
-
So, nun geht alles - danke
Nochmal eine Frage zur ID:
Ich soll ja keine Strings zum raussuchen nehmen, soll ich dann eine spezielle Spalte für eine Zahl, die sich dann immer hochzählt anlegen und nach der Zahl dann immer suchen?