Jump to content
php.lv forumi

Efektīvs kods un pieprasijumu skaits...


Lynx

Recommended Posts

Tātad pirmais jautājums: Kā var noteikt izpildīto mysql query skaitu, lapas ielādes laikā?

 

2ais: Kā vislabāk parakstīt šadu kodu, lai vinš būtu mazāks/atrāks: http://paste.php.lv/1664

 

 

Visvairak nepatik šī te vieta, bet nav sanācis uztaisīt kautko labāku:

list($autora_id) = mysql_fetch_row(mysql_query('SELECT id FROM lietotaji WHERE username = "'.$row[autors].'"'));
list($uzera_komentari) = mysql_fetch_row(mysql_query('SELECT komentaruskaits FROM lietotaji WHERE username = "'.$row[autors].'"'));

Link to comment
Share on other sites

1) ehh... cilvēki vairs nemāk skaitīt viens klāt globālam mainīgajam... visvienkāršāk uzraksti savu funkciju:

$cnt = 0;
funtion q($str) {
 $GLOBALS["cnt"]++;
 return mysql_query($str);
}

Un visur savā kodā, kur izmanto mysql_query(..) aizstāj to ar funkcijas izsaukumu q(..)

 

2) pārrakstīt tavu kodu netaisos, bet daži ieteikumi:

$is_loged_in ir nedefinēts mainīgais koda sākumā!

 

$row[autors] - esi pārliecināts, ka tev ir nodefinēta kostnate autors? varbūt biji domājis rakstīt: $row['autors']??

 

to vājprātīgo list(...) rindiņu vietā izmanto (pamācies tak cilvēk php!):

$q = mysql_query('SELECT * FROM lietotaji WHERE username = "'.$row[autors].'"');
if ($q===false) {
 // parādi ka notikusi kļūda! un apstādini koda izpildi
}
$r = mysql_fetch_assoc($q);
mysql_free_result($q);
if ($r===false) {
 // nav rindiņu, ko dabūt no db
} else {
 // tagad kodā izmanto savas tabulas kolonnu nosaukumus
 // piemēram, ja ir tāds lauks id, tad var rakstīt:
 // echo $r['id']
 // ...
}

Link to comment
Share on other sites

1) Par pirmo liels paldies, neiedomajos :)

 

2)

$is_loged_in ir nedefinēts mainīgais koda sākumā!
Ir definets indexa, kad parbauda logoshanos, shis ir tikai mazs izgriezums no koda.

 

$row[autors] - esi pārliecināts, ka tev ir nodefinēta kostnate autors? varbūt biji domājis rakstīt: $row['autors']??

 

Jaa mana kluda, nepamaniju

 

Un par to kodu, isti nepatika kaa vinsh tev izskatas daudzi nevajadzigi checki, vai patiesham eksiste tadi ieraksti. Vini nevar nebut, jo pie komentara viss definets, bishku parveidoju/vienkarshoju:

 

$aut = mysql_fetch_assoc(mysql_query('SELECT id, komentaruskaits, avatars, avatar_width, avatar_height, apraksts FROM lietotaji WHERE username = "'.$row['autors'].'"'));

 

Paldies par ieteikumiem, vel kadi deretu lai padaritu kodu smukaku/atraku.

Link to comment
Share on other sites

Nu nedrīkst šādi rakstīt: mysql_fetch_assoc(mysql_query(..)) !!!!

Nu vajag pārbaudīt vai mysql_query() atgriež ne-false vērtību. Vajag!

A to citādi būs kā vairuma lapu - visādu php notices ar kļūdu paziņojumiem!! Un pašā lapa nerādīsies normāli. Eh.. tik grūti čekot vai ir korekti dati? Nav brīnums, ka tagad vairums lapu gļuko, ka visi tagad mācās rakstīt bez kļūdu pārbaudēm..

Link to comment
Share on other sites

Hmm, bet var tachu parbaudit vai attiecigie dati ir aizpilditi ari velak.

 

Piemeram shis variants strada itin labi, es gan nezinu cik vinsh korekts un kapec vinsh vispar strada :D, bet nekadas error notices vai kas tamlidzigs neradas un efekts ir ideals ka vajag. Tas ir, ja ailite nav aizpildita, nekas neparadas, ja ir tad redzam saturu:

 

if($avatars = $aut['avatars'])
{
$avatars = '<tr><td valign="middle" align="center"><img src="' .$aut['avatars']. '" border="0" width="'.$aut['avatar_width']. '" height="' .$aut['avatar_height']. '" alt="avatars"></td></tr>';
}

Link to comment
Share on other sites

Nu tā nav labi! Kapēc, tev to nepārbaudīt jau sākumā, pie mysql_query ? ja tu pārbaudīsi mysql datu patiesumu, tad tev nebūs vajadzības izpildīt tālāko kodu un attiecīgi lapa ielādēsies ātrāk!

Link to comment
Share on other sites

Skaidrs. Bet ka isti notiek sistēma? Piemeram man tas avatars var būt un var nebūt atkarīgs, vai cilvēks sev ir uploadējis avataru. Bet ar queriju jau tiek dabuti vel visadi dati, kuri noteikti ir! Piemeram id utt. Tas ka nav avatars datubaze neapstadinas visu to mysql queriju? Pashlaik Bubu kods izskatas, ka apstadinas. Neesmu gan parliecinats.

 

Edit, Bubu nopostoja, kamer rakstiju postu:

 

Vai šinī vietā nebija jābūt ==? Zini atšķirību starp = un ==?

 

Zinu atskiribu, un nebija jabut, jo tevis piedavatais variants neizpildas pareizi...

Edited by Lynx
Link to comment
Share on other sites

Zinu atskiribu, un nebija jabut, jo tevis piedavatais variants neizpildas pareizi...
Nu izskatās, ka tomēr nezini gan! "=" piešķir vērtību un ar to neko nevar pārbaudīt! Ar "==" pārbauda vērtību!!!

Šajā gadījumā:

if($avatars = $aut['avatars'])

Tu mainīgajam $avatars piešķir $aut['avatars'] vērtību. Nu ok, tā tu vari darīt, bet tad kapēc tev ir "if" ?

 

Mysql pieprasijums neapstājas, tas "apstātos" - atgriestu mysql_num_rows = 0 tikai tad, ja pēc attiecīgā WHERE nosacījuma neatbilstu neviens ieraksts. Bet tas ko tev vajaga ir pavisam vienkārši, paņem atlasi datus, pēc lietotāja un tad pārbaudi, vai avatars ir, vai nav, ja ir tad ieliec bildi, ja nav, tad nedari neko, vai ieliec kaut kādu defaulto bildi. Un vēl, tu atlasi lietotāju, pēc tā logina vārda - tas nav labi! Ja nu būs lietotājs janis un Janis ??? Ko tad? Tas tavā gadījumā, būs viens un tas pats, tapēc labāk atlasīt lietotājus pēc viņu ID nummuriem, vai arī atlasīŧ vārdu, kā "CAST(username AS BINARY)" - ajā gadījumā tas salīdzinās binārajā, nevis pašus burtus.

$query = mysql_query("SELECT id, komentaruskaits, avatars, avatar_width, avatar_height, apraksts,CAST(username AS BINARY) FROM lietotaji WHERE username = '{$row['autors']}' LIMIT 1");
if($query){
  $row = mysql_fetch_assoc($query);
  if($row['avatars'] != ''){
       echo 'Avatars ir!';
  }else{
        echo 'Avatars nav!';
  }
}else{
die('Notikusi SQL kļūda');
}

Vēl jau var pārbaudīŧ vai mysql_num_rows kaut ko atgriež, un vai mysql_fetch_assoc nostrādā, bet cik teici, tev pārbaudes nav vajadzīgas, tad ari nerakstiju!

Link to comment
Share on other sites

tad lūdzu man ar izskadrojiet ko nozīmē "->" pašam nekādi nepielec

13977[/snapback]

 

izsaucam klases metodi vai vērtību.

piemēram

<?php
class aye {
   var $test = 'aahaa';
   function kautkas($var){
        return($var*666);
        }
   }

$aye = new aye;
echo $aye->test; // output: aahaa;
echo $aye->kautkas(10); // output: 6660
?>

Edited by hmnc
Link to comment
Share on other sites

Agrakais variants bija:

$avatars = $aut['avatars']; 
if($avatars)
{
$avatars = '<tr><td align="center"><img src="' .$aut['avatars']. '" border="0" width="'.$aut['avatar_width']. '" height="' .$aut['avatar_height']. '" alt="avatars"></td></tr>';
}

Sanak, ka mes pielidzinam datubazes ierakstu mainigajam un pec tam parbaudam vai vinsh ir aizpildits.

Pec idejas vajadzetu darboties, bet nedarbojas:

if($aut['avatars'])

Un shis ir pirma varianta uzlabotais variants, kas ari darbojas:

if($avatars = $aut['avatars')

 

  ($row['avatars]!= ''){

    echo 'Avatars ir!';

  }else{

    echo 'Avatars nav!';

  }

 

Tevis dotais variants ari strada, bet mums ir vajadzigs ari else statements, lai viss izpilditos pareizi. Tapec ir jautajums, kursh variants ir efektivaks, atraks. Un to es parbaudiju:

 

<?php 
$conn = mysql_connect(''); mysql_select_db('');
if (!$conn) echo 'Nevar piekonektēties datubāzei';

$timestart = microtime(); 
$aut = mysql_fetch_array(mysql_query('SELECT id, komentaruskaits, avatars, avatar_width, avatar_height, apraksts FROM lietotaji WHERE username = "Lynx" '));

for($i=0; $i<=10000; $i++){
if($avatars = $aut['avatars'])
{
  $avatars = '<tr><td align="center"><img src="' .$aut['avatars']. '" border="0" width="'.$aut['avatar_width']. '" height="' .$aut['avatar_height']. '" alt="avatars"></td></tr>';
}
echo ''.$avatars.''; 
}
$timeend = microtime(); 
$diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) - (substr($timestart,0,9)) - (substr($timestart,-10))),4); 
echo'  <div id="footer"><p class="p1"><span>Lapa ielādējās '.$diff.' sekundēs</span></p></div>';

?>

Lapa ieladejas:

1aja testaa: 7.4355 sekundēs

2aja: 8.3292 sekundēs

3aja: 5.4069 sekundēs

 

Pamainam bishku kodu un testejam:

if($aut['avatars'] != ''){
   $avatars = '<tr><td align="center"><img src="' .$aut['avatars']. '" border="0" width="'.$aut['avatar_width']. '" height="' .$aut['avatar_height']. '" alt="avatars"></td></tr>';
 }else{
   $avatars = '';
 }
echo ''.$avatars.''; 
}

 

1ais: 4.7899 sekundēs

2ais: 5.0664 sekundēs

3ais: 6.7276 sekundēs

Pēc testiem baigais abloms :D Un sapratu, nav ko atklāt ameriku, jauzticas ir vien citiem.

Link to comment
Share on other sites

×
×
  • Create New...