Andreas Nagel: Ich erhalte stets Unexpected T_Variable oder T_String zurück

Jo Hallo zusammen

Es ist so, dass ich über ajax an eine Seite verschiedene Variablen übergebe und mit dieser Datei dann die query ausführen will.

Und dann entschied ich mich irgendeinmal anstatt der Variablen in die SQL anweisung den Text so zu schreiben, da ich ja stets die Fehlermeldungen erhalte. Denn in der ajax Anweisung stet jetzt erst die Zeile success: function(data) {alert(data)} nicht mit alert eines Textes, sondern dem data. Doch erhalte ich ja stets die Fehlermeldung die sich auf diese Datei bezieht und als Zeilennummer die mit der sql Anweisung zurückgibt:

mysql_query("UPDATE 'Interessante Links' SET Sub = 1 WHERE ID = 7")

Doch was ist hieran bitte falsch?

Und so würde ich mich freuen wenn ich von Euch was hilfreiches lesen könnte um dann auch das ganze wieder auf Variablen als auf Text umstellen zu können, da ich ja zZ. total am verzweifeln bin. Und wofür ich mich bereits jetzt schon absolut bei Euch bedanken möchte.

Also Danke Gruß Andreas

  1. Tach,

    mysql_query("UPDATE 'Interessante Links' SET Sub = 1 WHERE ID = 7")
    

    Doch was ist hieran bitte falsch?

    ein Semikolon fehlt (in einer Zeile vor der angebenen Zeilennummer (die sind bei PHP nicht immer direkt vorhersagbar))?

    mfg
    Woodfighter

    1. Moin!

      mysql_query("UPDATE 'Interessante Links' SET Sub = 1 WHERE ID = 7")
      

      ein Semikolon fehlt (in einer Zeile vor der angebenen Zeilennummer (die sind bei PHP nicht immer direkt vorhersagbar))?

      Noch ein Hinweis am Rande an den Threadstarter:
      Die mysql-Erweiterung ist veraltet und wird ab PHP7 nicht mehr mitgeliefert. Du solltest also schon mal die Umstellung auf etwas Neueres einplanen, beispielsweise auf mysqli (das i steht für improved).

      Gruß
      Julius

      1. OK Hallo Julius

        und schon mal Danke, doch ist es ja so dass das alles noch sehr gut läuft. da ich so auch meine Datenbanken abfrage und so meine Seien erstellen lasse. Aber OK Vielen Dank für die Auskunft.

        Aber so wie ich es verstanden hatte auf einer anderen Seite, bräuchte, oder sollte man gar aufpassen nicht ein Semikolon mit diesem Befehl zu verwenden. Es ändert sich an der Message eh nix. Sie bleibt beim t_String Fehler.

        OK, aber Danke Gruß Andreas

        1. Hallo Andreas,

          und schon mal Danke, doch ist es ja so dass das alles noch sehr gut läuft. da ich so auch meine Datenbanken abfrage und so meine Seien erstellen lasse. Aber OK Vielen Dank für die Auskunft.

          Irgendwann musst du es aber umstellen, weil der Support für PHP5.6 (letzte Version mit der alten mysql-Erweiterung) bis Ende 2018 läuft. Bis dahin ist aber noch Zeit...

          Aber so wie ich es verstanden hatte auf einer anderen Seite, bräuchte, oder sollte man gar aufpassen nicht ein Semikolon mit diesem Befehl zu verwenden. Es ändert sich an der Message eh nix. Sie bleibt beim t_String Fehler.

          Vielleicht hast du irgendwo noch einen weiteren Fehler drin? Ich wüsste nicht, wo ein Semikolon in PHP nicht einen Befehl abschließen dürfte (= es muss vorhanden sein). Gut, wenn du innerhalb von HTML das echo abkürzt, brauchst du das Semikolon nicht unbedingt:

          <!doctype html>
          <html>
          <p><?=$var?></p>
          </html>
          

          Ende des kleinen Exkurses ;-)
          Zeig bitte ein wenig mehr Code. Wenn es das Semikolon allein nicht war, muss da noch etwas Anderes im Argen liegen.

          Gruß
          Julius

          1. Hallo

            Zeig bitte ein wenig mehr Code. Wenn es das Semikolon allein nicht war, muss da noch etwas Anderes im Argen liegen.

            Das tut es definitiv. Ser Fehler muss in den Zeilen vor dieser Anweisung oder direkt in dieser Zeile stecken. Die gezeigte Anweisung wird ja nicht das Einzige sein, was in dieser Ziele steht.

            Tschö, Auge

            --
            Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
            Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
            1. Jo OK ihr Beiden

              und alle Interessierte. Hier mein Code, wie das Ganze funktionieren soll. Und wenn auch das vielleicht ein wenig viel ist:

              	Daten[0] = ID
              	Daten[1] = DBName
              	Daten[2] = Table
              	$.ajax({
              	tpye: "POST",
              	url: "SaveView.php",
              //	data: "ID=" + ID + "&DB=" + Daten[1] + "&Table=" + Daten[2] + "&View=" + Daten[3],
              	data: { ID: Daten[0], DB: Daten[1], Table: Daten[2], View: Daten[3] },
              	contentType: "application/json; charset=utf-8",
              	success: function(data) {alert(data)}
              	});
              
              $ID = $_REQUEST[ID];
              $Table = UTF8_decode($_REQUEST['Table']);
              $DB = UTF8_decode($_REQUEST['DB']);
              $View = $_REQUEST[View];
              
              $verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or 
                  die("Error: <br>".mysql_error()); 
              mysql_select_db($DB, $verbindung)
              // Anfrage an DB-Server
              mysql_query("UPDATE $Table SET Sub = 1 WHERE ID = 7");
              

              Dieser ist aus Verzweiflung entstanden und soll mit den Variablen funktionieren. Nur erhalte ich stets die genannte Fehlermeldung passend auf die Zeile der sql Anweisung. Und so wollte ich mal das Ganze veröffentlichen und wenn auch das etwas viel Code ist, aber so dann Euch den Fehler zeigen kann.

              Und somit will ich mich bereits jetzt für jede Bemühungen bedanken, mit einer Vorfreue auf den Hinweis der das Ganze funktionsfähig machen wird.

              Also schonmal Danke mit Gruß Andreas

              1. Hallo

                $verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or 
                    die("Error: <br>".mysql_error()); 
                mysql_select_db($DB, $verbindung) /////// <=== Da isser schon, Semikolon vergessen
                // Anfrage an DB-Server
                mysql_query("UPDATE $Table SET Sub = 1 WHERE ID = 7");
                

                Semikolon vergessen. Wie üblich™ in der Zeile vorher.

                Tschö, Auge

                --
                Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
                Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
              2. Hallo,

                	Daten[0] = ID
                	Daten[1] = DBName
                	Daten[2] = Table
                	$.ajax({
                	tpye: "POST",
                	url: "SaveView.php",
                //	data: "ID=" + ID + "&DB=" + Daten[1] + "&Table=" + Daten[2] + "&View=" + Daten[3],
                	data: { ID: Daten[0], DB: Daten[1], Table: Daten[2], View: Daten[3] },
                	contentType: "application/json; charset=utf-8",
                	success: function(data) {alert(data)}
                	});
                

                was ist denn das für'n Code? Javascript? Auch in JS ist es dringend empfehlenswert, Statements mit einem Semikolon abzuschließen, auch wenn man es in einigen Fällen weglassen darf.
                Abgesehen davon ist da bestimmt ein Tippfehler drin. Wer ihn findet, darf sich was wünschen. ;-)

                $ID = $_REQUEST[ID];
                $Table = UTF8_decode($_REQUEST['Table']);
                $DB = UTF8_decode($_REQUEST['DB']);
                $View = $_REQUEST[View];
                

                Nicht unbedingt eine gute Idee, Eingabedaten aus $_REQUEST zu lesen. Ich würde besser direkt auf $_GET oder $_POST zugreifen, je nachdem, was wirklich verwendet wird. Außerdem fehlen teilweise die Quotes um die Array-Keys. Da hagelt es doch Notices!

                $verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or 
                    die("Error: <br>".mysql_error()); 
                mysql_select_db($DB, $verbindung)
                // Anfrage an DB-Server
                mysql_query("UPDATE $Table SET Sub = 1 WHERE ID = 7");
                

                Und siehe da, genau was wir schon vermutet hatten: Ein fehlendes Semikolon in der Anweisung vor der beanstandeten. Das hättest du aber auch selbst feststellen können, vor allem, nachdem woodfighter und Auge dich quasi schon mit der Nase drauf gestoßen haben.

                So long,
                 Martin

              3. Hallo Andreas,

                 	Daten[0] = ID
                 	Daten[1] = DBName
                 	Daten[2] = Table
                
                 	data: { ID: Daten[0], DB: Daten[1], Table: Daten[2], View: Daten[3] },
                

                wo wird Daten[3] ein Wert zugewiesen?

                Gruß
                Jürgen

              4. Tach,

                $ID = $_REQUEST[ID];
                $Table = UTF8_decode($_REQUEST['Table']);
                $DB = UTF8_decode($_REQUEST['DB']);
                $View = $_REQUEST[View];
                
                $verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or 
                    die("Error: <br>".mysql_error()); 
                mysql_select_db($DB, $verbindung)
                // Anfrage an DB-Server
                mysql_query("UPDATE $Table SET Sub = 1 WHERE ID = 7");
                

                ok, das fehlende Semikolon ist ja dann inzwischen gefunden, aber du hast noch ein weiteres großes Sicherheitsproblem namens SQL-Injection; so wie das im Moment aussieht kann ein Angreifer belibige Daten in beliebige Tabellen schreiben (auf die der User mit dem Namen root Zugriff hat), indem er passende Requests an den Server schickt. In diesem Falle hast du erstens vergessen den Kontextwechsel zu beachten, aber zweitens ist ansonsten auch das Konzept so gewählt, dass das geht (sofern du nicht weitere Überprüfungen der Daten beim Posten weggelassen hast). Allgemein solltest du auch nicht mit dem User root (von dem ich annehme, dass er Superuser-Rechte auf der Datenbank hat) auf die Datenbank zugreifen, solange du es nicht aus administrativben Gründen tust, die genau diese Rechte benötigen (Principle of least privilege).

                mfg
                Woodfighter

                1. OK Hallo zusammen

                  und auf jeden Fall vielen Dank. da die Message ja nicht mehr zu sehen ist. Nun wenn wir aber schon so weit in meinem Code sind, wäre es auch eine tolle Sache das Ganze jetzt auch zum Laufen bringen zu können!

                  Und dafür sieht es jetzt so aus, dass alles wieder in einer Variablen steht, wozu ja das Array benutzt wird. Und das beginnt jetzt bei Daten[0] = 0, was so auch übergeben werden sollte. Und da hätte ich auch eine Frage, denn jetzt wird mir ja die Fehlermeldung, sondern eine leere Messagebox zurückgegeben. Es sei denn ich gebe doctype oder eine meta an, da dann dieser Code zurückgegeben wird. Und so würde ich gerne wissen, ob es denn auch möglich wäre, den Inhalt der übergebenen Variablen sehen zu können? Und bleibt da eine Zahl auch eine Zahl um ein Zahlenfeld abfragen zu können? Aber es wäre schön mal die Inhalte sehen zu können.

                  Das Semikolon war eine tolle Sache! Aber wie gesagt würde ich mich jetzt sehr freuen wenn es zum absoluten Ziel kommen würde! Und so will ich mich für jede Bemühungen bereits jetzt bei Euch bedanken. Und sorry zum Sicherheitsproblem, da ich das keinesfalls habe. Aber auch hier kann ich mich nur absolut bei Dir bedanken! Und ich werde auf jeden Fall einmal daran Denken.

                  Also dann mein Danke und mit Gruß Andreas

                  1. Tach,

                    Und da hätte ich auch eine Frage, denn jetzt wird mir ja die Fehlermeldung, sondern eine leere Messagebox zurückgegeben. Es sei denn ich gebe doctype oder eine meta an, da dann dieser Code zurückgegeben wird. Und so würde ich gerne wissen, ob es denn auch möglich wäre, den Inhalt der übergebenen Variablen sehen zu können? Und bleibt da eine Zahl auch eine Zahl um ein Zahlenfeld abfragen zu können? Aber es wäre schön mal die Inhalte sehen zu können.

                    ich kann leider nicht nachvollziehen, was du überhaupt genau tust, geschweige denn, wo der Fehler liegt, da du das leider nicht ausführlich genug beschrieben und keinen weiteren Quelltext gezeigt hast.

                    mfg
                    Woodfighter

                  2. Hallo

                    Und dafür sieht es jetzt so aus, dass alles wieder in einer Variablen steht, wozu ja das Array benutzt wird. Und das beginnt jetzt bei Daten[0] = 0, was so auch übergeben werden sollte. Und da hätte ich auch eine Frage, denn jetzt wird mir ja die Fehlermeldung, sondern eine leere Messagebox zurückgegeben. Es sei denn ich gebe doctype oder eine meta an, da dann dieser Code zurückgegeben wird. Und so würde ich gerne wissen, ob es denn auch möglich wäre, den Inhalt der übergebenen Variablen sehen zu können? Und bleibt da eine Zahl auch eine Zahl um ein Zahlenfeld abfragen zu können? Aber es wäre schön mal die Inhalte sehen zu können.

                    Schön wäre so einiges. Da wir deinen Code nicht kennen, können wir zur Ursache deines Problems aber nichts sagen. Und nein, der Schnipsel, der zur Auffindung des ursprünglich besprochenen Fehlers führte, reicht bei Weitem nicht aus.

                    Und sorry zum Sicherheitsproblem, da ich das keinesfalls habe.

                    Das weißt du woher?

                    Tschö, Auge

                    --
                    Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
                    Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
                    1. Hallo zusammen

                      und es tut mir leid das mit der Serververbindung so lesen zu müssen. Doch läuft die Seite nur lokal, da sie viel zu viel Daten von mir gespeichert hat. Aber trotzdem danke, ich werde mir mal ein User und Passwort überlegen.

                      Aber zZ lautet der Code so:

                      $verbindung=mysql_connect($server, "root", "") or
                          die("Error: <br>".mysql_error()); 
                      mysql_select_db('$DB', $verbindung);
                      // Anfrage an DB-Server
                      mysql_query("UPDATE '$Table' SET Sub = $View WHERE ID = $ID");
                      

                      und ich frage mich wieso die sql Anweisung nie zum Ergebnis führt, oder das vielleicht da sie erst garnicht ausgeführt wird. Denn man kann sich ja mit ECHO die Variablen zurückgeben lassen und dann lautet die sql Anweisung mit den $Table SET und WHERE Inhalten genau so wie sie lauten soll.

                      Danke Gruß Andreas

                      1. Hi,

                        und es tut mir leid das mit der Serververbindung so lesen zu müssen.

                        das soll dir nicht leid tun - du sollst daraus etwas lernen. Und zwar in diesem Fall, wie man Daten korrekt an mySQL übergibt (Kontextwechsel), und dass man Daten, die von außen kommen (z.B. GET- oder POST-Parameter) niemals ungeprüft und/oder unmaskiert durchreichen darf.

                        Doch läuft die Seite nur lokal, da sie viel zu viel Daten von mir gespeichert hat. Aber trotzdem danke, ich werde mir mal ein User und Passwort überlegen.

                        Es geht nicht um User und Passwort, sondern um den Umgang mit den zu verarbeitenden Daten!

                        mysql_select_db('$DB', $verbindung);
                        // Anfrage an DB-Server
                        mysql_query("UPDATE '$Table' SET Sub = $View WHERE ID = $ID");
                        

                        Heißt die Datenbank, die du auswählen willst, wirklich $DB? Wäre zumindest ein eigenartiger Name.

                        und ich frage mich wieso die sql Anweisung nie zum Ergebnis führt

                        Was liefert denn mysql_select_db() als Ergebnis? Womöglich FALSE, weil die gewünschte DB eben doch nicht $DB heißt?

                        So long,
                         Martin

                        1. Tach,

                          Doch läuft die Seite nur lokal, da sie viel zu viel Daten von mir gespeichert hat. Aber trotzdem danke, ich werde mir mal ein User und Passwort überlegen.

                          Es geht nicht um User und Passwort, sondern um den Umgang mit den zu verarbeitenden Daten!

                          ich vermute mal das bezog sich auf meine Aussage zum root-User in https://forum.selfhtml.org/self/2016/mar/8/ich-erhalte-stets-unexpected-t-variable-oder-t-string-zurueck/1662756#m1662756, Andreas scheint baum-strukturierte Foren nicht gewöhnt zu sein und antwortet deswegen an etwas unerwarteten Stellen.

                          mfg
                          Woodfighter

                      2. Hallo

                        und ich frage mich wieso die sql Anweisung nie zum Ergebnis führt, vielleicht ja erst garnicht ausgeführt wird. Denn man kann sich ja die Variablen zurückgeben lassen und dann lautet die sql Anweisung mit den $Table SET und WHERE Inhalten genau so wie sie lauten soll.

                        Dann lass dir zuallererst etwaige SQL-Fehler ausgeben, damit dir überhaupt etwas zur Verfügung steht.

                        // Anfrage an DB-Server
                        mysql_query("UPDATE '$Table' SET Sub = $View WHERE ID = $ID") or die("Fehlernummer: " . mysql_errno() . "<br>Fehlermeldung: " . mysql_error());
                        

                        Bitte zu beachten: Das ist keine Fehlerbehandlung für ein Produktivsystem! Während der Entwicklung ist das auf diesem Wege hinnehmbar, um die Fehlernummern und Meldungen zu sehen. Mit denen kannst du dann die Suchmaschine deiner Wahl füttern.

                        Tschö, Auge

                        --
                        Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
                        Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
                        1. OK Hallo

                          und sorry das ich die Variable $DB in Anführungszeichen gesetzt hatte. Der Datenbankname kann halt auch mit einem Leerzeichen ausgestattet sein. Aber ich schreibe die mysql_select_db und mysql_connect Befehle so zur Abfrage und damit zum erstellen meiner Seiten, so dass ich die Zeilen dann nur einfach kopieren musste. Doch erhalte ich jetzt folgende Message:

                          <b>Warning</b>: mysql_select_db() expects parameter 2 to be resource, null given in....Zeile 14

                          Also wie passt das denn bitte wenn das Abfragen einwandfrei funktioniert?

                          Danke Gruß Andreas

                          1. Tach,

                            und sorry das ich die Variable $DB in Anführungszeichen gesetzt hatte. Der Datenbankname kann halt auch mit einem Leerzeichen ausgestattet sein.

                            dann musst die Anführungszeichen auch so notieren, dass sie noch im SQL-Statement ankommen.

                            Aber ich schreibe die mysql_select_db und mysql_connect Befehle so zur Abfrage und damit zum erstellen meiner Seiten, so dass ich die Zeilen dann nur einfach kopieren musste.

                            Wenn du Code per copy & paste vervielfältigst, deutet es stark darauf hin, dass eigentlich eine Funktion angebracht wäre.

                            Doch erhalte ich jetzt folgende Message:

                            <b>Warning</b>: mysql_select_db() expects parameter 2 to be resource, null given in....Zeile 14

                            Also wie passt das denn bitte wenn das Abfragen einwandfrei funktioniert?

                            Die Abfrage wird gar nicht erst ausgeführt, also tritt schon ein Fehler beim Aufbau der Verbindung auf, da du ja jetzt weißt, wie man sich die mysql-Fehler anzeigen lässt, tu das doch auch mal für den Verbindungsaufbau.

                            mfg
                            Woodfighter

                            1. Jo Guten Morgen Woodfighter

                              der gesamte Inhalt der erstellten Seiten wird unproblematisch angezeigt und ich erhalte immer nur diese Fehlermeldung, bezogen auf die mysql_select_db Funktion. Und der Name der Datenbank ist auch sets der Richtige.

                              Vielenn Dank der Nachfrage

                              Gruß Andreas

                              1. Oh Ja Hallo zusammen

                                ein Update:

                                Denn ich erhalte jetzt wenn ich die mysql_connect Funktion abfrage Resource id #2 zurück und wenn ich mysql_select_db abfrage erhalte ich nur eine 1 zurück.

                                OK Danke Gruß Andreas

                      3. Hi,

                        mysql_select_db('$DB', $verbindung);

                        hier sind vermutlich die '' falsch. $DB ist ja vermutlich eine Variable, die den Namen der DB enthält. In '' wird die Variable aber NICHT durch den Inhalt ersetzt (wie es bei "" der Fall wäre).

                        mysql_query("UPDATE '$Table' SET Sub = $View WHERE ID = $ID");

                        Müßten hier nicht backticks ` statt ' um den Tabellennamen gesetzt werden?

                        cu,
                        Andreas a/k/a MudGuard