MYSQL - Auslese Problem ( für Profis ) -- wichtig plz help

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

  • MYSQL - Auslese Problem ( für Profis ) -- wichtig plz help

    Moinsen,

    bin immer noch dabei mein CMS zu schreiben .
    Leider habe ich nun ein weiteres Problem.
    Also ich habe das CMS ja in Blöcken aufgebaut, diese Blöcke werden mittels einer Funktion (Block() ) ausgelesen.

    Nun gut, das klappt ja auch perfekt, allerdings sobald ich zum Beispiel einen Block aus einer Datei einlese ( zum Beispiel Login.php ( Name steht in der DB drinne und wird dann per include "login.php" reingeholt), da das schlecht in ner DB ist ).

    sieht praktisch so aus:
    <?php
    global $db, $prefix;

    $sql = "select * from ........";
    $db -> query($sql);

    ?>

    Das klappt aber nicht , dann liest er zwar alles aus, aber die Blöcke die danach kommen, liest er nicht mehr aus ( ich lese immer eine ganze Seite aus (links, rechts, mitte).

    Ich muss immer erst hinschreiben

    <?php
    global $db, $prefix;
    $dc = $db;
    $sql = "select * from ........";
    $db -> query($sql);
    $db = $dc;
    ?>

    Ich muss nur diese beiden Sachen hinschreiben, dann geht es, aber warum geht es ohne diese nicht, das ist nen Problem, weil ich die Querys zählen will und auch sonst ist es nicht schön für den Code, denn dieser wird dadurch nen bisschen unübersichtlich.


    natürlich habe ich das Object instanziiert ( in der main.php ), von der Methode query() gibt es nocheine, fetch_array() ( durch die hole ich die Daten).
    Dies ist aber eher untwichtig, da das Problem ist, das ich die Restlichen Blöcke einfach nicht ausgelesen kriege.

    Hier mal der Generelle Ablauf der Datei ( main.php)

    whilte(
    block(seite)
    --> check ob file oder nicht, wenn nicht dann ausgabe --> render
    --> wenn File, dann
    blockfileinc--render
    )
    Das ist ja wie gesagt ne Schleife, damit ich alle Blöcke zum Beispiel von Rechts ausgelesen kriege, aber sobald da ein Block mit Seite drinne ist, wo ich auf die Datenbank zugreifen muss, klappt das System nicht mehr und das auslesen hört bei dem Block auf, bei welchem MySQL zum Einsatz kam.

    So hier sind 2 Screenshots:

    Richtig:

    www.optima-design.de/labil.jpg

    Falsch:
    www.optima-design.de/labil_prob.jpg

    achja und noch der betreffende Quellcode:
    PHP-Code:
    function blockfile($title$blockfile$side 0)  // falls der Block auf eine Blockdatei aufbaut ;)
    {

        
    $file = @file("block/$blockfile");
        if(!
    $file)
        {
            
    $content _blocknot;        // Wenn was schiefläuft ( Date nicht da, etc. dann einfach nen Fehler ausspucken)
        
    }
        else
        {
            include 
    "block/$blockfile"// wenn keiner Fehler passiert, die Datei inkludieren
        


    PHP-Code:
    block_login:
    <?php
    global $db$prefix$user;
    $dc $db;

    $gäste             $db -> num_rows($db -> query("select * from "$prefix ."_online where `gast` = '1'"));
    $member            $db -> num_rows($db -> query("select * from "$prefix ."_online where `gast` = '0'"));
    $gesamt             $member $gäste;
    $db $dc;
    $content            "<center>"_on .""$gäste ."" ._guest .""$member .""_member ."";


    if(!
    is_user($user)){
    $content        .= "<br><br>"_anonym ."</center>";
    }

    ?>
    Das müsste nach meinem Menschenverstand doch eigentlich funktionieren oder nicht?

    Aso ja und nach der Funktion bricht er auch ab:
    block_link, das ist ne Funktion, ähnlich nem Template Parser, die wird in die Renderblock funktion geschalten und durchsucht den Block noch nach links, bevor er endgütlig gerendert wird, hier kommen 2 SQL Queries zum Einsatz und es geht auch nicht ohne dieses Work-Around .

    nen bisschen zusammeklabaustert aus nem anderen Thread , woran könnte das liegen?

  • #2
    du überschreibst dir dein objekt $db!

    sowas geht ja auch nicht:
    PHP-Code:
    <?php
    $db
    ->query();

    while (
    $db->next_record())
    {
       
    $db->query();
    }
    ?>
    da du das verfahren nicht genau beschreibst, kann ich dir aber leider auch nicht mehr sagen... aber einfach mal ein neues DB-Objekt erzeugen!

    gruss

    Kommentar


    • #3
      Moinsen,

      hier ist mal nen auszug aus dem Code:
      PHP-Code:
      function block_link($content$active false)
      {
          if(
      $active == true){
              global 
      $db$prefix;
              
      preg_match_all("/{(.*?)}/"$content$content_files); 
              for(
      $i=0$i count($content_files[1]); $i++)
              {
                  
      $ident            =     strtolower($content_files[1][$i]);
                  
      $ident            =     explode("."$ident);
                  
      $sql            =     "select cid, name from "$prefix ."_content_cat where `name` = '"$ident[0]."'";
                  
      $menue          =    $db -> fetch_array($db -> query($sql));
                  
      $sql            =     "select id, title, name from "$prefix ."_content where `name` = '"$ident[1]."'";
                  
      $topic            =     $db -> fetch_array($db -> query($sql));

              }
      $dc $db;
      }
      return 
      $content;

      So sieht es aus .

      Die Blockfunktion:
      PHP-Code:
      $db         -> query($sql);
      while(
      $result     $db -> fetch_array())

      so wird es dann ausgelesen und an die renderfunktion überwiesen, welche es dann an die block_link funktion weitergibt.

      Es muss doch aber auch ohne das neue instanziieren des Datenbankobjektes gehen oder nicht?
      Er müsste doch eigentlich Link ID's übergeben.

      Also ich sehe es ja als Hauptproblem, das ich die Blöcke auslese, diese anschliessend untersuchen lasse ob die Variable "file" gesetzt ist, wenn ja soll die File ausgelesen werden wenn nicht, dann wird es an die Renderblock funktion geschickt und dort an die block_link Funktion weitergeleitet wird .... dabei wird ja immer das gleiche Objekt verwendet, eigentlich müsste es aber trotzdem klappen.

      Man kann es sich ja so vorstellen das mit dem:
      Query1 -->
      |
      -> Unterquery( der mit der gleichen Id läuft ) und dann den Hauptquery damit "unterbricht", bzw. die Whileschleife unterbricht ( da wird das Hauptproblem liegen, da er ja die Blöcke dann nciht mehr anzeigt .... )

      Kommentar


      • #4
        kein global $db verwenden!

        ansonsten nicht, durch global machst du es möglich, dass das Objekt überschrieben wird!

        gruss

        Kommentar


        • #5
          Original geschrieben von MoRtAlAn
          kein global $db verwenden!

          ansonsten nicht, durch global machst du es möglich, dass das Objekt überschrieben wird!

          gruss
          aber es klappt doch in den ganzen anderen Funktionen die ich im CMS verwenden?

          Wenn ich kein Global DB Verwenden kann ich ja dann auch gar nicht mehr die Queries zusammenzählen .

          und warum konnte ich den Fehler mit
          $dc = $db;
          und am Ende
          $db = $dc;

          beheben und musste sonst nichts weiter hinschreiben?

          EDIT: Jetzt mal im PhPNuke nachgeguckt, da haben sie das auch so gemacht( Also mit dem Global $db; )
          Zuletzt geändert von Muffin; 19.05.2004, 14:46.

          Kommentar


          • #6
            Wenn ich kein Global DB Verwenden kann ich ja dann auch gar nicht mehr die Queries zusammenzählen .
            obwohl ich den zusammenhang auch nicht seh. übergib ne/n zeiger/reference auf die $db (&), zb. im konstruktor der class.
            EDIT: Jetzt mal im PhPNuke nachgeguckt, da haben sie das auch so gemacht( Also mit dem Global $db; )
            naja, das heißt ja nix bzw. nicht das, was du damit ausdrücken willst
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              Moin,
              gerade nochma nachgedacht,
              dann kam ich zu der Idee, dass ich ja durch die Zuweisung von

              $dc = $db alle Werte von $db nach $dc konserviere und diese nach den Queries ja wieder an $db übergebe, womit $db dann keine Daten verloren hätte und wieder auf dem alten Stand wäre. Dummweise ist damit das Problem noch nicht gelöst.

              Habe auch schon versucht die Klasse neu zu starten, dann meinte er aber das das nicht zweimal gehen würde .

              Kommentar


              • #8
                Original geschrieben von derHund
                zeiger/reference auf die $db (&),
                Das ich darauf nicht selber kam :wall:

                thx .

                Aber was war eigentlich an meiner Erklärung unverständlich?

                Kommentar

                Lädt...
                X