Jump to content
php.lv forumi

Lynx

Reģistrētie lietotāji
  • Posts

    228
  • Joined

  • Last visited

Posts posted by Lynx

  1. Īsti nezināju zem kuras sadaļas likt, jo php galu uztaisīt nav problēmu, lielākas problēmas ir ar c++.

     

    Man ir nepieciešams izveidot c++ kodu, kas veic http GET pieprasijumu uz piemeram, adrese.lv/parbaude.php?atslega=kaut_kaads_strings, kura ar echo atgriež 1 vai 0 attiecīgi ja atrod datubāzē vai nē. Tālāk tam pašam kodam būtu jasagaida un janolasa atbilde no lapas.

     

    Papeetiju msdn.microsoft.com un īsti nespeju atrast vajadzīgo funkciju, ne pieprasījuma izveidei, ne atbildes nolasīšanai. Varbūt, kāds kas ir lielāks speciālists šajā valodā var palīdzēt.

  2. Līdz šim projektos, kur vajadzēja specifiskas atļaujas noteiktiem lietotājiem, lai piekļūtu administratīvām darbībām, es izmantoju sistēmu, kur katrai atļaujai ir savs lauks atļauju tabulā šādi: zinas-enum(0,1), lietotajie-enum(0,1) etc. Ļoti sarežģīti uzturēt, ja jāuztaisa jauna sadaļa.

     

    Pirms kāda laika pētīju php error_reporting() un ieraudzīju šādu ģeniāli vienkāršu sistēmu(nosaukums nebija minēts, tieši tapēc problēma, jo nevaru atrast materialus google), kur mēs saglabājam tikai vienu int vērtību lietotājam, kas ir summa no katras kategorijas skaitļa attiecīgi:

     

    zinas => 1

    lietotaji => 2

    komentari=>4

     

    Ja vēlamies, lai lietotājs var piekļūt tikai ziņām un komentāriem summa ir 5. Izveidot saskaitīšanu nav problēmu.

     

    Galvenā problēma ir tā, ka pašlaik es nevaru izdomāt pareizo formulu, kā izvadīt atļaujas, jo visos meiģinājumos kaut kas nebija precīzi un kods izvadīja arī kategorijas, kurām nav pieejas, vai neizvadīja vajadzīgo.

  3. Papildus funkcionalitāte tur ir, vienkārši šis ir mazs izrāvums no visas klases, lai parādītu darbības principu.

     

    Jo jautājums bija par pamata struktūru vai labāk ir extendot myqsli un lietot parent::query($sql) vai neekstendot un rakstīt izmantojot vienkārši funkcijas un padodot linka argumentus: mysqli_query($this->link, $sql) un kāda reali ir atšķirība, jo izpildes ātrums nemainās.

     

    [edit]Un uz ko kamēr rakstīju atbidli, john.brown paspēja atbildēt.

  4. Pirms kāda laika uzrakstīju savu mysql/mysqli klasi, lai varētu viegli pārslēgties ar projektu no php 4 uz php 5 serveri un otrādi un atvieglot error reportingu, pašu sintaksi un citus sīkumus.

    Un pēdējā laikā vairāk studējot par php oop un veidojot vienu dinamisku projektu radās loģisks jautājums, kā labāk rīkoties mysqli gadijumā. Līdz šim visu laiku mana klase bāzējās uz: class db extends mysqli { } un piekļuvām vajadzīgajam elementiem ar parent:: tb if (!($result = @parent::query($sql))) { //error reports }

     

    Vakar domāju vai gadijumā nav lieks overkills jo to pašu pēc php manuāļa var panākt izmantojot vairāk proceduālu stilu neextendojot mysqli, tāpēc ātri uzrakstīju jaunu versiju šādi te:

    //pseido kods 
    class db
    {
    protected $link; 
    
    function __construct($server, $username, $password, $db) 
    {
    if(!($this->link = @mysqli_connect($server, $username, $password, $db)))
    	{
    		 //error_reports
    			 }
    public function query($sql)
      {
    if (!$result = @mysqli_query($this->link,$sql)) { } 
    etc..

    Skripta izpildes laiki pilnīgi neatšķiras starp šīm metodēm(vai arī atšķirība ir tik sīka, ka nemanu), meklējot devnetwork.net un googlē arī nespēju rast atbildi jautājumam: Kāda reali ir slēptā atširība starp abām metodēm un kuru labāk izmantot, jo cenšos iemācīties pareizu oop?

  5. id select_type table type possible_keys key key_len ref rows Extra

    1 SIMPLE tabula const PRIMARY PRIMARY 4 const 1

     

    Skaidrs, tad esmu visu laiku darījis pareizi un rakstā bija neprecīza informācija par to, ka vienmēr jalieto LIMIT.

  6. Palasīju vienu rakstu par mysql query optimizāciju un izlasīju interesantu lietu, ja vēlamies selektot tikai 1nu rowu tad vienmēr būtu jalieto LIMIT 1. Līdz šim es LIMIT nelietoju gadījumos, ja WHERE arguments ir primary un ir zināms, ka, piemēram, WHERE id = 12 var būt tikai viens. Cik sapratu no raksta, ka bez tā LIMIT mysql izskries vēl cauri db un meklēs vai vēl kāds ieraksts neatbilst kritērijam.

     

    Papētiju mysql manuāli un pie Optimizācijas, SELECT un LIMIT sadaļām neko par šo lietu neatradu. Vienīgi atceros, ka agrāk, kaut kur lasīju, ka mysql pats optimizē šāda tipa pieprasījumus un tas LIMIT nav jāraksta, ja tiek izmantots primary key, jo pēc pirmā atrastā ieraksta automātiska tiek pārtraukta meklēšana. Itkā veicu benchmarkingu un rezultāti sakrita, bet nekad nevar būt drošs.

     

    Kāda citiem ir pieredze šajā jautājumā?

  7. Nu nez imho lieka vietas tērēšana, ja ir ļoti garš teksts. Likt viņu 2os eksemplāros manuprāt bezjēdzīgi. To pašu iespēju kopēt uz SentItems var jau panākt arī te vienkārši ja nav ieķeksēts kopēt pie show_sender uzreiz liekam 0, kad ievadam datubāzē.

  8. Dari savādāk es savā PM sistēmā ieviesu vestulem laukus show_sender, show_reciever, abiem default 1.

     

    Kad, piemēram, saņēmejs dzēš arā parbaudām vai gadījumaa arī sūtitajam rādīt nav 0. Ja ir 0 dzēšam arā no datubāzes pavisam, ja tomēr ir 1, tad updeitojam show_reciever uz 0. Lai sūtitājam vēl vēstule uzrāditos pie vestuļu saraksta. Nevajag nekādus JOINUS un viss notiek ātrāk. Protams, neizmirstam pirms izvades parbaudīt vai vēstuli ir jarāda.

  9. Heh un tagad patiešām strādā. Izskatās, ka vienkārši 1o reizi rakstot kļūdijos mainīgos neuzrakstot vienādi. Un tā kā biju pieradis pie tā, ka nestrādā eksperimenti, pieļāvu, ka te arī vienkārši nebija tā paredzēts strādāt. Paldies visiem kuri palīdzēja tikt līdz gala risinājumam.

  10. Ja tu tā pasaki, tad patiešām sāku saprast loģikas kļūdu. Nu teorētiski var jau nepadot tieši mainīgo, bet pēc nosaukuma padošanas mainīgo radīt(un tieši te es iesprūstu):

     

    izsaucam ar: error('l_error12');

     

    function error($code)

    {

    include('valodas fails');

    echo ${$code}; // ši rinda, protams, nestradaa, bet doma aptuveni skaidra. Izpildīt mainīgo, pēc tam kad mainīgais ir izveidots.

    }

     

    Kaut gan izskatās, ka šī mana mirkļa ideja aiziet dziļās auzās, un pietiks niekoties. Palieku pie vecās sistēmas.

  11. Teorētiski varētu, vienkārši vēlos pieturēties visā projektā pie vienotas sistēmas. Lapas augša tiek includoti valodu faili. Un vienkārši attīstot projektu uz priekšu radās ideja uztaisīt lapu tā, ka nav nekas lieks, piemēram, tagad visus error tekstus parnest uz atsevisku failu, kurš tiktu izsaukts, tikai kad nepieciešams. Nevis kā tagad visi viņi ir iekš common.php, kur glabaajas arī pārējie biežāk lietotie. Sanāk katru reizi laižot skriptu nēsāt līdzi kaudzi ar liekiem mainīgiem. Ātrumu jau tas praktiski neietekmē, bet kā pedantam gribās, lai viss būtu kārtībā :)

     

    Hmm sanāk, ka tas nav iespējams? Izpētīju php.net manuāļus un neko līdzīgu neatradu. Iespējams, vienkārši es nezinu kā šo sauc.

  12. Kādu laiku izstrādāju pie dinamiskas lapas ar templeitiem un valodas mainīšanas sistēmu un iešāvās prātā iespējams uzlabojums, lai padarītu visu vienkāršāku un atbrīvotos no lieki includotiem valodas failiem.

     

    Ir funkcija error($text, $back = FALSE) kurai tiek padoti 2 mainīgie, viens ar kļūdas aprakstu, otrs ar ceļu kur atgriezties atpakaļ. Ir iespējams padot funckijai mainīgo $l_error tā lai viņš izpildītos tikai pēc tam funkcijā, nevis uzreiz tiktu izpildīts un tad padots.

     

    triviālā veidā izskatītos kopā šādi:

     

    include('functions.php');
    
    blabla kods
    
    notiek kluuda ar tekstu 12, kods tiek apstadinats un izvadam kludas pazinojumu
    {
    error($l_error12);
    }
    
    iekš functions.php 
    error($text, $back = FALSE)
    {
    include('languages/blaabla');
    
    Te notiek visa tā mainīgo izpildīšana, mēs redzam ka $text ir padots kā mainīgais $l_error12. Atrodam šo mainīgo valodas failā un izvadam $text vietā $l_error12 saturu no valodas faila. Es meiģināju dažādi padot referenci &$, bet nevarēju palaist. Ir tas vispār iespējams?
    
    echo $text;  
    }

    Kāda jēga no šī visa? Pagaidām ir tā, ka katrā lapā ir jainklūdo erroru.php valodas fails, pat ja kļūdas nenotiek. Ja dabūtu gatavu šādu variantu tad atbrīvotos lapa no vairākiem mainīgajiem ar daudz tekstu.

  13. Tatad ir diezgan liels projekts, kurš ēd daudz mysql datubāzes resursus un ir plāns samazināt datubāzes noslodzi.

    Kā viens no lielākajiem ēdajiem, kas darbojas nepārtraukti tika noteikts SELECT, kas savāc informāciju no vismaz 7iem vienas tabulas datubāzes laukiem katru reizi pakustoties ielogojušamies lietotājam lapā.

    Šo problēmu paris dienas atpakaļ es būtu atrisinājis vienkārši uz logošanos ierakstot visu informāciju sesijas mainīgajos un ar tiem arī tālāk darboties, un, ja nepieciesšams veikt izmaiņas. Tad izmainiit gan sesijas mainīgo, gan veikt updeitu datubāzē.

     

    Bet studējot materialus internetā izdomāju interesantu ideju. Uz logošanos lietotaja dati no īstas tabulas tiktu parakstīti uz HEAP tabulu. No kuras arī tiktu visu laiku selektēti un pie reizes arī updeitoti dati. Teorētiski vajadzeetu strādāt daaaudz ātrāk, jo tiek lasīta informācija no rama un samazināta hdd lietošana.

    Ja cilvēks izlogautojas tad visi dati no HEAP tabulas tiktu pārakstīti uz īsto tabulu un ieraksts no HEAP izdzēsts.

    Takā lapai ik pa 5min backgroundā iet datubāzes updeiti, tad pie visiem pārejiem procesiem vajadzēs arī piesaistīt HEAP datu parakstīšanu uz īsto tabulu. Priekš tiem, kas neizlogautojas un vienkārši aizver browseri, vai arī, ja pēkšņi serveris nokaras lai ir tikai max 5min rollbacks.

     

    Kuru variantu Jūs ieteiktu izmantot? Un varbūt ir vēl kādas svarīgas lietas, ko neesmu ņemis vēra meklējot labāko risinājumu?

  14. Ir gadījumi, kad piemēram ir nepieciešams vienā lapā attēlot divās, vai trīs vietās vienus un tos pašus datus no vienāda mysql pieprasījuma. Zinot, ka datubāze visvairāk tiek noslogota, loģiski būtu veikt vienu pieprasījumu sākumā, noindeksēt datus un vēlāk viņiem piekļut. Un te rodas jautājums: kā to vislabāk darīt?

     

    1ais variants, ko uz ātru roku uzrakstīju:

    $i = 0;
    $query = mysqli_query(); 
    while($row = mysqli_fetch_assoc($query))
    {
    $i++; 
    $id[$i] = $row['id']; 
    $text[$i] = nl2br(stripslashes(parsecode($row['text'])));
    }
    
    Datus pēc tam atkārtoti izvadam šādi:
    
    for($ii = 1; $ii <= $i; $ii++)
    {
    echo $id[$ii].' '.$text[$ii];
    }

    2ais variants:

    $query = mysqli_query(); 
    while($row = mysqli_fetch_assoc($query))
    {
    $data['id'][] = $row['id'];
    $data[$row['id']]['id'] = $row['id']; 
    $data[$row['id']]['text'] = nl2br(stripslashes(parsecode($row['text']))); 
    }
    izvadam: 
    
    if(!empty($data))
    {
    foreach($data as $dat)
    	{
    		echo $dat['id'].' '.$dat['text'];
    	}
    }

    Vai varbūt ir kāds vēl labāks variants? Un esmu pārleicināts, ka noteikti jābūt.

  15. Ir nepieciešams dinamiski pievienot jaunus <div> zem body taga ar js, izsaucot funkciju. Ar document write(); ja viņš atrodas funckijā, ko izsauc piemēram links. Tad funkcija pāraksta pāri visai lapaspusei un mums ir balts backgrounds un nekas cits, kā izņemot pats jaunais <div>ar savu saturu.</div>

     

    Ja neliekam iekšā funkcijā, kas nestrādās ilgtermiņa, tiek uzģenerēts, viss kārtībā, bet es nevaru piekļūt klāt jaunajam <div id="box5"> vienkārši selektojot elemetu pēc id, tiek ziņots, ka elementam "has no properities". Kā varētu šīs divas problēmas atrisināt?

     

    Vienkārši ir nepieciešams, lai nepārlādējot lapu JS uzģenerētu jaunu teksta konteineru ar kuru pēc tam citi js kodi varēs mijiedarboties.

  16. Tātad ideja tāda man projekta attīstības gaitā radās nepieciešamība pēc viena koda pārstrādes un radās idejiski dažādi risinājumi ar kuriem problēmu nav. Bet es izdomāju arī vienu variantu, kurš ja izdotos būtu vienkārši ideāls, bet te rodas problēmas vai var izdoties.

     

    Tātad cilvēks palaiž lapu un kods taisa while($end == FALSE), kas apstaajas ja ir sasniegti noteikti kritēriji. Ik pa kādām 2 sekundēm ar ob_ izdod rezultātu par sasniegto.

    Ja loops izpildījies savadam visu datubāzē un gatavs.

     

    Bet problēma rodas, ja cilvēks piemēram pārslēdz lapu, uz citu šajā pašā projektā. Būtu nepieciešms kodu momentāli apstādināt, tikko kā notiek pakustēšanās. Ir iespējams kautkā no engine.php padot parametru, kas tiek includots visos failos, lai tas kods tiktu apstādināts un tajā brīdī viss savadīts datubāzē?

     

    btw ir kautkā iespējams <form> uztaisīt, ka rezultātu padod, uz iframe?

×
×
  • Create New...