Nelio: mysqli sql statement aus 2 tabellen

Hallo Leute,

erstmal, der thread steht in php weil das original sql statement funktioniert.
das problem habe ich nur bei der mysqli geschichte, ich vermute mal mal wieder der syntax wegen, habe schon mehrere Varianten durch. aber irgendwie will dieses Statement nicht funktionieren:

sql = "SELECT t1.COUNT(*), t2.id, t2.nameFROMblog_articleASt1 blog_categorysASt2WHEREt2.id=t1.cat";

Ich hasse dieses Anführungszeichen durcheinander das mir mysqli anhängt.
Jedenfalls:
 Fatal error: Call to a member function execute() on a non-object in \Srv\webroot\www\nel\inc\db.inc.php on line 347

Dank und Grüße
Nel

  1. Hi,

    Fatal error: Call to a member function execute() on a non-object in \Srv\webroot\www\nel\inc\db.inc.php on line 347

    Das ist lediglich ein Folgefehler, wenn du versucht die Methode execute auf einem MySQLi_STMT-Objekt aufzurufen, welches zuvor nicht erfolgreich erstellt werden konnte.
    Überprüfe also, was bei der Erstellung des Objektes schief ging.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Überprüfe also, was bei der Erstellung des Objektes schief ging.

      MfG ChrisB

      Wie gesagt, der Fehler entsteht durch das statement, setze ich ein anderes(gültiges) ein
      wie z.b.

      	 $sql = "SELECT `id`,`title`,`article`,`cat`,CONCAT(  
          CASE DATE_FORMAT(time,'%w')  
            WHEN 0 THEN 'Sonntag'  
            WHEN 1 THEN 'Montag'  
            WHEN 2 THEN 'Dienstag'  
            WHEN 3 THEN 'Mittwoch'  
            WHEN 4 THEN 'Donnerstag'  
            WHEN 5 THEN 'Freitag'  
            WHEN 6 THEN 'Samstag'  
            ELSE 'was anderes' END,  
          ', ',  
          DATE_FORMAT(time,'%d.'),  
            CASE DATE_FORMAT(time,'%M')  
            WHEN 'January' THEN 'Januar'  
            WHEN 'February' THEN 'Februar'  
            WHEN 'March' THEN 'März'  
            WHEN 'May' THEN 'Mai'  
            WHEN 'June' THEN 'Juni'  
            WHEN 'July' THEN 'Juli'  
            WHEN 'October' THEN 'Oktober'  
            WHEN 'December' THEN 'Dezember'  
            ELSE 'was anderes' END,  
          DATE_FORMAT(time, ' %Y<br>%H:%i Uhr<br>')  
        ) as datum,`author` FROM `blog_article` WHERE time < NOW() LIMIT 0,5";
      

      funktioniert es einwandfrei.

      Mit freundlichen Grüßen
      Nelio

      1. Hi,

        Wie gesagt, der Fehler entsteht durch das statement, setze ich ein anderes(gültiges) ein [...]
        funktioniert es einwandfrei.

        Bevor du ein Statement mit execute ausführen kannst, hast du es mit prepare vorbereitet. Und wenn die Syntax fehlerhaft ist, dann wird das Vorbereiten schief gehen. Also Werte die Rückgabewerte solcher Methoden vernünftig aus, statt dich blind darauf zu verlassen, dass sie "wohl schon funktioniert" haben werden.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Also Werte die Rückgabewerte solcher Methoden vernünftig aus, statt dich blind darauf zu verlassen, dass sie "wohl schon funktioniert" haben werden.

          MfG ChrisB

          Es handelt sich dabei um die Ausschlussmethode.
          Aber wie könnte ich es denn noch besser auswerten?

          Mit freundlichen Grüßen
          Nelio

          1. Hi,

            Also Werte die Rückgabewerte solcher Methoden vernünftig aus, statt dich blind darauf zu verlassen, dass sie "wohl schon funktioniert" haben werden.

            Es handelt sich dabei um die Ausschlussmethode.
            Aber wie könnte ich es denn noch besser auswerten?

            Rückgabewerte von Methodenaufrufen auswerten. Dazu erst mal im Handbuch nachlesen, was diese jeweils im Erfolgs- und Fehlerfalle zurückgeben; und dann auch noch schauen, welche Möglichkeiten das jeweilige Objekt bietet, nähreres zum Fehler zu erfahren - die MySQLi-Objekte haben Eigenschaften bzw. Methoden zum Abfragen von Fehlermeldungstexten der Datenbank.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Rückgabewerte von Methodenaufrufen auswerten. Dazu erst mal im Handbuch nachlesen, was diese jeweils im Erfolgs- und Fehlerfalle zurückgeben; und dann auch noch schauen, welche Möglichkeiten das jeweilige Objekt bietet, nähreres zum Fehler zu erfahren - die MySQLi-Objekte haben Eigenschaften bzw. Methoden zum Abfragen von Fehlermeldungstexten der Datenbank.

              MfG ChrisB

              Okay, danke.Beim nächsten mal werd ich nicht so vorschnelle Behauptungen aufstellen ohne diese weiter zu fundieren. ^^
              Schönen Abend noch.

              Mit freundlichen Grüßen
              Nelio

  2. Hallo,

    sql = "SELECT t1.COUNT(*), t2.id, t2.nameFROMblog_articleASt1 blog_categorysASt2WHEREt2.id=t1.cat";

    Du hast hier mehrere Fehler:

    a) hast Du das Komma zwischen Deinen beiden Tabellen vergessen,,
    b) Deine Spalten falsch begrenzt,

    c) hättest Du die ersten beiden Fehler nicht gemacht, so verläßt Du Dich auf
       MySQLs Eigenart bei der Verwendung von Aggregatfunktionen nicht die anderen
       Spalten gruppieren zu müssen,
    d) finde ich explizite Join-Syntax schöner als die implizite. Du hättest somit
       die ersten Fehler nicht gemacht.

    Schreiben wir es einfach mal in SQL:

    SELECT  
        COUNT(*), -- Du kannst nicht einfach nur die Datensätze einer Tabelle zählen  
        t2.id,  
        t2.name  
    FROM  
        blog_article t1  -- AS ist optional und wird nicht von allen DBMS verstanden  
    INNER JOIN  
        blog_categorys t2  
    ON  
        t2.id = t1.cat  
    GROUP BY  
        t2.id,           -- wenn Du nach diesen Spalten nicht gruppierst, sind die  
        t2.name          -- Werte innerhalb einer Gruppe in diesen Spalten zufällig  
    
    

    Möchtest Du die Schemanamen begrenzen, so geht dies mit dem Backtick, Du musst aber jeden einzelnen Teil begrenzen:

    SELECT  
        COUNT(*),    -- COUNT wird nicht begrenzt, da Name einer Funktion,  
                     -- nicht einer Spalte  
        `t2`.`id`,   -- sowohl Tabellen(alias)name als auch Spaltenname sind  
        `t2`.`name`  -- zu begrenzen, wenn man begrenzen will,  
                     -- sonst hätte man eine Spalte mit einem Punkt im Namen.  
    FROM  
        `blog_article` `t1`  
    INNER JOIN  
        `blog_categorys` `t2`  
    ON  
        `t2.id` = `t1.cat`  
    GROUP BY  
        `t2`.`id`,  
        `t2`.`name`  
    
    

    Freundliche Grüße

    Vinzenz

    1. Hallo Ingrid,

      » sql = "SELECT t1.COUNT(*), t2.id, t2.nameFROMblog_articleASt1 blog_categorysASt2WHEREt2.id=t1.cat";

      Du hast hier mehrere Fehler:
      a) hast Du das Komma zwischen Deinen beiden Tabellen vergessen,,

      ^
                                                          damit's nicht beleidigt ist,

      hab' ich's hier verdoppelt ;-)

      Freundliche Grüße

      Vinzenz

      1. Hallo Ingrid,

        Freundliche Grüße

        Vinzenz

        Nanu wie kommst du auf Ingrid? ^^
        Anyway ich habe es nicht als beleidigend sondern als Hilfreich empfunden.Vielen Dank nochmal an dieser stelle.Es kommt selten vor, dass ich derartig hilfreiche Posts zu lesen bekomme. :)
        Anonsten schau mal bitte in meinen vorherigen Post.

        Mit freundlichen Grüßen
        Nelio

        1. Hallo Nelio,

          Nanu wie kommst du auf Ingrid? ^^

          siehe Wikipedia, Ingrid (bei uns im Forum ist sowas eher ein Gunnar™).

          Anyway ich habe es nicht als beleidigend sondern als Hilfreich empfunden.

          es war nicht auf Dich gemünzt, noch viel weniger ernst gemeint; ich hätte den Bereich auf Menschelei ändern sollen. Du hattest ein Komma zu wenig, ich dafür eines zuviel ...

          Freundliche Grüße

          Vinzenz

    2. Hallo,

      »» sql = "SELECT t1.COUNT(*), t2.id, t2.nameFROMblog_articleASt1 blog_categorysASt2WHEREt2.id=t1.cat";

      Du hast hier mehrere Fehler:

      a) hast Du das Komma zwischen Deinen beiden Tabellen vergessen,,
      b) Deine Spalten falsch begrenzt,

      c) hättest Du die ersten beiden Fehler nicht gemacht, so verläßt Du Dich auf
         MySQLs Eigenart bei der Verwendung von Aggregatfunktionen nicht die anderen
         Spalten gruppieren zu müssen,
      d) finde ich explizite Join-Syntax schöner als die implizite. Du hättest somit
         die ersten Fehler nicht gemacht.

      Freundliche Grüße

      Vinzenz

      Vieln, vielen Dank, das hat geholfen.Das impliziete JOIN funzt auch das problem lag tatsächlich an der Begrenzung. Habe nun auf deinen Rat hin deine Methode verwendet.

      Eine abchließende Frage noch.Ich möchte das auch bei einem Count ergebnis von 0 die beiden anderen werte übergeben.Wie bekomme ich das hin?
      Um es zu erklären.Ich möchte die Einträge pro Kategorie zählen.In dieser funktion soll nun pro Kategorie ein eintrag im $cats array erstellt werden:

      $cname ist representativ für t2.name und $countcat für die Anzahl der gefundenen einträge in dieser Kategorie.
      $cats[$cname]= $countcat;

      Mit freundlichen Grüßen
      Nelio

  3. erstmal, der thread steht in php weil das original sql statement funktioniert.

    Wie sieht denn das Originalstatement aus?

    das problem habe ich nur bei der mysqli geschichte, ich vermute mal mal wieder der syntax wegen, habe schon mehrere Varianten durch. aber irgendwie will dieses Statement nicht funktionieren:

    sql = "SELECT t1.COUNT(*), t2.id, t2.nameFROMblog_articleASt1 blog_categorysASt2WHEREt2.id=t1.cat";

    Ein kleiner Test zeigt mir, dass auch schon "SELECT foo.COUNT(*) from foo;" direkt per MySQL-Client getestet einen Syntaxfehler wirft. Aber zu dem Statement hat sich ja Vinzenz schon ausgelassen.

    Ich hasse dieses Anführungszeichen durcheinander das mir mysqli anhängt.

    Normalerweise kriegt man das doch auch nicht zu Gesicht?

    --
    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:|