php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.03.2011, 18:06  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ein konkretes Beispiel wäre glaube ich sinnvoll. Darauf zielte meine letzte Frage eigentlich ab.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.03.2011, 20:01  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Anwendungsbereich wäre sowas:

(Hier ist vorallem Schnelligkeit notwendig, sonst hält ein Daemon z.B. alles auf (START TRANSACTION & COMMIT))
PHP-Code:
                $query1 "     INSERT INTO bg_haufen_truppen (haufen_id,truppen_id,anzahl)
                                                SELECT a.haufen_id,a.truppen_id,a.anzahl
                                                FROM (
                                                        SELECT a.haufen_id,a.truppen_id,COUNT(*) AS anzahl
                                                        FROM bg_truppen_auftrag AS a
                                                        WHERE a.stop_time < "
.$time."
                                                        GROUP BY a.haufen_id,a.truppen_id
                                                ) AS a
                                        ON DUPLICATE KEY UPDATE
                                        bg_haufen_truppen.anzahl = bg_haufen_truppen.anzahl + a.anzahl"
;
                
// Fertig gebaute Truppen entfernen
                
$query2 "     DELETE FROM bg_truppen_auftrag WHERE bg_truppen_auftrag.stop_time < ".$time;
                
$this->sql->query("START TRANSACTION");
                
$this->sql->query($query1);
                
$this->sql->query($query2);
                
$this->sql->query("COMMIT"); 
d.h. dann wird daraus
PHP-Code:
                $this->sql->multi_query("START TRANSACTION; $query1; $query2; COMMIT;"); 
aber auch SELECT's:

PHP-Code:
$this->sql->multi_query("SELECT * FROM `bg_gebaude` AS g ORDER BY id;".
                        
"SELECT a.haufen_id,a.forsch_id,a.anzahl
                                                FROM (
                                                        SELECT a.haufen_id,a.forsch_id,COUNT(*) AS anzahl
                                                        FROM bg_forschungen_auftrag AS a
                                                        WHERE a.stop_time < "
.$time."
                                                        GROUP BY a.haufen_id,a.forsch_id
                                                ) AS a;
"
); 
Einfach um es schneller zu machen, eigener Erfahrung gemäß, weiß ich, dass multi_query() viel schneller ist… Aber die Schleife und das manuelle freigeben haben mich gestört, deswegen habe ich hier diese Klasse gemacht… Hoffe ich habe es euch jetzt einigermaßen verständlich gemacht?


EDIT: p.s.: Und ich kann nicht abwarten bis zur nächsten Queryansammlung, das muss sofort gehen, weil da einige (Sub-)Query's etwas SELECTen, was vorher geUPDATEd wurde…

Geändert von bwoebi (15.03.2011 um 20:08 Uhr).
bwoebi ist offline   Mit Zitat antworten
Alt 15.03.2011, 20:56  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Je nach Programmlogik würde ich in deinem Fall einen Container schaffen der deine Queries sammelt ( Sinn und Zweck, zugriffsfähigkeit deiner Connection, sollte deine Programmlogik innerhalb der Query-Zusammenstellung bspw. Sub-Queries ausführen wollten kann es dies in einem bestehenden multi-query-set in der selben MySQLi-Instanz nicht, siehe User-Comments zu multi_query ) und ausführt.

Deine For-Schleifen ansich sind auch nicht so das wahre, meiner Meinung nach. Code-technisch stell ich mir das so vor:

PHP-Code:
class multiQuery {

   private 
$_sql;
   public function 
__construct(mysqli &$_sql) {
      
$this->_sql = &$_sql;
   }

   private 
$_queries=array();

   public function 
withCollection(array $queries) {
      
$this->_queries = array(); // drop all queries
      
foreach ( $queries as $query ) {
         
$this->_queries[] = $query;
      }

      return 
$this;
   }

   public function 
withQuery($query) {
      
$this->_queries[] = $query;
      return 
$this;
   }

   private 
$_results=array();

   public function 
asResultArray() {
      
$query join(";"$this->_queries);
      
$resultset $this->_sql->multi_query($query);
      if ( 
$resultset ) {
         do {
            
$result $this->_sql->store_result() ) {
            if ( 
is_object($result) ) $this->_results[] = clone $result;
            else 
$this->_results[] = $result;
            
$result->free();
         } while ( 
$this->_sql->next_result() );
      } else {
         return array();
      }
      return 
$this->_results;
   }

   public function 
asCollection() {
     
$query join(";"$this->_queries);
     
$resultset $this->_sql->multi_query($query);
     if ( 
$resultset ) {
        do {
           
$result $this->_sql->store_result();
           if ( 
is_object($result) ) $this->_results[] = clone $result;
           else 
$this->_results[] = $result;
           
$result->free();
        } while ( 
$this->_sql->next_result() );
     }
     return 
$this;
   }

   public function 
getQueryCount() {
      return 
count($this->_queries);
   }

   public function 
getResultCount() {
      return 
count($this->_results);
   }

   public function 
getResult($id) {
     
$id = (integer)$id;
     if ( 
array_key_exists($id$this->_results) ) return $this->_results[$id];
     else return 
false;
   }

   public function 
getQuery($id) {
     
$id = (integer)$id;
     if ( 
array_key_exists($id$this->_queries) ) return $this->_queries[$id];
     else return 
false;
   }

   public static function 
onDevice(mysqli &$sql) {
      return new 
multiQueryCollector($sql);
   }


usage:

PHP-Code:
// multiQuery in the short CI-way, give all results back
$db = new mysqli("localhost","iam""mypw""thisdb");

$resultsets multiQuery::onDevice($db)->withCollection(array(
   
"UPDATE this SET that='0' WHERE bla=0",
   
"UPDATE this SET that='0' WHERE bla=1",
   
"UPDATE this SET that='0' WHERE bla=2",
   
"UPDATE this SET that='0' WHERE bla=3",
   
"UPDATE this SET that='0' WHERE bla=4",
   
"UPDATE this SET that='0' WHERE bla=5"
))->asArray();

// multiQuery in the standard way
$db = new mysqli("localhost""iam""mypw""thisdb");

$mq = new multiQuery($db);
$mq->withCollection(array(
   
"UPDATE this SET that='0' WHERE bla=0",
   
"UPDATE this SET that='0' WHERE bla=1",
   
"UPDATE this SET that='0' WHERE bla=2",
   
"UPDATE this SET that='0' WHERE bla=3",
   
"UPDATE this SET that='0' WHERE bla=4",
   
"UPDATE this SET that='0' WHERE bla=5"
));

$mq->asCollection();

// example for "get the third resultset of all queries"... ( aka index #2 )
$thirdResultset $mq->getResult(2); 
Der Query-Set / Query-Result status innerhalb des mysqli-objects bleibt immer der gleiche, du kannst dieses also locker für normale queries weiternutzen ohne jedesmal etwaige result-sets freizugeben. Die Result-Objekte der eigentlichen multi-queries sind clones, bleiben also nach dem free-ing erhalten bis du das array zerstörst.

Sollte sich hier der ein oder andere Fehler eingeschlichen haben, entschuldige, ich hab das hier im Forum-Editor ohne SH zusammengefummelt.

So würde ich das zumindest realisieren wollen für deinen Fall ( fehler-behandlung hab ich hier mal außen vor gelassen.. ).
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (15.03.2011 um 21:06 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 15.03.2011, 21:44  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

klingt ja mal gar nicht so schlecht, würde nur noch gerne wissen wollen wie viel RAM das hier mehr braucht und wie viel Zeit…

Finde ich elegant gelöst und wenn es nicht viel mehr RAM/Zeit braucht, denke ich probiere ich deines mal aus. Danke
bwoebi ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysqli update, mysqli multi_query transaction, mysqli multi query, multi_query commit, mysqli multi query examples, php mysqli >multi_query, mysqli begin, php mysqli 2 results, multi_query insert free, php mysqli start transaction, php multi_query transaction problem, multi_query sinnvoll, php start transaction, mysqli transaction, mysqli update set, \mysqli\ insert into select, php transaction mysqli start, multi_query free(), mysqli on duplicate key, begin transaction mysqli php

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:30 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum