Ostatní témata (Off Topic témata) : phpRS Fórum
Máte problém s konfigurací počítače? Hledáte nejlepší webhosting pro vaši aplikaci? Nevíte si rady s nějakým zajímavým programátorským oříškem? Týká se dotaz fóra? ... Pokud ano, tak je toto diskuzní fórum určeno právě vám.
phpRS - redakční a informační systém
Jak psát "lepší" PHP kód
Zaslán uživatelem/kou: MirekS (IP adresa zaznamenána)
Datum: 2011-09-09, 21:29

1. nepoužívejte funkci mysql_result -> phprs_sql_result
zapomeňte na to, že existuje, je jen velmi málo případů, kdy je efektivnější použít tuto funkci
cituji z nápovědy:
Pokud pracujete s velkými záznamy, měli byste uvážit použití jedné z funkcí, které vrací úplně celý záznam (všechny sloupce specifikované v dotazu SELECT najednou), protože tyto funkce vrací celý výsledek v jednom volání funkce a jsou proto MNOHEM rychlejší než mysql_result(). Dále je nutné podotknout, že jako argument sloupce je mnohem rychlejší uvést číselný identifikátor než jméno sloupce či zápis tabulka.sloupec.

Volání funkce mysql_result() by nemělo být mícháno s voláním jiných funkcí, protože by došlo k dělení záznamů z výsledku.

Doporučené mnohem výkonější alternativy: mysql_fetch_row(), mysql_fetch_array() a mysql_fetch_object().
A já bych doporučil používat mysql_fetch_assoc -> phprs_sql_fetch_assoc
A neexistuje v mysqli rozhraní !!!



2. záznamy z db načítejte pomocí while cyklu a nikoliv for
toto vypadá rozhodně čitelněji a efektivněji:
if ($result = phprs_sql_query($sql)) {
while ($row = phprs_sql_fetch_assoc($result)) {
...
}
} else {
echo "CHYBA";
}

než tohle:
$result = mysql_query($sql);
$pocet = mysql_num_rows($result);
if ($pocet == 0) {
echo "CHYBA";
} else {
for ($pom = 0; $pom < $pocet; $pom++) {
$row = phprs_sql_fetch_assoc($result);
...
}
}



3.pole procházejte pomocí foreach a né for nebo while
tedy takto (nepotřebujete-li $key, stačí $array as $value) přehledněji:
foreach ($arr as $key => $value) {
echo "Klíč: $key; Hodnota: $value<br>\n";
}
cituji z nápovědy:
Poznámka: Když foreach začne provádění první iterace, je vnitřní ukazatel automaticky nastaven na první element pole. To znamená, že před foreach nemusíte volat reset().

takže tohle jsou horší způsoby (a jsou ojedinělé případy, kdy procházení pomocí each má význam, ale ten for cyklus považuji za nejhorší možnou variantu a je zcela nepoužitelný, pokud klíče pole nejdou za sebou):
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Klíč: $key; Hodnota: $value<br>\n";
}

nebo
$pocet=count($arr);
for ($pom = 0; $pom < $pocet; $pom++) {
echo "Klíč: $pom ; Hodnota: $arr[$pom]<br>\n";
}



4. Využívejte vhodně rozdílu textu v uvozovkách a apostrofech

tohle je dost nepřehledný, díky neustálému escapování každé uvozovky:
echo "<table cellspacing=\"0\" cellpadding=\"5\" border=\"0\" align=\"center\" class=\"ramsedy-vypln\">";

a tohle je mnohem lépe čitelné:
echo '<table cellspacing="0" cellpadding="5" border="0" align="center" class="ramsedy-vypln">';



5. V případě použití příkazu echo
je výkonostně lepší jednotlivé části nespojovat do jednoho řetězce tečkou, ale odeslat je jako parametry, oddělené čárkou

tedy tohle :
echo "<option value=\"1\" selected>".RS_TL_ANO."</option><option value=\"0\">".RS_TL_NE."</option>\n";

nahradit tímto (s využitím předchozí rady):
echo '<option value="1" selected>', RS_TL_ANO, '</option><option value="0">', RS_TL_NE, "</option>\n";



5. Snažte se psát efektivní kód, který málo zatěžuje server
Většinou máte stránky na nějakém webhostingu, kde kromě vaší domény leckdy běží i tisíce dalších, kterými je server vytěžován.
Takže to, co je u vás na localhostu během pár milisekund, pak na skutečném hostingu trvá o několik řádů déle.
Pokud vás napadne více řešení, změřte si které je nejrychlejší. Např. takovýmto cyklem (podle náročnosti můžete počet cyklů buď zmenšit nebo zvětšit):
$a1=microtime(true);
for ($i=0; $i <= 10000; ++$i) {
  ... zde je váš testovací kód ...
  ... pokud je hodně krátký a "rychlý"...
  ... můžete ho zde napsat víckrát za sebou...
  ... aby v měřeném čase nepřevažovala režije for cyklu ...
  }
$a2=microtime(true);
$a3=$a2-$a1;
print "Hotovo za : $a3 s\r\n";

Složené podmínky z více výrazů pište tak, aby na začátku byla taková, která nejčastěji ovlivní celou podmínku a jsou to třeba jen porovnání hodnot proměnných (pokud totiž php zjistí, že výraz v podmínce už má jasnou hodnotu, tak další podmínky nevyhodnocuje) a na konec dávejte podmínky, které hodně zatěžují server, např. volání nějaké funkce.
Tedy pokud máte podmínku OR, tak na prvním místě má být to, co nejčastěji dá true a nemusí se pak testovat dál.
V případě podmínky AND zase na první místo patří to, co dá nejčastěji false.
Případně se této vlastnosti využívá k otestování, jestli proměnná existuje a pokud ano, tak jakou má hodnotu a nehlásí to chybu o neexistující proměnné, neboť když neexistuje, tak se konec podmínky netestuje a nepracuje se tedy s neexistující proměnnou:
if (isset($test) and $test > 0)



6. Pokud máte PHP 5 s databázovou extenzí mysqli tak jí využijte
Např. pomocí Prepared Statements zvýšíte výkon u dotazů, které voláte často, jen s jinými parametry a navíc si tím dotazy ošetříte i na SQL injection. Více viz:
[http://programujte.com/clanek/2010030700-php-a-mysql-mysqli-2-dil/]
[http://martindev.posterous.com/php-obrana-pred-sql-injection]




Celkem upraveno 8×. Poslední úprava MirekS v 13.09.2011 08:33.



Lituji, ale pouze registrovaní uživatelé mohou zasílat příspěvky do této sekce.
This forum powered by Phorum and designed by STaNBoSS.