Was ist an dieser SQL-Syntax falsch?
-
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?
-
Kurzum: Ja!
Dafür kannst du am einfachsten den Typ SERIAL nehmen (Synonym für BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY).
-
Okay, wird gemacht!
-
wenn du dann aber doch über den string raussuchen willst, solltest du die spalte mit der zeichenkette indexieren
-
Nurmal zur INFO für dich.
In einem RDBMS muss ein Datenmsatz immer eindeutig identifizierbar sein.2, Hallo, xy
2, Hallo, xygeht nicht auch wenn es auf den ersten Blick so aussieht.
Da kann man dann ein Autoinc einfügen
1,2,Hallo,xy
2,2,Hallo,xy
3,2,Hallo,xyHier würde aber auch wieder die Normalisierung zuschlagen.
Ein Autoinc braucht du theoretisch nicht wenn es sich z.b. um Personendaten hadelt.
Das es in einem Haushalt 2 Personen mit dem selben Geburtdatum und dem gleichen Namen gibt ist unwahrscheinlich. Deshlab dann den Primkey über diese Spalten.
Ausgeschlossen ist dies aber auch nicht und für Normalisierung aber besser dann auch eine ID
-
Es ist grundsätzlich nicht zu empfehlen, einen String als Indexspalte zu verwenden; MySQL kann solche Anfragen nur sehr viel umständlicher verwalten. In großen Systemen geht das drastisch auf die Ressourcen.
Der Volltextindex von Stringspalten ist eigentlich dafür gedacht, Volltextsuchen zu beschleunigen, sprich MATCH(...) AGAINST(...).
Außerdem gibt es bei String kein AUTO_INCREMENT und du musst eigene Routinen schreiben, um immer einen eindeutigen Wert handzuhaben. Wozu das alles?