Onkel Hans: Anführungszeichen in Queries

Guten Tag!

Wieso liefert mir die Verwendung des Queries

$suche="SELECT '007_vorname' FROM '007_test'";

die Fehlermeldungen

Notice: Trying to get property of non-object in ...
Fatal error: Call to a member function close() on a non-object in ...

während das Query

$suche='SELECT007_vornameFROM007_test';

problemlos funktionuert? Mir ist schon klar, die beiden Fälle unterscheiden sich durch die Anführungszeichen, ich würd nur gerne wissen, wieso ich erstere Version nicht verwenden darf.

Ich dachte nämlich, es sei egal, welche Art von Anführungszeciehn ich verwende, solange die Begrenzer des gesamten Queries andere Anführungszeichen sind als die innerhalb der Zusammenstellung.

MfG

Onkel Hans

  1. echo $begrüßung;

    Wieso liefert mir die Verwendung des Queries
    $suche="SELECT '007_vorname' FROM '007_test'";
    die Fehlermeldungen
    Notice: Trying to get property of non-object in ...
    Fatal error: Call to a member function close() on a non-object in ...

    Diese Meldungen sind nicht direkt auf die Query bezogen, sondern sind Folgefehler von PHP, weil du nicht überprüft hast, was dir die Query-Funktion zurückgibt und stattdessen mögliche Fehler ignorierend einfach im Programm weitermachst.

    $suche='SELECT007_vornameFROM007_test';
    problemlos funktionuert? Mir ist schon klar, die beiden Fälle unterscheiden sich durch die Anführungszeichen, ich würd nur gerne wissen, wieso ich erstere Version nicht verwenden darf.

    Weil die Anführungszeichen unterschiedliche Bedeutung haben. ' und " markieren Strings, mit ` markiert man Bezeichner. Und von einem String kann man keine Datensätze abfragen, von einer Tabellen hingegen schon.

    echo "$verabschiedung $name";

    1. Hallo!

      Diese Meldungen sind nicht direkt auf die Query bezogen, sondern sind Folgefehler von PHP

      Naja, der Rest des Codes bleibt ja gleich und sobald ich das Query so wie als 2. Beispiel angegeben schreibe, kommt ja KEINE Fehlermeldung mehr!

      weil du nicht überprüft hast, was dir die Query-Funktion zurückgibt und stattdessen mögliche Fehler ignorierend einfach im Programm weitermachst.

      Und das müßte ich wie machen?

      Onkel Hans

      1. echo $begrüßung;

        » Diese Meldungen sind nicht direkt auf die Query bezogen, sondern sind Folgefehler von PHP
        Naja, der Rest des Codes bleibt ja gleich und sobald ich das Query so wie als 2. Beispiel angegeben schreibe, kommt ja KEINE Fehlermeldung mehr!

        Die nachfolgenden Funktionen haben dann auch keinen Grund mehr, sich zu beschweren. Wenn das Statement ohne Fehlermeldung durchgelaufen ist, bekommst du die vorgesehene Variable/Objekt/wasauchimmer, nur eben nicht im Fehlerfall.

        » weil du nicht überprüft hast, was dir die Query-Funktion zurückgibt und stattdessen mögliche Fehler ignorierend einfach im Programm weitermachst.
        Und das müßte ich wie machen?

        Du müsstest dich in der Dokumentation informieren, wie die von dir verwendeten Funktionen im Gut- und im Fehlerfall arbeiten (z.B. Rückgabewert), dieses Verhalten prüfen und entsprechend reagieren (if).

        echo "$verabschiedung $name";

        1. Hallo!

          Ich hätt deinen Vorschlag wirklich gerne befolgt und mich damit beschäftigt. Leider ist

          Du müsstest dich in der Dokumentation informieren, wie die von dir verwendeten Funktionen im Gut- und im Fehlerfall arbeiten (z.B. Rückgabewert), dieses Verhalten prüfen und entsprechend reagieren (if).

          keine Antwort gewesen, die mir auch nur irgendwie weitergeholfen hat.

          Onkel Hans

          1. Ich hätt deinen Vorschlag wirklich gerne befolgt und mich damit beschäftigt. Leider ist

            Du müsstest dich in der Dokumentation informieren, wie die von dir verwendeten Funktionen im Gut- und im Fehlerfall arbeiten (z.B. Rückgabewert), dieses Verhalten prüfen und entsprechend reagieren (if).

            keine Antwort gewesen, die mir auch nur irgendwie weitergeholfen hat.

            Doch, die sollte dich weiterbringen. Ich habe in diesem Thread nicht einmal eine definitive Aussage von dir gefunden, welche Datenbank überhaupt verwendet wird, ich gehe mal von dem häufigen Fall http://www.mysql.com/@title=MySQL aus, auch, da du Kalle_B nicht widersprochen hast.

            In der PHP-Dokumentation findest du dazu zwei Abschnitte, einmal MySQL und einmal MySQL Improved Extension (MySQLi), einer davon wird es sein. Du schaust im richtigen Abschnitt nach, da du Queries absetzen kannst, weißt du ja auch, nach welcher Funktion du schauen musst und guckst dir an, ob Fehler über Rückgabewerte oder Exceptions realisiert sind und wie du darauf kommst, welcher Fehler tatsächlich aufgetreten ist.

            Das sind absolute Basics – wenn man nicht weiß, wie etwas geht, in der Dokumentation nachlesen. Achso, falls es wirklich MySQL ist, beispielhaft könntest du in der MySQL-5.0-Dokumentation (genaue Version müsstest du dann natürlich selbst wissen) finden, dass Strings mit ' oder ", aber Identifiers mit ` gequotet werden.

            --
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
            1. Hallo Timo,

              Doch, die sollte dich weiterbringen. Ich habe in diesem Thread nicht einmal eine definitive Aussage von dir gefunden, welche Datenbank überhaupt verwendet wird, ich gehe mal von dem häufigen Fall http://www.mysql.com/@title=MySQL aus, auch, da du Kalle_B nicht widersprochen hast.

              ich vermute das eher wegen der Backticks, mit denen er seine Identifier erfolgreich quoten konnte. Die sind ziemlich MySQL-spezifisch.

              Achso, falls es wirklich MySQL ist, beispielhaft könntest du in der MySQL-5.0-Dokumentation (genaue Version müsstest du dann natürlich selbst wissen) finden, dass Strings mit ' oder ", aber Identifiers mit ` gequotet werden.

              oder Strings mit ' und Identifiers mit ", wenn ANSI-Quotes eingeschaltet sind, wie ich in diesem Thread bereits erwähnte (siehe auch letzten Handbuchabschnitt, den Du verlinkt hast). Es gibt genügend SQL-Dialekte, die es *nicht* zulassen, Zeichenketten in doppelte Anführunszeichen einzuschließen. Hingegen erlauben alle mir bekannten SQL-Dialekte, Zeichenketten in einfache Anführungszeichen einzuschließen. Daher ist es eine gute Idee, Zeichenketten in SQL-Anweisungen *immer* in einfache Anführunszeichen zu packen.

              Freundliche Grüße

              Vinzenz

            2. echo $begrüßung;

              In der PHP-Dokumentation findest du dazu zwei Abschnitte, einmal MySQL und einmal MySQL Improved Extension (MySQLi), einer davon wird es sein.

              Die Fehlermeldungen im OP sprachen von "property of non-object" und "memberfunction ... on a non-object". Es kommt dann also wegen der Objektorientiertheit von den beiden nur mysqli in Frage. Zusätzlich steht dann auch noch PDO und jede beliebige andere objektorientierte Datenbankabstraktion zur Debatte. Welche von denen nun konkret die angeführte Meldung bringt, lässt sich durch Tests herausfinden. Deutlich einfacher und konkreter wäre die Hilfeleistung möglich, wenn Onkel Hans nachvollziehbarer beschriebe.

              echo "$verabschiedung $name";

  2. Taxch auch,

    du titulierst deine Anfrage mit "Datenbank", bringst aber ein PHP- Problem.

    $suche="SELECT '007_vorname' FROM '007_test'";

    Mit den doppelten Gänsefüssen wird der Inhalt bei PHP interpretiert. So etwas wie "\n" wird zum Zeilenumbruch. Offenbar sind Zeichen im String, mit denen PHP nichts anzufangen weiss.

    $suche='SELECT007_vornameFROM007_test';

    String in Gänsefüssen mit nur einem Zeh wird nicht interpretiert.

    Kalle

    1. du titulierst deine Anfrage mit "Datenbank", bringst aber ein PHP- Problem.

      Und du hast offenbar meine Frage nicht verstanden. In dem ich von Queries spreche und ein $suche='SELECT007_vornameFROM007_test'; als Beispielcode schreibe, ist wohl klar, dass es um die Abfrage einer Datenbank geht.

      Onkel Hans

      1. »» du titulierst deine Anfrage mit "Datenbank", bringst aber ein PHP- Problem.

        Und du hast offenbar meine Frage nicht verstanden. In dem ich von Queries spreche und ein $suche='SELECT007_vornameFROM007_test'; als Beispielcode schreibe, ist wohl klar, dass es um die Abfrage einer Datenbank geht.

        Ich habe nicht verstanden, wer den Fehler meldet. Die Datenbank also.

        Wenn du ihr einen von PHP interpretierten, also unbekannten String schickst, musst du mal schauen, wie der bei der Datenbank ankommt.

        Lass dir den Inhalt von $suche mal anzeigen mit var_dump

        Kalle

        1. Hallo!

          Wenn du ihr einen von PHP interpretierten, also unbekannten String schickst, musst du mal schauen, wie der bei der Datenbank ankommt.
          Lass dir den Inhalt von $suche mal anzeigen mit var_dump

          das hat ja nichs mit der Fehlermelödung zu tun, in beiden Fällen wird mit var_dump natürlich ausgegeben, dass es sich um einen String handelt...

          Onkel Hans

          1. Hallo!

            das hat ja nichs mit der Fehlermelödung zu tun, in beiden Fällen wird mit var_dump natürlich ausgegeben, dass es sich um einen String handelt...

            MySQL mag keine Tabellennamen, die mit ' eingeschlossen sind. Achte jetzt genau auf die Art der Gänsefüsse.

            Test 1 in phpmyadmin:
            SELECT 'kurzname' FROMtm_adressen

            • kein Fehler, aber es wird immer das Wort kurzname ausgegeben anstatt dem Inhalt dieses Feldes. -

            Test 2 in phpmyadmin:
            SELECTkurznameFROMtm_adressen``

            • kein Fehler, die Inhalte von kurzname werden angezeigt -

            Test 3 in phpmyadmin:
            SELECTkurznameFROM 'tm_adressen'

            • Fehlermeldung: -
              MySQL meldet:
              #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 ''tm_adressen'
              LIMIT 0, 30' at line 1

            Es ist also nicht die Frage, ob du den Suchstring mit " oder ' begrenzt, sondern du hast uns unterschiedliche Inhalte untergeschoben.

            Es hat etwas gedauert, aber dein Aufmerksamkeitstest wurde bestanden.

            Kalle

            1. Hallo!

              Danke für die Antwort!

              Test 2 in phpmyadmin:
              SELECTkurznameFROMtm_adressen``

              • kein Fehler, die Inhalte von kurzname werden angezeigt -

              Blöde Frage: Wo bitte auf der Tastatur finde ich das  `  ???

              LG

              Onkel Hans

              1. Hallo,

                » SELECTkurznameFROMtm_adressen``
                » - kein Fehler, die Inhalte von kurzname werden angezeigt -

                Blöde Frage: Wo bitte auf der Tastatur finde ich das  `  ???

                a) findest Du den Backtick auf einer typischen deutschen (QWERTZ) Tastatur
                   links neben dem Backspace und rechts vom ß.
                   Als Akzentzeichen fällt es auf typischen deutschen Tastaturen unter die
                   "dead keys", d.h. Du drückst zuerst SHIFT+`, anschließend die Leertaste.
                b) kann man den Backtick über die Zwischenablage kopieren,

                und

                c) kurzname und tm_adressen haben keine Sonderbehandlung nötig.

                Freundliche Grüße

                Vinzenz

      2. Hi Onkel Hans,

        Und du hast offenbar meine Frage nicht verstanden. In dem ich von Queries spreche und ein $suche='SELECT007_vornameFROM007_test'; als Beispielcode schreibe, ist wohl klar, dass es um die Abfrage einer Datenbank geht.

        Wenn das klar gewesen ist, ist aber umso unklarer, warum Du

        [...] solange die Begrenzer des gesamten Queries andere Anführungszeichen sind als die innerhalb der Zusammenstellung.

        geschrieben hast. Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer. Das Query (der Prozess) ohnehin nicht, aber auch ein Statement in SQL hat diese nicht.

        viele Gruesse,
        der Bademeister

        1. Hello,

          Wenn das klar gewesen ist, ist aber umso unklarer, warum Du

          [...] solange die Begrenzer des gesamten Queries andere Anführungszeichen sind als die innerhalb der Zusammenstellung.

          geschrieben hast. Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer.

          Doch, für Stringwerte und Datumswerte werden meistens Anführungszeichen als Begrenzer benutzt :-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi Tom,

            »» geschrieben hast. Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer.

            Doch, für Stringwerte und Datumswerte werden meistens Anführungszeichen als Begrenzer benutzt :-P

            richtig, wie dumm von mir. Also:
            "Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer seiner selbst."

            Besser? ;-)

            Bleibt nur weiterhin das Problem, dass wir gar nicht von Queries reden, sondern von Statements.

            viele Gruesse,
            der Bademeister

            1. Hello,

              "Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer seiner selbst."

              Besser? ;-)

              ... und bei MySQL auch keine Anführungszeichen für seine Bezeichner und/oder seine Sonderwerte FALSE und NULL.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hallo,

                ... und bei MySQL auch keine Anführungszeichen für seine Bezeichner

                Doppelte Anführungszeichen sind auch bei MySQL als Begrenzer für seine Bezeichner völlig legitim:

                [link:http://dev.mysql.com/doc/refman/5.1/en/identifiers.html@title=SET sql_mode='ANSI_QUOTES']

                Freundliche Grüße

                Vinzenz

                1. Hello,

                  ... und bei MySQL auch keine Anführungszeichen für seine Bezeichner

                  Doppelte Anführungszeichen sind auch bei MySQL als Begrenzer für seine Bezeichner völlig legitim:

                  [link:http://dev.mysql.com/doc/refman/5.1/en/identifiers.html@title=SET sql_mode='ANSI_QUOTES']

                  Ach ja, da war doch erst kürzlich 'was :-)

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
        2. Hallo!

          Wenn das klar gewesen ist, ist aber umso unklarer, warum Du
          »» [...] solange die Begrenzer des gesamten Queries andere Anführungszeichen sind als die innerhalb der Zusammenstellung.
          geschrieben hast. Ein Datenbank-Query hat keine Anfuehrungszeichen als Begrenzer. Das Query (der Prozess) ohnehin nicht, aber auch ein Statement in SQL hat diese nicht.

          Was du meinen?

          $suche='SELECT007_vornameFROM007_test';

          Da ist ja wohl eindeutig ein einfaches Anführungszeichen zu Beginn (nach dem istgleich) und am Ende (nach FROM 007\_test)

          Onkel Hans

          1. Hallo,

            Was du meinen?

            $suche='SELECT007_vornameFROM007_test';

            Da ist ja wohl eindeutig ein einfaches Anführungszeichen zu Beginn (nach dem istgleich) und am Ende (nach FROM 007\_test)

            das ist PHP-Kram, hat nur indirekt mit SQL zu tun.

            Wenn Du den Inhalt der Variablen $suche ausgibst, zum Beispiel mit

            echo $suche;

            werden Dir die Anführungszeichen nicht ausgegeben. Sie begrenzen nur für PHP die Zeichenkette, sie sind jedoch nicht Teil der Zeichenkette. Nach der Anweisung

            $test = "Test";

            enthält die Variable $test eine Zeichenkette, die vier Zeichen enthält, nicht etwa sechs Zeichen. Die Anweisung bewirkt übrigens das gleiche wie die Anweisung

            $test = 'Test';

            MySQL ist es daher völlig gleichgültig, in welche Anführungszeichen Du Deine Zeichenkette in PHP packst. MySQL ist es auch völlig gleichgültig, ob diese Anweisung über PHP, MySQL, C#, Python, Java oder sogar Perl überreicht wird. MySQL interessiert sich nur für den Inhalt der Zeichenkette, nicht die programmiersprachenspezifische Verpackung.

            Freundliche Grüße

            Vinzenz

      3. Mahlzeit Onkel Hans,

        »» du titulierst deine Anfrage mit "Datenbank", bringst aber ein PHP- Problem.

        Und du hast offenbar meine Frage nicht verstanden. In dem ich von Queries spreche und ein $suche='SELECT007_vornameFROM007_test'; als Beispielcode schreibe, ist wohl klar, dass es um die Abfrage einer Datenbank geht.

        Nein, ist es nicht. Einerseits ist das ein typischer Fall von Zitat 1353, andererseits sind die von Dir erwähnten Fehlermeldungen

        Notice: Trying to get property of non-object in ...
        Fatal error: Call to a member function close() on a non-object in ...

        eindeutig PHP-Fehlermeldungen - keine MySQL-Fehlermeldungen. Woher also sollen Deine Leser wissen, was in Deinem Code steht, was auf Deinem Bildschirm gezeigt wird und was in Deinem Kopf vorgeht, wenn Du Dein Problem ungenau beschreibst und verwirrende Informationen lieferst?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  3. Hallo,

    Wieso liefert mir die Verwendung des Queries
    $suche="SELECT '007_vorname' FROM '007_test'";

    das SQL-Statement

    SELECT '007_vorname' FROM '007_test'

    ist in allen mir bekannten SQL-Dialekten fehlerhaft, wie dedlfix bereits ausgeführt hat.

    $suche='SELECT007_vornameFROM007_test';

    SELECT007_vornameFROM007_test``

    ist hingegen im SQL-Dialekt von MySQL ein korrektes Statement. Bei Nichtexistenz der Tabelle 007_test oder Nichtexistenz der Spalte 007_vorname gibt es natürlich ebenfalls eine Fehlermeldung. Wie Bezeichner in MySQL behandelt werden können, steht im entsprechenden Handbuchkapitel (hier in der Version 5.1).

    Beispiele für erlaubte Schreibweisen findest Du übrigens in diesem Archivbeitrag.

    Nachdem Du PHP angewiesen hast, ein SQL-Statement an MySQL zu schicken, solltest Du als erstes überprüfen, ob MySQL dieses Statement erfolgreich ausführen konnte. Falls MySQL dieses Statement nicht erfolgreich ausführen konnte, kannst Du die zugehörige Fehlermeldung erfragen. Wie das genau geht, hängt von der von Dir verwendeten Datenbankerweiterung von PHP ab: mysql_*, mysqli oder PDO.

    Freundliche Grüße

    Vinzenz