Was ist an dieser SQL-Syntax falsch?
-
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?