adodb und 800 sql abfragen

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

  • adodb und 800 sql abfragen

    hallo,

    ich habe ein sehr seltsames problem,
    bei meinem script habe ich laut aussage über 800 abfragen gehabt, was aber nicht möglich ist. ich setzte adodb mit dem mysqlt driver ein.

    ach ja es werden wirklich über 800 querys ausgefürt, bei phpmyadmin konnte ich es sehen, mysql neu gestartet, 1 mal script gestartet, und dann stand da bei abfragestatistik, insgesamt ca 800.

    ich habe beim mysql driver folgende function editirt:
    PHP-Code:
    function _query($sql,$inputarr)
        {
            
    $GLOBALS['sql_anzahl']++;
            
    zeit_messen('sql_zeit');
            
    $query mysql_query($sql,$this->_connectionID);
            
    zeit_messen('sql_zeit');
            return 
    $query;
        } 
    dadurch zähle ich die ausgeführten sql querys und die benötigte zeit.

    ich habe herausgefunden das folgende für schliffe die 800 querys macht, ich weiss aber nicht warum, adodb macht da irgend einen grossen fehler oder so, der code ist gegenüber dem original gekürtzt auf die wichtigsten stellen:
    PHP-Code:
     
    $sql 
    "SELECT * FROM gebaeude ORDER BY `art`";
    $row =  $db->Execute($sql);
        
    for (; !
    $row->EOF$row->MoveNext())
    {
        
    $gebaeude spliti("[,]"$row->fields["g_voraussetzung"]);
        for(
    $g 0$g count($gebaeude_voraussetzung); $g++)
        {
            if(
    $gebaeude_voraussetzung[$g] >= $gebaeude[$g]){ $k++; }
        }

        
    $forschung spliti("[,]"$row->fields["f_voraussetzung"]);
        for(
    $h 0$h count($forschungs_voraussetzung); $h++)
        {
            if(
    $forschungs_voraussetzung[$h] >= $forschung[$h]){ $l++; }
        }
        
    // anzahl der bereits gebauter gebäude holen
        
    $sql "SELECT anzahl FROM stadt_gebaeude WHERE stadt_id = '".$_SESSION['user']['hs_id']."' 
    AND gebaeude_id = '"
    .$row->fields['id']."'";
        
    $row_anzahl =  $db->Execute($sql);
        
    $geb_anzahl $row_anzahl->fields["anzahl"];


        
    $tmp_eisen = ($row->fields["eisen"] * pow($row->fields["kostensteigerung"], $geb_anzahl));
        
    $tmp_beton = ($row->fields["beton"] * pow($row->fields["kostensteigerung"], $geb_anzahl));
        
    $tmp_kapital = ($row->fields["baukosten"] * pow($row->fields["kostensteigerung"], $geb_anzahl));


                
        
    $sql "SELECT stadt_gebaeude.anzahl FROM stadt_gebaeude, user WHERE user.id = '".$_SESSION['user']['id']."' 
    AND stadt_gebaeude.gebaeude_id = '"
    .$row->fields['id']."' AND stadt_gebaeude.stadt_id = user.hs_id";
        
    $row_max $db->Execute($sql);
        
        if(
    $row_max->fields["anzahl"] >= && $_SESSION['user']["hauptstadt"] == $_SESSION['user']["hs_id"])
        {
            
    $rad_baubar " ";
            
    $txt_baubar "(Nur 1x in der Hauptstadt baubar)";
        } elseif(
    $_SESSION['user']["hauptstadt"] == $_SESSION['user']["hs_id"])
        {
            
    $rad_baubar "<INPUT TYPE=\"RADIO\" NAME=\"rd_bau\" VALUE=\"".$row->fields["id"]."\">";
            
    $txt_baubar "(Nur 1x in der Hauptstadt baubar)";
        }
                

        
    // anzahl der gebäude und forschungen holen, nicht stadt, sondern global
        
    $row_tmp_gebaeude $db->Execute("SELECT count(*) as num FROM gebaeude");
        
    $gebaeude_anzahl $row_tmp_gebaeude->fields['num'];

        
    $row_tmp_forschung $db->Execute("SELECT count(*) as num FROM forschung");
        
    $forschunganzahl_anzahl $row_tmp_forschung->fields['num'];
        

    mfg Roland
    Onlie Browsergame: http://www.war-of-empire.de <-- 2. Weltkrieg

  • #2
    schwer zu sagen, ohne die anwendung (genauer - die db architektur und die anzahl der datensätze) zu kennen. funktioniert denn das skript so, wie es soll?

    was passiert sein kann - die bedingung !$row->EOF in der äußeren for-schleife wird durch abfragen im schleifeninneren beeinflußt.

    empfehlenswert bei solchen problemen ist natürlich ein ausführliches loggen, vor allem all dessen, was an die db geschickt wird.

    Kommentar


    • #3
      danke für den tipp, das problem ist mein eigener error handler.

      kleine frage:
      ich habe einen kleinen error handler gebaut der die fehlermeldungen in die db schreibt. wie kann ich es anstellen, das wenn schon ein eintrag des fehlers existiert, das er das dann nicht einträgt. ich wollte das mit vergleichen und mit dem hashen (md5, hash von zeile, fehlernummer, scriptpfad....) porbieren es hat aber nicht geklapt, hat jemand eine idee?

      mfg Roland
      Onlie Browsergame: http://www.war-of-empire.de <-- 2. Weltkrieg

      Kommentar


      • #4
        kommt drauf an, wie du die fehler speicherst.

        Kommentar


        • #5
          ich speichere die daten in eine mysql tabelle, ich wollte mit einem hash schauen ob es schon einen gleichwertigen eintrag hat, der hash wird aber immer anders.

          die php function:
          PHP-Code:
          function woeErrorHandler($errno$errmsg$filename$linenum)
          {
                 
          // timestamp for the error entry
                 
          $dt date("Y-m-d H:i:s (T)");

                 
          // define an assoc array of error string
                 // in reality the only entries we should
                 // consider are E_WARNING, E_NOTICE, E_USER_ERROR,
                 // E_USER_WARNING and E_USER_NOTICE
                 
          $errortype = array (
                         
          E_ERROR          => "Error",
                         
          E_WARNING        => "Warning",
                         
          E_PARSE          => "Parsing Error",
                         
          E_NOTICE          => "Notice",
                         
          E_CORE_ERROR      => "Core Error",
                         
          E_CORE_WARNING    => "Core Warning",
                         
          E_COMPILE_ERROR  => "Compile Error",
                         
          E_COMPILE_WARNING => "Compile Warning",
                         
          E_USER_ERROR      => "User Error",
                         
          E_USER_WARNING    => "User Warning",
                         
          E_USER_NOTICE    => "User Notice",
                         
          E_STRICT          => "Runtime Notice"
                         
          );

                if(
          $errno == 2048) return;

              
          $db =& $GLOBALS['ADODB_SESS_CONN'];

              
          $hash md5($errno.'*'.$errmsg.'*'.$filename.'*'.$linenum);

              
          $sql_sel "SELECT count(*) as count FROM `error_log` WHERE `hash` = '".$hash."'";

              if(isset(
          $db))
                {
                    
          $row =& $db->Execute($sql_sel);

                } else
                {
                    
          mysql_connect($GLOBALS['ADODB_SESSION_CONNECT'], 
          $GLOBALS['ADODB_SESSION_USER'], $GLOBALS['ADODB_SESSION_PWD']);
                    
          mysql_select_db($GLOBALS['ADODB_SESSION_DB']);
                    
          mysql_query($sql);
                }

              if(
          $row->fields['count'] == 0)
              {
                  
          $sql "INSERT INTO error_log (datetime, errornum, 
          errortype, errormsg, scriptname, scriptline, hash) VALUES ('"
          .$dt."', 
          '"
          .$errno."', '".$errortype[$errno]."', '".woeCleanForDB($errmsg)."', 
          '"
          .$filename."', '".$linenum."', '".$hash."')";

                    if(isset(
          $db))
                    {
                        
          $db->Execute($sql);
                    } else
                    {
                        
          mysql_connect($GLOBALS['ADODB_SESSION_CONNECT'], $GLOBALS['ADODB_SESSION_USER'], 
          $GLOBALS['ADODB_SESSION_PWD']);
                        
          mysql_select_db($GLOBALS['ADODB_SESSION_DB']);
                        
          mysql_query($sql);
                    }
                }

                 if (
          $errno == E_USER_ERROR) {
                  print(
          "Es ist ein Schwerer Fehler aufgetreten, 
          und das script wurde gestoppt, der fehler wurde gelogt. 
          Wir werden uns so schnell wie möglich darum kümmern."
          );exit;
                 }

          mysql tabelle:
          CREATE TABLE `error_log` (
          `id` int(11) NOT NULL auto_increment,
          `datetime` varchar(20) collate utf8_bin NOT NULL default '',
          `errornum` tinyint(6) NOT NULL default '0',
          `errortype` varchar(50) collate utf8_bin NOT NULL default '',
          `errormsg` text collate utf8_bin NOT NULL,
          `scriptname` text collate utf8_bin NOT NULL,
          `scriptline` tinyint(6) NOT NULL default '0',
          `hash` varchar(32) collate utf8_bin NOT NULL default '',
          KEY `id` (`id`)
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
          Zuletzt geändert von Rolandbar; 15.04.2006, 14:36.
          Onlie Browsergame: http://www.war-of-empire.de <-- 2. Weltkrieg

          Kommentar


          • #6
            und warum solls mit dem hash nicht funktionieren?

            Kommentar


            • #7
              der hash ist immer anders, keien ahnung wiso.

              INSERT INTO `error_log` (`id`, `datetime`, `errornum`, `errortype`, `errormsg`, `scriptname`, `scriptline`, `hash`)
              VALUES (10, '2006-04-15 11:14:41', 8, 'Notice', 'Undefined offset: 129', 'C:\\Dokumente und Einstellungen\\Administrator\\Eigene Dateien\\xampp-win32-1.4.16\\xampp\\htdocs\\woe_1.5\\modules\\bauen\\user.php', 100, '2ac7f98bbb4763f9b78bae72c40bc0d1');
              INSERT INTO `error_log` (`id`, `datetime`, `errornum`, `errortype`, `errormsg`, `scriptname`, `scriptline`, `hash`)
              VALUES (11, '2006-04-15 11:14:41', 8, 'Notice', 'Undefined offset: 130', 'C:\\Dokumente und Einstellungen\\Administrator\\Eigene Dateien\\xampp-win32-1.4.16\\xampp\\htdocs\\woe_1.5\\modules\\bauen\\user.php', 100, 'de0d27f80f6a20485b8e158896fee603');

              *Edit*
              ok, ich habe bemerkt, das immer etwas kleines anders ist. hat sich wohl erledigt
              Zuletzt geändert von Rolandbar; 15.04.2006, 14:41.
              Onlie Browsergame: http://www.war-of-empire.de <-- 2. Weltkrieg

              Kommentar


              • #8

                du hast doch offensichtlich unterschiedliche 'errormsg' in den beiden einträgen - natürlich ergibt das unterschiedliche hashes!

                Kommentar

                Lädt...
                X