MB: PHP PDO Bind Parameters Wo sinnvoll?

moin,

Fragen:

  1. wo sind gebundene Parameter in PDO im SQL Statement sinnvoll?
  2. ist es übehaupt möglich jegliche Parameter zu binden? z.B. SELECT ?, WHERE ? = ?, FROM ??

Zur Info:

  • PDO gibt bei manchen Parametern n Fehler aus 😕 und ich weis nicht ob an meiner Maschine liegt oder generell an meiner Tollpatschgkeit 😀.
  • Ich habe das Internet durch sucht und nix zu meiner Frage gefunden oder ich bin einfach nur blind 😕.

lgmb

akzeptierte Antworten

  1. Lieber MB,

    1. wo sind gebundene Parameter in PDO im SQL Statement sinnvoll?

    überall dort, wo Dateninhalte eingesetzt werden müssen.

    1. ist es übehaupt möglich jegliche Parameter zu binden? z.B. SELECT ?, WHERE ? = ?, FROM ??

    Du kannst folgendes damit tun: SELECT :foo. Ob das sinnvoll ist, steht auf einem anderen Blatt. Bei WHERE-Klauseln ist das bei mir ziemlich üblich: WHERE spalte=:foo. Das kann man auch umgedreht notieren: WHERE :foo=spalte. Manchmal benötige ich ein Flag und notiere dann: WHERE 1=:foo (in :foo steht bei mir dann entweder der Wert 1 oder 0).

    • PDO gibt bei manchen Parametern n Fehler aus 😕 und ich weis nicht ob an meiner Maschine liegt oder generell an meiner Tollpatschgkeit 😀.

    Ich habe den Verdacht, dass es an Deiner Unwilligkeit liegt, den Wortlaut der Fehlermeldung tatsächlich zu verarbeiten. Weder postest Du hier ein Sterbenswörtchen davon, noch nennst Du ungefähre Zusammenhänge, die in den "n Fehlermeldungen" angesprochen werden.

    • Ich habe das Internet durch sucht und nix zu meiner Frage gefunden oder ich bin einfach nur blind 😕.

    Nein, Du bist einfach nur unverbesserlich.

    Liebe Grüße

    Felix Riesterer

    1. moin,

      1. wo sind gebundene Parameter in PDO im SQL Statement sinnvoll?

      überall dort, wo Dateninhalte eingesetzt werden müssen.

      1. ist es übehaupt möglich jegliche Parameter zu binden? z.B. SELECT ?, WHERE ? = ?, FROM ??

      Du kannst folgendes damit tun: […]

      Herzlichen Dank für die Info

      • PDO gibt bei manchen Parametern n Fehler aus 😕 und ich weis nicht ob an meiner Maschine liegt oder generell an meiner Tollpatschgkeit 😀.

      Ich habe den Verdacht, […]

      Das kann ich sehr gut Nachvallziehen. Ist ja auch vollkommen in Ordnung, wenn man eine Einschätzung ungefragt an den Einzuschätzten kommentiert.

      • Ich habe das Internet durch sucht und nix zu meiner Frage gefunden oder ich bin einfach nur blind 😕.

      Nein, Du bist einfach nur unverbesserlich.

      …das wiederum ist NICHT ok. Wenn eine Annahme zur Behauptung wird. Bitte unterlasse es.

      Zur Klärung: Ich finde z.B. in einer Analogie die Butter im Kühlschrank nicht, obwohl sie mitten vor meiner Nase steht und andere finden Sie aufanhieb. So ist es auch z.B. im Internet. Hinzukommt noch 1. die verminderte Belasstung, 2. Sprachstörung (nicht sprechstörung). Man kann es ganz einfach als Faulheit abstempeln, wenn man die Person nur marginal kennt. Ich bin jedoch nicht mehr neu hier und du solltest die Attribute die ich einfordere allmählig kennen oder auf meinen Fragen schließen: Belastungsstörung, Sprachbehinderung.

      lgmb

      1. Lieber MB,

        Zur Klärung: Ich finde z.B. in einer Analogie die Butter im Kühlschrank nicht, obwohl sie mitten vor meiner Nase steht und andere finden Sie aufanhieb.

        ein jeder Mensch hat nun mal eben so seine Marotten. Das ist nichts verwerfliches. Und viele Marotten kann man nicht wirklich abstellen. In diesem Sinne sind Menschen dann eben unverbesserlich.

        Man kann es ganz einfach als Faulheit abstempeln, wenn man die Person nur marginal kennt. Ich bin jedoch nicht mehr neu hier und du solltest die Attribute die ich einfordere allmählig kennen oder auf meinen Fragen schließen: Belastungsstörung, Sprachbehinderung.

        Das sehe ich als Deine Marotte an, mit der ich übrigens sehr gut leben kann. Warum sollst Du hier nicht so sein dürfen, wie Du eben nun mal bist? Daher nehme ich mir auch die Zeit, Deine Fragen inhaltlich zu beantworten. Sprachstörung hin oder her, sie wird Dich vermutlich eine Menge mehr Zeit als unsereiner kosten, wenn Du hier etwas posten willst. Aber copy&paste von Fehlermeldungen darf man dann trotzdem erwarten, wenn man Dir auf eine konkrete Frage hin konkret helfen soll. Findest Du nicht?

        Liebe Grüße

        Felix Riesterer

        1. moin,

          Lieber MB,

          Zur Klärung: Ich finde z.B. in einer Analogie die Butter im Kühlschrank nicht, obwohl sie mitten vor meiner Nase steht und andere finden Sie aufanhieb.

          ein jeder Mensch hat nun mal eben so seine Marotten. […]

          Bin mit Dir vollig einer Meinung

          Man kann es ganz einfach als Faulheit abstempeln, wenn man die Person nur marginal kennt. Ich bin jedoch nicht mehr neu hier und du solltest die Attribute die ich einfordere allmählig kennen oder auf meinen Fragen schließen: Belastungsstörung, Sprachbehinderung.

          Das sehe ich als Deine Marotte an, mit der ich übrigens sehr gut leben kann […].

          Und ich bin Dir und euch ausgesprochen Dankbar, das ihr euch die Zeit nimmt um meine teilweise orakelhaften Fragen - je nach meiner Belastung - beantwortet. Das schätze ich extrem!!!

          Aber copy&paste von Fehlermeldungen darf man dann trotzdem erwarten, wenn man Dir auf eine konkrete Frage hin konkret helfen soll. Findest Du nicht?

          Ok dann habe ich dich, wie so häufig, Falsch verstanden. Entschuldige vielmals. Ja dass hätte ich tun können. Aber die Frage ist von Dir beantwortet worden.

          Bitte versteh aber auch, dass, wenn ich den möglichen Fehler raus gekramt hätte (SQL Doku im Internet finden (engl.)was beides mir schwer fällt, die passende Textpassage des möglichen Fehlers rauskopieren),...

          • würde es wesentlich mehr Zeit in Anspruch nehmen (Internetsuchchaos, Englisch)
          • und würde es, im Zuge dessen, automatisch meine Belastung in sprachlicher hinsicht vermindern
          • und ich noch mehr orakel Fragen stellen.

          daher habe ich unter Zeitdruck abgewogen, was für euch effektiver ist. Entwerder den möglichen Fehler dingfest zu machen und reskieren das ich miserabel Artikulieren werde, oder den möglichen Fehler allgemeiner zu fassen mit changse mich besser artikulieren zu können. Ich hoffe dir ist mein Dilämer besser verständlicher.

          Ich hätte vermutlich noch Hintergrund Informationen des Fehlers in der Eingangsfrage angeben sollen sodass dieser Kommentarzweig nicht aufkommen kann. Hinterher ist man immer klüger.

          lgmb

          1. Hallo,

            Ich hätte vermutlich noch Hintergrund Informationen des Fehlers in der Eingangsfrage angeben sollen sodass dieser Kommentarzweig nicht aufkommen kann. Hinterher ist man immer klüger.

            dann hat es ja immerhin etwas gebracht. Aber was Felix eigentlich meinte[1]: Du hättest einfach den Wortlaut der Fehlermeldung kopieren und hier einfügen können. Dann wäre bestimmt jemand aufgestanden, der dir erklären kann, was die Fehlermeldung bedeutet.

            Schönes Wochenende,
             Martin

            --
            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

            1. So habe ich ihn jedenfalls verstanden. ↩︎

            1. moin,

              […]. Aber was Felix eigentlich meinte[^1]: […]

              Das habe ich auch so verstanden.

              Mir war nur nicht klar, ob ihr es verstanden habt, das mir ein SQL Fehler angezeigt wurde und ich ihn dann nicht mit dem dazugehörigen SQL Befehl, welcher ja den Feher induziert, rauskopiert habe. Und ich, in der damaligen Situation, es nicht für Sinnvoll erachtet habe, da andere Bedingugen vorherrschten.

              Dies habe ich leider auch nicht ewähnt, weil es mir schwer viel, diesen Sachverhalt zu artikulieren, was jetzt gottseidank nicht mehr der Fall ist.

              Wie gesagt, es ist echt Situationsabhängig, wie gut ich mich Ausdrücke 😕. Fals mein Ausdruck echt nicht moglich ist, dann lass ich die Eingangsfragen im Forum auch meistens sein. Weil es…

              • mich in dieser Situation erheblich anstrengen würde, mich auszudrücken
              • euch mit Sicherheit sehr schwer fällt, meine oraklischen Fragen sinnentnehmend zu verstehen.

              lgmb

    2. Hallo Felix,

      SELECT :foo

      Das meinst Du vermutlich anders - aber das Beispiel erweckt den Eindruck, als könnte man den Namen der zu selektierenden Spalte per Parameter festlegen.

      Dieser Eindruck wäre falsch. Mit einem Parameter in der SELECT-Liste erzeugt man einen Konstante in den selektierten Rows, deren Wert aus dem Parameter genommen wird.

      SELECT name, vorname, 'x'
      FROM personen
      

      Man kann die Konstante 'x' durch :foo ersetzen. Die Spaltenangaben name und vorname lassen sich nicht durch einen Parameter angeben.

      Rolf

      --
      sumpsi - posui - clusi
      1. Lieber Rolf,

        SELECT :foo

        Das meinst Du vermutlich anders

        nein, sondern exakt so. Du kannst das gerne z.B. in phpMyAdmin einmal so testen, indem Du einen Integer-Wert oder das heutige Datum (2020-02-28) dafür einsetzt.

        aber das Beispiel erweckt den Eindruck, als könnte man den Namen der zu selektierenden Spalte per Parameter festlegen.

        Das soll es nicht. Du hast natürlich völlig recht, dass das so nicht ginge.

        Liebe Grüße

        Felix Riesterer

  2. PDO gibt bei manchen Parametern n Fehler aus

    Bitte etwas mehr dazu, damit sollten wir uns mal etwas näher befassen. MFG

    --
    Jeder Virus hat eine Signatur.
  3. Hallo,

    PDO gibt bei manchen Parametern n Fehler aus

    Dazu gabs jetzt ja schon 2 Rückfragen, daher von mir noch die Rückfrage: Meinst wirklich eine unbestimmte Anzahl (wie es die Mathematiker hier lesen) oder hast du einfach den unbestimmten Artikel „einen“ so verkürzt?

    Gruß
    Kalk

    1. moin,

      PDO gibt bei manchen Parametern n Fehler aus

      Dazu gabs jetzt ja schon 2 Rückfragen, daher von mir noch die Rückfrage: Meinst wirklich eine unbestimmte Anzahl (wie es die Mathematiker hier lesen) oder hast du einfach den unbestimmten Artikel „einen“ so verkürzt?

      sry, jetzt muss ich Rückfragen. Meinst du in meinem Beispiel ds ich ausformuliere…

      SELECT ?, ?
      FROM ?
      WHERE ? = ?;
      
      array( 
        'user.first',
        'user.last',
        'user',
        'id',
        '4'
      )
      

      was meinst du mit "unbestimmter Anzahl"?

      lgmb

      1. Hallo,

        PDO gibt bei manchen Parametern n Fehler aus

        Dazu gabs jetzt ja schon 2 Rückfragen, daher von mir noch die Rückfrage: Meinst wirklich eine unbestimmte Anzahl (wie es die Mathematiker hier lesen) oder hast du einfach den unbestimmten Artikel „einen“ so verkürzt?

        sry, jetzt muss ich Rückfragen.

        Ich beziehe mich natürlich genau darauf, was ich als Zitat habe stehen gelassen: „PDO gibt bei manchen Parametern n Fehler aus“

        Und habe mit der Schrägstellung des einzelnen Buchstaben auch ganz genau noch die Stelle gekennzeichnet.

        Gruß
        Kalk

        1. moin,

          Ich beziehe mich natürlich genau darauf, was ich als Zitat habe stehen gelassen: „PDO gibt bei manchen Parametern n Fehler aus“

          Oh, sry, das habe ich übersehen. Das n soll nicht da stehen. Sry.

          lgmb

      2. Lieber MB,

        SELECT ?, ?
        FROM ?
        WHERE ? = ?;
        
        array( 
          'user.first',
          'user.last',
          'user',
          'id',
          '4'
        )
        

        Im SELECT-Statement müssen die Spaltennamen konkret ausformuliert stehen. Vergleiche:

        SELECT user.first, user.last
        FROM user
        WHERE id = 4
        
        SELECT 'user.first', 'user.last'
        FROM 'user'
        WHERE 'id' = 4
        

        Wie Du siehst, sind die Spaltennamen (und der Tabellenname) als Zeichenketten maskiert worden, obwohl sie als Code-Bestandteile verstanden werden sollten. Daher kannst Du nur die Werte mit PDO-Platzhaltern setzen, nicht aber Spalten- oder Tabellennamen.

        Liebe Grüße

        Felix Riesterer

        1. moin,

          Im SELECT-Statement müssen die Spaltennamen konkret ausformuliert stehen. Vergleiche:

          Wie Du siehst, sind die Spaltennamen (und der Tabellenname) als Zeichenketten maskiert worden, obwohl sie als Code-Bestandteile verstanden werden sollten. Daher kannst Du nur die Werte mit PDO-Platzhaltern setzen, nicht aber Spalten- oder Tabellennamen.

          Das ist die eigentliche Information die ich zu meiner Frage benötige! Dankeschon!!!

          lgmb

          1. Lieber MB,

            Das ist die eigentliche Information die ich zu meiner Frage benötige!

            Du postest den für die Frage wichtigen Code (SQL und PHP) - und schon versteht man, was Du eigentlich meintest.

            Dankeschon!!!

            Gern geschehen.

            Liebe Grüße

            Felix Riesterer

            1. moin,

              Sry, nur noch mal zur Frage bezogen auf PDO:

              • Es geht nicht "SELECT ?" wenn man für den Bind-Parameter ? eine Spalte einsetzen will z.B. "'C'.'firstname' AS 'frst'"? Aber "SELECT ?" geht, wenn man Ausdrücke verwendet z.B. 1 \ 4?
              • Geht denn sowas "SELECT * FROM 'COMPANY.Customer' 'C' WHERE ? = ?" wenn man da ein SubQuery dranhängt als Bind-Parameter ? mit Tabellern und Spalten wie "( SELECT * FROM 'BAR' 'B' )"?

              ("Quotes" ersetzt durch "Backticks")

              Zur Klärung: Ich würde es natürlich selbst herausfinden, jedoch mit sehr viel mehr Zeitaufwand. Wie hier erwähnt, hat es nichts mit Bequemlichkeit oder Faulheit zutun, sondern rein mit Effektivität der Informationsbeschaffung. Wenn Du die Info "kurzerhand" hast dann ok, wenn nicht dann auch ok 😉.

              lgmb

              1. Hallo MB,

                für einen SQL Parameter kannst Du immer nur einen konstanten Wert einsetzen. Strings sind immer String-Werte, kein SQL Sprachelemente (Table, Column, Aliasname, Keyword oder Subselect).

                Rolf

                --
                sumpsi - posui - clusi
                1. moin,

                  für einen SQL Parameter kannst Du immer nur einen konstanten Wert einsetzen. Strings sind immer String-Werte, kein SQL Sprachelemente (Table, Column, Aliasname, Keyword oder Subselect).

                  Sorry, was meinst du? Meinst du PHP, SQL oder meine Hilfe Syntax in SQL bezogen auf Quotes? Meinst du…

                  • …das ich anstatt den Magicstring "SELECT ?" auch $sql .= "SELECT ?"; in PHP schreibe…
                  • …das ich "Quotes" durch "Backticks" ersetze, wie $sql .= "'COMPANY.Customer'.'firstname'", da der "Backtick" ja Code im Kramdown hier im Forum einleiten würde…

                  …fals du das meinst?

                  Nachtrag: Kannst du vielleicht n Paradebeispiel anführen, was geht und was nicht geht, für mein Verständnis deiner AW?

                  lgmb

                  1. Lieber MB,

                    Deine SQL-Platzhalter können nur Werte annehmen. Das hatte ich Dir schon geschrieben. Die Werte sind Integer, String, Date oder ähnliches. Wenn Du Spaltennamen, Tabellennamen oder überhaupt Namen verwenden willst, dann sind das keine Werte, sondern Namen. Die kannst Du nicht über Platzhalter setzen.

                    Liebe Grüße

                    Felix Riesterer

                    1. moin,

                      Deine SQL-Platzhalter können nur Werte annehmen.

                      Das hast du mir schon gesagt. Meine Frage war, ob Subqueries, die einem z.B. einen Integerwert liefern, als Platzhalter gehen können z.B. SELECT 1 als Subquery, weil ja der Wert ein Integerwert ist und keine z.B. Tabelenspalte.

                      lgmb

                      1. Hallo MB,

                        Du musst unterscheiden zwischen Werten und Ausdrücken. die Werte liefern.

                        1 ist ein Wert. Er ist sofort nutzbar.

                        SELECT 1 ist ein Ausdruck. Er muss zuerst ausgewertet werden, bevor er benutzt werden kann.

                        Parameter können Werte enthalten, keine Ausdrücke.

                        Rolf

                        --
                        sumpsi - posui - clusi
                        1. moin,

                          Du musst unterscheiden zwischen Werten und Ausdrücken. […]

                          "SELECT ?" würde also gehen wenn ich einen z.B. Integerwert array( '1' ) als Platzhalter einsetzen würde?

                          lgmb

                          1. Lieber MB,

                            "SELECT ?" würde also gehen wenn ich einen z.B. Integerwert array( '1' ) als Platzhalter einsetzen würde?

                            ja. Screenshot von phpMyAdmin mit SELECT 1

                            Liebe Grüße

                            Felix Riesterer

                            1. moin,

                              Danke Dir 😀.

                              lgmb

                          2. Hallo MB,

                            meinen Beitrag von 17:33 hast Du gelesen?

                            Sodann ist ARRAY('1') kein Integerwert. Es ist ein Array mit einem String-Wert drin. Dieser String sieht aus wie eine Zahl, aber der PHP Datentyp ist STRING.

                            Ich gebe zu, dass PHP einem die Sache wirklich nicht leicht macht. Durch den eingebauten Type-Juggler kann man meistens mit dem falschen Typ arbeiten, ohne es zu merken. MYSQL ist da auch nicht strikter. Diese Bequemlichkeitsangebote hindern Programmierer daran, exakt zu arbeiten und damit die Effizienzvorteile von korrekten Typen zu nutzen.

                            $a = "1";
                            echo "\$a enthält $a, der Typ ist " . gettype($a) . "\n";
                            
                            $b = 1;
                            echo "\$b enthält $b, der Typ ist " . gettype($b) . "\n";
                            
                            // $a wird implizit in int umgewandelt
                            echo "$a + $b ergibt " . ($a + $b) . "\n";
                            
                            // $b wird implizit in string umgewandelt
                            echo "$a . $b ergibt " . ($a . $b) . "\n";
                            

                            liefert diese Ausgabe:

                            $a enthält 1, der Typ ist string
                            $b enthält 1, der Typ ist integer
                            1 + 1 ergibt 2
                            1 . 1 ergibt 11
                            

                            Nochmal zu deiner Frage:

                            $stmt = $pdo->prepare("SELECT ?");
                            $stmt->execute(array('1'));
                            

                            ist das gleiche wie

                            $stmt = $pdo->query("SELECT '1'");
                            

                            Das liefert Dir eine Row mit einer Spalte darin. In dieser Spalte befindet sich der String-Wert '1'.

                            Und

                            $stmt = $pdo->prepare("SELECT ?");
                            $stmt->execute(array(1));
                            

                            ist das gleiche wie

                            $stmt = $pdo->query("SELECT 1");
                            

                            Das liefert Dir eine Row mit einer Spalte darin. In dieser Spalte befindet sich der Integer-Wert 1.

                            Wenn es das ist, was Du willst, ja, dann geht SELECT ?.

                            Rolf

                            --
                            sumpsi - posui - clusi
                            1. Lieber Rolf,

                              $stmt = $pdo->query("SELECT '1'");
                              

                              Das liefert Dir eine Row mit einer Spalte darin. In dieser Spalte befindet sich der String-Wert '1'.

                              $stmt = $pdo->query("SELECT 1");
                              

                              Das liefert Dir eine Row mit einer Spalte darin. In dieser Spalte befindet sich der Integer-Wert 1.

                              da aber, wie Du korrekt ausgeführt hast, PHP-intern Strings und Integer in diesem Fall je nach bedarf beliebig hin und her konvertiert werden, ist das Ergebnis für den Programmierer letzten Endes das selbe.

                              Liebe Grüße

                              Felix Riesterer

                            2. moin,

                              meinen Beitrag von 17:33 hast Du gelesen?

                              jepp

                              Sodann ist ARRAY('1') kein Integerwert.

                              ist mir bewusst

                              Ich gebe zu, dass PHP einem die Sache wirklich nicht leicht macht. Durch den eingebauten Type-Juggler kann man meistens mit dem falschen Typ arbeiten, ohne es zu merken.

                              ich möchte exakt arbeiten - eben soweit es mir möglich ist

                              MYSQL ist da auch nicht strikter.

                              Ist mir Bewusst allein schon durch die Backticks

                              $stmt = $pdo->prepare("SELECT ?");
                              $stmt->execute(array('1'));
                              

                              ist das gleiche wie

                              $stmt = $pdo->query("SELECT '1'");
                              

                              Das ist mir definitiv neu. Ich dachte das nur PHP typenloser sei und in sofern wäre es gleich, weil PHP intern castet.

                              1 kann bool, int, float, string und vermutlich noch weitere Datentypen, sein ohne vom Programmier selbst gecastet zu werden (bin leider kein Experte). Je nach dem, wie man 1 verwendet. Das ist schon anstrengend, Herr über die lage zu werden

                              Auf jeden Fall danke 😀. Ein sehr guter Hinweis.

                              lgmb

                              1. Hallo MB,

                                ...allein schon durch die Backticks

                                Moment. Die Backticks haben nichts mit Typendurcheinander zu tun, sondern damit, Namen bilden zu können die von der SQL Syntax eigentlich ausgeschlossen sind.

                                SELECT WHERE FROM GROUP BY WHERE SELECT * FROM foo_tab > 0
                                

                                sieht äußerst merkwürdig aus und wird krachend abgewiesen, aber hier ist das CREATE TABLE Statement. Es funktioniert! Wie darauf eine Query machen?

                                CREATE TABLE `GROUP BY` (
                                  `WHERE` int(11) NOT NULL,
                                  `HAVING` int(11) DEFAULT NULL,
                                  `SELECT * FROM foo_tab` int(11) DEFAULT NULL
                                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
                                

                                Backticks to the rescue:

                                SELECT `WHERE` FROM `GROUP BY` WHERE `SELECT * FROM foo_tab` > 0
                                

                                Dass das geht, heißt nicht, dass man sowas im real life tun sollte.

                                Und dann schrieb ich leichtfertig dies:

                                ist das gleiche wie

                                Verstehe das nicht falsch, das zweitgenannte Statement ist nicht exakt das Gleiche. Es ist das, was im SQL Server nach Einsetzen der Parameterwerte entsteht. Insofern sind diese beiden Queries vom Ergebnis her gleich.

                                Du schriebst dann noch

                                1 kann bool, int, float, string und vermutlich noch weitere Datentypen

                                Nein. Definitiv nein. Du möchtest doch exakt sein. Unterscheide dazwischen, was ein Wert ist und in was er automatisch konvertiert werden kann. In PHP ist 1 ist ein int und nichts anderes. TRUE ist ein bool. 1.0 ist ein float und '1' ist ein String. In MYSQL ist 1 ein int. Den SQL Typ BOOL gibt's nicht, allerdings stellt MYSQL den Ergebnis eines Vergleichs als Integerwert 1 oder 0 dar.

                                Welche Typen es in SQL und PHP gibt, ist in den jeweiligen Handbüchern genau aufgeführt. Dort gibt es auch Beispiele für die Notationen, mit denen man Literale der diversen Typen aufschreibt.

                                Rolf

                                --
                                sumpsi - posui - clusi
                                1. moin,

                                  ...allein schon durch die Backticks

                                  Moment. Die Backticks haben nichts mit Typendurcheinander zu tun, […]

                                  Sry, mein Fehler. Ich habs auf m Schim.

                                  SELECT WHERE FROM GROUP BY WHERE SELECT * FROM foo_tab > 0
                                  

                                  sieht äußerst merkwürdig aus und wird krachend abgewiesen, aber hier ist das CREATE TABLE Statement. Es funktioniert! Wie darauf eine Query machen?

                                  CREATE TABLE `GROUP BY` (
                                    `WHERE` int(11) NOT NULL,
                                    `HAVING` int(11) DEFAULT NULL,
                                    `SELECT * FROM foo_tab` int(11) DEFAULT NULL
                                  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
                                  

                                  Ich vermute der SELECT-Befehl ist sone Art Subquery? Wie in den vergangenen Threads erwähnt hab ich erst DQL und noch nicht DML fertigt und kenne mich in DML nicht aus. Ich arbeite gerade an der Buissenes Logic.

                                  Backticks to the rescue:

                                  SELECT `WHERE` FROM `GROUP BY` WHERE `SELECT * FROM foo_tab` > 0
                                  

                                  Dass das geht, heißt nicht, dass man sowas im real life tun sollte.

                                  Was soll der Befehl ausdrücken??? Mir erstaunts, dass das geht.

                                  Und dann schrieb ich leichtfertig dies:

                                  Neben bei ertwähnt: Wir llle sind Menschen und kewiune Maschinen 😉.

                                  ist das gleiche wie

                                  Verstehe das nicht falsch, das zweitgenannte Statement ist nicht exakt das Gleiche.

                                  War mir schon klar.

                                  Du schriebst dann noch

                                  1 kann bool, int, float, string und vermutlich noch weitere Datentypen

                                  Nein. Definitiv nein. Du möchtest doch exakt sein. Unterscheide dazwischen, was ein Wert ist und in was er automatisch konvertiert werden kann. […]

                                  Ups sry, so wollte ich das auch ausgedrückt haben. "Autokonvertierung":

                                  // PHP Version 7.1
                                  
                                  function getIntFromBool ( bool $value ) : int {
                                    return $value;
                                  }
                                  
                                  echo '<pre>';
                                  
                                  var_dump ( getIntFromBool ( '1' ) );  // int(1)
                                  var_dump ( getIntFromBool ( true ) ); // int(1)
                                  var_dump ( getIntFromBool ( 1 ) );    // int(1)
                                  var_dump ( getIntFromBool ( 1.0 ) );  // int(1)
                                  

                                  Welche Typen es in SQL und PHP gibt, ist in den jeweiligen Handbüchern genau aufgeführt. Dort gibt es auch Beispiele für die Notationen, mit denen man Literale der diversen Typen aufschreibt.

                                  Danke für den Tipp!

                                  lgmb

                                  1. Hallo MB,

                                    SELECT `WHERE` FROM `GROUP BY` WHERE `SELECT * FROM foo_tab` > 0
                                    

                                    Dass das geht, heißt nicht, dass man sowas im real life tun sollte.

                                    Was soll der Befehl ausdrücken??? Mir erstaunts, dass das geht.

                                    Es wird eine Spalte mit dem Namen "WHERE" aus einer Tabelle mit dem Namen "GROUP BY" ausgewählt, wenn der Wert der Spalte "SELECT * FROM foo_tab" größer als null ist.

                                    Bis demnächst
                                    Matthias

                                    --
                                    Du kannst das Projekt SELFHTML unterstützen,
                                    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
                                  2. hi @MB

                                    wie ich schon einmal schrieb: PHP'PDO hat keine zu Perl'DBH vergleichbare Methode quote_identifier()

                                    Im Perl würde das so aussehen:

                                    my $tabn = 'where';
                                    puts $dbh->quote_identifier($tabn);
                                      # `where`
                                    

                                    Da wird also mit Backticks gequotet, aber das sind eben nur deswegen Backticks weil $dbh über MySQL erstellt wurde.

                                    Es ist also möglich, daß ein identifier unter einem anderen RDDBMS != MySQL anders gequotet werden muss!

                                    Insofern hast Du mit dem derzeitigen Entwicklungsstand von PDO keine Möglichkeit, variable Identifier einzusetzen. Es sei denn, Du beschränks Dich auf MySQL und nimmst die Backticks.

                                    MFG

                                  3. Hallo MB,

                                    SELECT `WHERE` FROM `GROUP BY` WHERE `SELECT * FROM foo_tab` > 0
                                    

                                    Ich vermute der SELECT-Befehl ist sone Art Subquery? Wie in den vergangenen Threads erwähnt hab ich erst DQL und noch nicht DML fertigt und kenne mich in DML nicht aus.

                                    Nein, dieser SELECT beinhaltet eben keinen Subselect. Es war ein Beispiel dafür, wo man Backticks unbedingt braucht. Ein irrsinniger DB-Designer hat eine Table angelegt, deren Name GROUP BY lautet und die eine Spalte SELECT * FROM foo_tab enthält. Das irrsinnigste ist, dass SQL eine Syntax hat, mit der man diesen Design-Irrsinn auch noch realisieren kann: die Backticks. Ein SQL Generator muss jeden Namen eines SQL Objekts in Backticks setzen, weil er durch solchen Irrsinn nicht aus der Bahn geworfen werden darf.

                                    erst DQL und noch nicht DML fertig

                                    Ja und? SELECT ist DQL (data Query language).

                                    getIntFromBool

                                    Kann man machen - geht aber auch ohne eigene Funktion, mit einem doppelten Cast. Casts sind rechts-assoziativ (werden von rechts nach links ausgewertet), d.h. $a wird zuerst in einen bool umgewandelt und dann in einen int, ohne den Overhead eines Funktionsaufrufs:

                                    var_dump((int)(bool)$a);
                                    

                                    Rolf

                                    --
                                    sumpsi - posui - clusi
                                    1. moin,

                                      Ich vermute der SELECT-Befehl ist sone Art Subquery? […]

                                      Nein, dieser SELECT beinhaltet eben keinen Subselect. […] Ein irrsinniger DB-Designer hat eine Table angelegt, deren Name GROUP BY lautet und die eine Spalte SELECT * FROM foo_tab enthält.

                                      On stimmt, wenn ich es genauer betrachte.

                                      lgmb

                  2. Hallo MB,

                    ich meine SQL Parameter und sonst nichts. Das Zusammenbauen eines SQL Strings in PHP ist ein anderes Thema. Da hast Du ganz andere Möglichkeiten.

                    Das Einsetzen von Werten für Parametern wie ? oder :name in einem SQL String ist etwas, das der Datenbanktreiber bzw. die Datenbank selbst durchführt. Und diese Werte dürfen eben nur Konstanten stehen, keine SQL Elemente wie Schlüsselwörter, Namen von Spalten oder Tabellen, oder ganze SQL Fragmente wie eine IN Klausel oder ein Subselect.

                    Beispiel 1: Spaltennamen

                    $stmt = $dbo->prepare("SELECT ? FROM myTable WHERE id=?");
                    $stmt->execute(array('name', 4));
                    

                    ist NICHT das gleiche wie

                    $stmt = $dbo->query("SELECT name FROM myTable WHERE id=4")
                    

                    sondern

                    $stmt = $dbo->query("SELECT 'name' FROM myTable WHERE id=4")
                    

                    Dieses Statement würde eine Row mit einer Spalte liefern, deren Wert 'name' ist. Etwas anderes ist dies hier:

                    $spalte = "name";
                    $id = 4;
                    $stmt = $dbo->query("SELECT $spalte FROM myTable WHERE id=$id");
                    

                    weil jetzt die Ersetzung von PHP durchgeführt wird, nicht von PDO. Du hast dann aber auch nur ein Einmalstatement, nichts, was prepared ist.

                    Beispiel 2: Tabellennamen

                    $stmt = $dbo->prepare("SELECT name, vorname FROM ? WHERE id=?");
                    $stmt->execute(array('myTable', 4));
                    

                    würde schon im PREPARE scheitern, weil FROM ? unzulässig ist. Denn es ist NICHT das gleiche wie

                    $dbo->query("SELECT name, vorname FROM myTable WHERE id=4")
                    

                    sondern

                    $dbo->query("SELECT name, vorname FROM 'myTable' WHERE id=4")
                    

                    und das ist ein SQL Syntaxfehler.

                    Beispiel 3: SQL Fragmente

                    $stmt = $dbo->prepare("SELECT name, vorname FROM myTable WHERE id=?");
                    $stmt->execute(array('(SELECT id FROM foo WHERE x=47)'));
                    

                    ist NICHT das gleiche wie

                    $dbo->query("SELECT name, vorname FROM myTable WHERE id=(SELECT id FROM foo WHERE x=47)")
                    

                    sondern

                    $dbo->query("SELECT name, vorname FROM myTable WHERE id='(SELECT id FROM foo WHERE x=47)'")
                    

                    d.h. du vergleichst die ID mit einem längeren String und nicht mit dem Ergebnis eines Subselects. Vermutlich ist das Ergebnis leer, oder es gibt sogar einen SQL Fehler.

                    Hat das geholfen?

                    Rolf

                    --
                    sumpsi - posui - clusi