Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP und MySQL: Erstellung einer temporären Tabelle funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP und MySQL: Erstellung einer temporären Tabelle funktioniert nicht

    Hallo liebes Forum,

    habe ein Problem an dem ich verzweifle und um Hilfe bitte.

    Ich habe eine DB probeweise unter Xampp und phpmyAdmin.

    Folgende Abfrage funktioniert bei direkter Eingabe als SQL in phpmyadmin:
    Code:
         SET @rownum := 0;
         CREATE TEMPORARY TABLE IF NOT EXISTS `tblTagCloud` (
         SELECT strCategory, COUNT(*) AS intCategoryCount, @rownum := @rownum+1 AS intRank
                       FROM `tblLop`
                       GROUP BY strCategory
         ORDER BY intCategoryCount DESC
         LIMIT 0 , 15);
         SELECT strCategory, intRank FROM `tblTagCloud`
         ORDER BY strCategory ASC
    in meiner php.Datei klappt das leider nicht.

    Code:
      if ($qryFilter = $mysqli->prepare("
         SET @rownum := 0;
         CREATE TEMPORARY TABLE IF NOT EXISTS `tblTagCloud` (
         SELECT strCategory, COUNT(*) AS intCategoryCount, @rownum := @rownum+1 AS intRank
                       FROM `tblLop`
                       GROUP BY strCategory
         ORDER BY intCategoryCount DESC
         LIMIT 0 , 15);
         SELECT strCategory, intRank FROM `tblTagCloud`
         ORDER BY strCategory ASC"))
                          {                                              
                          $qryFilter->execute();                                              
                          $qryFilter->bind_result($strCategory, $intRank);                 
                            while($qryFilter->fetch()) {                                       
                               echo "+" . htmlspecialchars($strCategory) . "+" . $intRank; 
                            }
                          $qryFilter->close();
                    }
    Alle anderen Abfragen (ohne temp Tabellen) funktionieren.

    Was mache ich falsch???

    Beste Grüße

    Desept

  • #2
    das Ding ist nicht EINE Abfrage ... sondern 3 - erkennbar an den Semicolons ..

    darf also nicht per query geschickt werden, sondern multiquery ...
    wenn deine Datenbank-Erweiterung das nicht hat, geht nur die Abfrage aufzuspalten und dann in einer Transaktion zu schicken

    Start transaction (abschicken)
    Set @rownum ...
    Create if not exist .. bis runter zum Limit 0,15)
    Select -> Order by ... ASC
    end transaction
    - auswerten

    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

    Kommentar


    • #3
      Hallo eagle,

      Danke für die schnelle Rückmeldung.

      ich habe folgendes probiert:
      Code:
        if ($qryFilter = $mysqli->prepare("
           start_transaction();
           SET @rownum := 0;
           CREATE TEMPORARY TABLE IF NOT EXISTS `tblTagCloud` (
           SELECT strCategory, COUNT(*) AS intCategoryCount, @rownum := @rownum+1 AS intRank
                         FROM `tblLop`
                         GROUP BY strCategory
           ORDER BY intCategoryCount DESC
           LIMIT 0 , 15);
           SELECT strCategory, intRank FROM `tblTagCloud`
           ORDER BY strCategory ASC
           end_transaction();
           ")) {                                                
                            $qryFilter->execute();                                              
                            $qryFilter->bind_result($strCategory, $intRank);                  
                              while($qryFilter->fetch()) {                                        
                                 echo "+" . htmlspecialchars($strCategory) . "+" . $intRank;
                              }
                            $qryFilter->close();
                      }
      Das Ergebnis ist trotzdem noch leer.

      Was habe ich ich hier falsch interpretiert?

      Gruß

      Desept

      Kommentar


      • #4
        http://php.net/manual/en/mysqli.multi-query.php

        Kommentar


        • #5
          du willst es immer noch als EINE Abfrage losschicken .. es sind aber MEHRERE .. siehe das Manual

          das mit der Transaktion wäre nur, falls deine Datenbank-Erweiterung kein multiquery kennt - dann bitte JEDE Abfrage einzeln sehen - und damit es zusammenbleibt die Transakton "drumherum" .. die aber auch EINZELN geschickt werden müsste
          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

          Kommentar


          • #6
            Hallo zusammen,

            Danke an Euch und besonders hellbringer, der Tipp mit der MultiQuery hat geholfen.

            Hatte leider mit dem verlinkten Code auch die Probleme mit der Fehlermeldung welche erst nach Korrektur von Lubaev weiter unten ...
            Code:
            while( $mysqli->more_results() && $mysqli->next_result()
            funktionierte.

            Hier nun mein korrigierter Code:
            Code:
            $query  = "       SET @rownum := 0;
                       CREATE TEMPORARY TABLE IF NOT EXISTS `tblTagCloud` (
                       SELECT strCategory, strTopic, COUNT(*) AS intCategoryCount, @rownum := @rownum+1 AS intRank
                               FROM `tblLop`
                               GROUP BY strCategory
                       ORDER BY intCategoryCount DESC
                       LIMIT 0 , 15);";
            $query .= "       SELECT strCategory, intRank FROM `tblTagCloud`
                       ORDER BY strCategory ASC;";
            
            /* execute multi query */
            if ($mysqli->multi_query($query)) {
                do {
                    /* store first result set */
                    if ($result = $mysqli->store_result()) {
                        while ($row = $result->fetch_row()) {
                            printf("%s\n", $row[0] . "+" .$row[1]);
                        }
                        $result->free();
                    }
                    /* print divider */
                    if ($mysqli->more_results()) {
                        printf("-----------------\n");
                    }
                } while ( $mysqli->more_results() && $mysqli->next_result() );
            }
            Besten Dank und schönes Wochenende...

            Kommentar


            • #7
              A. Du musst nicht explizit eine temporäre Tabelle erzeugen. Das lässt sich als Subquery formulieren. (Achtung, siehe mit B!)

              Code:
              SELECT
                  t.strCategory, t.intRank
              FROM
                  (SELECT @rownum := 0) AS n,
                  (
                       SELECT strCategory, strTopic, COUNT(*) AS intCategoryCount, @rownum := @rownum+1 AS intRank
                                 FROM `tblLop`
                                 GROUP BY strCategory
                                 ORDER BY intCategoryCount DESC
                              LIMIT 0 , 15
                  ) AS t
              ORDER BY t.strCategory ASC;
              B. Teste deine Abfrage/n genau! "@rownum := @rownum+1 AS intRank" in Verbindung mit "ORDER BY" macht etwas anderes als du denkst. Es wird nicht nach ORDER BY nummeriert, sondern nach der Reihnfolge wie die Daten aus dem Speicher gelesen wurden. Das kannst du nur "steuern" indem du die Daten erst sortierst und dann nummerierst. Alles andere kannst du als Zufall ansehen, selbst der Workaround ist nicht sauber und funktioniert nur durch Eigenheiten die nicht definiert sind, daher "steuern".

              Code:
              SELECT
                  t.strCategory, t.intRank
              FROM
                  (SELECT @rownum := 0) AS n,
                  (
                      SELECT
                          k.*,
                          @rownum := @rownum+1 AS intRank
                      FROM
                          (
                               SELECT strCategory, strTopic, COUNT(*) AS intCategoryCount
                                         FROM `tblLop`
                                         GROUP BY strCategory
                                         ORDER BY intCategoryCount DESC
                                      LIMIT 0 , 15
                                  ) k
                  ) AS t
              ORDER BY t.strCategory ASC;

              Kommentar

              Lädt...
              X