kostenloser Webspace werbefrei: lima-city


Code einsparen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    mark084

    mark084 hat kostenlosen Webspace.

    Hallo werte tag/re">ref="/tag/code">Coder!

    Ich habe mir einen php-Code zurecht geschrieben der folgendes macht:
    Er zählt zu Beginn die Anzahl der Einträge in meiner Datenbank.
    Dann zählt er wieviele Leute welchen Wochentag gewählt haben und berechnet zum Schluß die Prozent der gewählten Wochentage.

    Funktioniert mit dem folgenden Code hervorragend und ohne Probleme.

    Wenn man jetzt noch mehr Abfragen macht und alle so ähnlich sind wird die Menge des Codes ziemlich unübersichtlich und groß.

    Frage: Kann ich auf irgendeine Art und Weise bei folgendem Vorgang Variablen bzw. Code einsparen?

    //Wochentage Prozentzaehlung
    	$abfanz = "SELECT * FROM anmeldung";
    	$erganz = mysql_query($abfanz);
    	$anzahl = mysql_num_rows($erganz);
    	
    	$abfmo = mysql_query("SELECT SUM(mo) AS summe FROM anmeldung");
    	$abfdi = mysql_query("SELECT SUM(di) AS summe FROM anmeldung");
    	$abfmi = mysql_query("SELECT SUM(mi) AS summe FROM anmeldung");
    	$abfdo = mysql_query("SELECT SUM(do) AS summe FROM anmeldung");
    	$abffr = mysql_query("SELECT SUM(fr) AS summe FROM anmeldung");
    	$abfsa = mysql_query("SELECT SUM(sa) AS summe FROM anmeldung");
    	$abfso = mysql_query("SELECT SUM(so) AS summe FROM anmeldung");
    	
    	$resmo = mysql_fetch_array($abfmo);
    	$resdi = mysql_fetch_array($abfdi);
    	$resmi = mysql_fetch_array($abfmi);
    	$resdo = mysql_fetch_array($abfdo);
    	$resfr = mysql_fetch_array($abffr);
    	$ressa = mysql_fetch_array($abfsa);
    	$resso = mysql_fetch_array($abfso);
    	
    	$zalmo = $resmo["summe"];
    	$zaldi = $resdi["summe"];
    	$zalmi = $resmi["summe"];
    	$zaldo = $resdo["summe"];
    	$zalfr = $resfr["summe"];
    	$zalsa = $ressa["summe"];
    	$zalso = $resso["summe"];
    	
    	$promo = ($zalmo / $anzahl) * 100;
    	$prodi = ($zaldi / $anzahl) * 100;
    	$promi = ($zalmi / $anzahl) * 100;
    	$prodo = ($zaldo / $anzahl) * 100;
    	$profr = ($zalfr / $anzahl) * 100;
    	$prosa = ($zalsa / $anzahl) * 100;
    	$proso = ($zalso / $anzahl) * 100;


    Ich wäre euch furchtbar Dankbar für Eure Hilfe.

    lg
    Markus
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du solltest dir mal Prepared Statements und Stored Procedures anschauen.

    Auch solltest du den Umgang mit Arrays und Schleifen üben.

    Ich hoffe das war hilfreich für dich.
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ener schrieb:
    Ich hoffe das war hilfreich für dich.
    Das wird für ihn hilfreicher sein:
     	//Wochentage Prozentzaehlung
    	$abfanz = "SELECT COUNT(*) AS count FROM anmeldung";
    	$erganz = mysql_query($abfanz);
    	$anzahl = mysql_fetch_object($erganz)->count;
    
    	$days = array('mo', 'di', 'mi', 'do', 'fr', 'sa', 'so');
    	$percents = array();
    
    	for($i = 0; $i < count($days); $i++) {
    		$query = mysql_query("SELECT SUM({$days[$i]}) AS summe FROM anmeldung");
    		$ammount = mysql_fetch_object($query)->summe;
    		$percents[$days[$i]] = ($ammount / $anzahl) * 100;
    	}
    
    	echo("Montag: {$percents['mo']}\n");
    	echo("Dienstag: {$percents['di']}\n");
    	echo("Mittwoch: {$percents['mi']}\n");
    	echo("Donnerstag: {$percents['do']}\n");
    	echo("Freitag: {$percents['fr']}\n");
    	echo("Samstag: {$percents['sa']}\n");
    	echo("Sonntag: {$percents['so']}\n");

  5. Naja ich bin immer der Meinung, man sollte erst mal Ideen bringen und den "Schüler" zum nachdenken anregen. Er kann ja nachfragen wenn es nicht hilfreich ist. Aber gleich eine Lösung hinschreiben. Hm - langweilig. :wink:
  6. Autor dieses Themas

    mark084

    mark084 hat kostenlosen Webspace.

    Ich danke euch für die prompte Antwort!

    @hackyourlife: Danke für den Code.

    @ener: Ich werde natürlich dem Rat des Lehrers folgen und den Code nicht blind übernehmen sondern unter Recherche zerpflücken. Den natürlich bin ich schon über die Optionen mit Schleife zu arbeiten gestolpert, doch habe ich immer wieder versagt.
  7. t*****b

    mark084 schrieb:
    @ener: Ich werde natürlich dem Rat des Lehrers folgen und den Code nicht blind übernehmen sondern unter Recherche zerpflücken. Den natürlich bin ich schon über die Optionen mit Schleife zu arbeiten gestolpert, doch habe ich immer wieder versagt.


    Eine Schleife ist da ja auch Unsinn. Mach doch einfach möglichst viel über SQL:

    $abf = mysql_query("SELECT COUNT(*) AS anzahl, SUM(mo) AS abfmo, SUM(di) AS abfdi, SUM(mi) AS abfmi, SUM(do) AS abfdo, SUM(fr) AS abffr, SUM(sa) AS abfsa, SUM(so) AS abfso FROM anmeldung");
    $anzahl = $res["anzahl"];
    $res = mysql_fetch_assoc($sql);
    $zalmo = $res["abfmo"];
    $zaldi = $res["abfdi"];
    $zalmi = $res["abfmi"];
    $zaldo = $res["abfdo"];
    $zalfr = $res["abffr"];
    $zalsa = $res["abfsa"];
    $zalso = $res["abfso"];
    
    	
    $promo = ($zalmo / $anzahl) * 100;
    $prodi = ($zaldi / $anzahl) * 100;
    $promi = ($zalmi / $anzahl) * 100;
    $prodo = ($zaldo / $anzahl) * 100;
    $profr = ($zalfr / $anzahl) * 100;
    $prosa = ($zalsa / $anzahl) * 100;
    $proso = ($zalso / $anzahl) * 100;
    	
    ?>
  8. Dann sagt uns doch mal, wieso das Array $days, die Schleife darüber und das Array $percents im Code von hackyourlife Unsinn ist.
  9. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    trueweb schrieb:
    Eine Schleife ist da ja auch Unsinn. Mach doch einfach möglichst viel über SQL:


    Au ja, das SQL-Statement:
    SELECT
    	AVG( `mo` ) *100 AS `mo`,
    	AVG( `di` ) *100 AS `di`,
    	AVG( `mi` ) *100 AS `mi`,
    	AVG( `do` ) *100 AS `do`,
    	AVG( `fr` ) *100 AS `fr`,
    	AVG( `sa` ) *100 AS `sa`,
    	AVG( `so` ) *100 AS `so` 
    FROM
    	anmeldung
    Handbuchseite zu AVG

    Der PHP-Code würde dann so aussehen:

    $sql = "SELECT AVG( `mo` ) *100 AS `mo` , AVG( `di` ) *100 AS `di` , AVG( `mi` ) *100 AS `mi` , AVG( `do` ) *100 AS `do` , AVG( `fr` ) *100 AS `fr` , AVG( `sa` ) *100 AS `sa` , AVG( `so` ) *100 AS `so`  FROM anmeldung";
    $abf = mysql_query($sql);
    $erg = mysql_fetch_array($abf, MYSQL_ASSOC);
    $promo = $erg["mo"];
    $prodi = $erg["di"];
    $promi = $erg["mi"];
    $prodo = $erg["do"];
    $profr = $erg["fr"];
    $prosa = $erg["sa"];
    $proso = $erg["so"];
    
    // alternativ: (Lieber die Version vom hackyoulife ^^⁾
    $proz = array();
    foreach($erg AS $tag => $val) {
    	$proz[$tag] = $val;
    }
    // Version von Hackyoulife (post weiter unten):
    $proz = $erg;



    Beitrag zuletzt geändert: 8.2.2012 20:38:44 von thomasba
  10. t*****b

    ener schrieb:
    Dann sagt uns doch mal, wieso das Array $days, die Schleife darüber und das Array $percents im Code von hackyourlife Unsinn ist.


    Der Code von hackyourlife macht zu viele SQL-Abfragen und zwar 8 Stück, einmal für die Gesamtanzahl der Einträge und anschließend in der Schleife für jeden weiteren Wochentag einen. Mein Code macht nur eine einzige Abfrage. Umso weniger Abfragen für die Datenbank, umso besser ist derren Auslastung und die Performance des Scriptes. Außerdem halte ich es für unsinnig, für eine feste Anzahl an Variablen (7 Stück, für jeden Wochentag eine) einen Array zu verwenden. Arrays machen erst bei unüberschaubaren oder ungewissen Menge an Variablen Sinn. Hier sind es sieben und es werden auch für alle Ewigkeiten sieben Wochentage bleiben.

    Wenn ihrs aber ganz kurz wollt, dann hab ich was für euch:

    $abf = mysql_query("SELECT COUNT(*) AS anzahl, SUM(mo) AS abfmo, SUM(di) AS abfdi, SUM(mi) AS abfmi, SUM(do) AS abfdo, SUM(fr) AS abffr, SUM(sa) AS abfsa, SUM(so) AS abfso FROM anmeldung");
    $anzahl = $res["anzahl"];
    $res = mysql_fetch_assoc($sql);
    
    $wochentage = array('mo', 'di', 'mi', 'do', 'fr', 'sa', 'so');
    foreach($wochentage AS $tag) {
    	$var= "pro".$tag;
    	$$var= $res["abf".$tag] / $res["anzahl"] * 100;
    }
    
    echo "Montag: ".$promo."<br />";
    echo "Dienstag: ".$prodi."<br />";
    echo "Mittwoch: ".$promi."<br />";
    echo "Donnerstag: ".$prodo."<br />";
    echo "Freitag: ".$profr."<br />";
    echo "Samstag: ".$prosa."<br />";
    echo "Sonntag: ".$proso."<br />";


    Beitrag zuletzt geändert: 8.2.2012 20:15:27 von trueweb
  11. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    thomasba schrieb:
    // alternativ:
    $proz = array();
    foreach($erg AS $tag => $val) {
    	$proz[$tag] = $val;
    }

    Das kannst du dir gleich sparen und durch folgende Zeile ersetzen, die genau das gleiche macht:
    $proz = $erg;


    Das assoziative Array ist mM nach besser als ein Haufen einzelner Variablen. Das Array kann auch in Schleifen/... benutzt werden; ansonsten müsstest du für die einzelnen Variablen wieder so ein Pfuschprogramm schreiben wie im Eröffnungspost (@trueweb: auch wenn es nur 7 Variablen sind).
    Stell dir mal vor du möchtest die Prozentwerte einer Funktion übergeben und nutzt 7 einzelne Variablen...
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!