Jump to content
php.lv forumi

Venom

Moderatori
  • Posts

    1,918
  • Joined

  • Last visited

Posts posted by Venom

  1. $path='/direktorija/ar/failiem/';
    $dir=opendir($path);
    
    
    if (!isset($_POST['editfile']))
    $_POST['editfile']='';
    echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post"><select name="editfile">';
    while(false!==($item=readdir($dir)))
    {
    switch ($item)
    {
     case '.':
     case '..':
      continue;
     default:
      if (is_dir($path.$item))
        continue;
      echo '<option value="'.htmlspecialchars($item).'" '.($_POST['editfile']==$item?' selected="selected" ':'').'>'.$item;
     break;
    }
    }
    echo '</select>';
    
    if (!empty($_POST['editfile']))
    {
     if (isset($_POST['save']) && !empty($_POST['editable']))
     {
      $fh=fopen($path.$_POST['editfile'],'w');
      fwrite($fh,stripslashes($_POST['editable']));
      fclose($fh);
     chmod($path.$_POST['editfile'],0755);
     } 
    echo '<br><textarea style="width:90%;height:500px" name="editable">'.htmlspecialchars(@file_get_contents($_POST['editfile'])).'</textarea><br /><input name="save" value="save" />
    ';
    }
    echo '</form>';

     

    rakstīts tepat textareā, varētu būt kļūdas

    whatever sākums tev iraid

  2. <?php

    $conf=array(

    1=>array('diagonal','sound','aux_in'),//tv

    2=>array('sound','power','resistance'),//muz.centrs

    );

     

    $dict=array(

    'diagonal'=>'Diagonāle',

    'sound'=>'Skaņa',

    // utt.

    );

     

    /*

    tabula:

    id|cat_id| un visu iespējamo parametru kolonnas - sound|aux_in|power utt.

    */

     

    $q=mysql_query('SELECT * FROM preces LIMIT 20');

    while($r=mysql_fetch_assoc($q))

    $apply=$conf[$r['cat_id']]; //tiek izvēlēti kuri lauki jāizvada

    foreach($apply as $param)

    echo '<li>'.$dict[$param].': '.(($r[$param]!='')?$r[$param]:'--').'</li>';

     

    /* katram raksturparametram tiek izvadīts "Tulkojums" un, ja att. kolonā kaut kas iepildīts (varētu būt arī 0), tad att. vērtība - citādi --*/

     

    ?>

  3. basic string syntax

     

    $x=1;

    echo 'This is $x'; outputs:

    This is $x

    echo "This is $x"; outputs:

    This is 1

     

    echo '\n'; outputs:

    \n

    echo "\n"; outputs:

    [newline symbol]

     

    tas, kas ir iekš "" tiek papildus nopārsēts un ja tajā atrodas mainīgie un papildus specsimboli (\* variācijas, heksadecimālās un oktālās vērtības) - tie tiek aizstāti pret attiecīgo.

    Kad tu raksti \ iekš "", tad pārseris gaida, ka tālāk būs kāds specsimbols un to "apēd", tāpēc, kad gribi ierakstīt iekš tekstuālo \ iekš "", tev tas papildus jāslasho "\\", bet tā kā priekš regekspa daži simboli jānoslašo papildus, tas viss var izaugt kā "\\\\." (beigu rezultātā - \. ) ekvivalents '\.' (nb. izņēmums iekš apostrofiem ir '\\', jo ja būtu '\', tad no sākuma tiktu nostripslashots [\'] par ['] un beigās sanāk nepabeigts strings - ' (sāk stringu kodā) ' (ir iekš stringa, vērtībā) [nav beidzamā stringa slēdzējapostrofa kodā - kļūda].

     

    echo "<input name=\"name\" />"; man ir grūtāk raxtīt, nekā

    echo '<input name="name" /> - what about u?

  4. Vienkārši taisi post uz to pašu lapu, piem.

    echo '<input name="smth" value="'.(!empty($_POST['smth']):htmlspecialchars($_POST['smth']):'').'">';

     

    Lai dati paliktu pie back pogas iesaka formai lietot $_GET, kas pats par sevi nav neko labs variants.

  5. nu, piem.

    <form name="the" ...>

    <input name="in" onclick="func()">

    </form>

    <script>

    function func()

    {

    document.the.in.value='Tas un tas';

    //resp.document.formas nosaukums.ievadlauka nosaukums.propertijs

    }

    </script>'

     

    vai arī

    <input onclick="this.value='Šis unn tas'">

    this ir atsauce uz tekoši aktīvo objektu - resp. onlcik aktivizē pašu inputu

     

    vai arī

    <input onclick="func(this)">

    ...

    function func(elt)

    {

    elt.value='šis un tas par šo un to';

    }

     

    vai arī

    <input id="smth" onclick="byid()">

    ...

    function byid()

    {

    elt=document.getElementById('smth');

    elt.value='Šis un tas par Meriju';

    }

     

    ja ievadlauks ir textarea, tam varētu būt .text, nevis .value

    ja strādā ar <select>, der atcerēties [select objekts].selectedIndex - kurš option ir izvēlēts, [obj].value ir att. vērtība - tas kas <option value="...">

    ar [obj].options[[obj].selectedIndex].text var dabūt tekošā elementa <option> leibla tekstu

  6. VenMySQL klases gabals:

    function p4q($tmp,$html=0)//prepare data to place in query
    {
     if ($html)
      return mysql_escape_string(htmlspecialchars($tmp));
     return mysql_escape_string($tmp);
    }
    function pp4q($tmp,$html=0)//prepare $_POST data for query
    {
     if (empty($_POST[$tmp]))
      return;
     if (get_magic_quotes_gpc())
      $_POST[$tmp]=stripslashes($_POST[$tmp]);
     return $this->p4q($_POST[$tmp],$html);
    }

  7. fputs(), bet tā ir tā pati.

    Būtībā nav (atskaitot dažādus move_uploaded_file()).

     

    a kas tev fwrite-ā nepatīk?

    varbūt nav vaina saglabāšanā, bet kā tu to mainīgo glabā?

    varbūt apsk. f-jas explode, serialize?

     

    NB: ja ir pieejams php manuālis *.chm formātā, tad apskatot kādas f-jas paskaidrojumu, zemāk var atrast linkus uz saistītām/līdzīgām f-jām.

  8. Tā uz ātro ieskatījos:

     

    function set_err($mess = '') {

    $this->errors[]=$mess;

    //nav ko lieki izsaukt funkcijas, kur var iztikt ar operatoru

    return false;

    }

     

    tad

    $this->set_err('whateva'); return false

    vietā var rakstīt uzreiz return $this->set_err('whateva');

     

    un arī "Can not create table \"$database\"!" vieglāk un labāk rakstīt 'can not ...'.$database.'!'

     

    hints1: tā kā varētu būt, ka bieži tiek rakstīts failā, tad derētu nevis uzticēties lockiem (kuru winos nav, bet rakstīt no sākuma temp failā un pēc tam pārlikt to par vajadzīgo)

     

    hints2: tā kā tik un tā streso RAMu ar faila lasīšanu un explodēšanu - varbūt uzreiz apskaties serialise/unserialise f-jas?

     

    iekš php, ja masīvs ir tukšs tad if(masīvs) arī atgriešz false, resp.

     

    if(!count($this->errors)) { return false; }

    #192 $err = $this->errors;

    #193 $this->errors = array();

    #194 return $err;

     

    var pārrakstīt kā

    $tmp=$this->errors;

    $this->errors=array();

    return $tmp;

     

    NB: foreach($data as $d) {

    foreach(array_keys($d) as $key) echo $key.' => '.$d[$key].'<br>';

    vietā lieto

    print '<pre>'.print_r($data,1).'</pre>'; iekš VenPad-a snippets "chk"

  9. A kāpēc tev tabulas nosaukums ir apgriaztajās pēdiņās? Manā saprašanā ne tabulu nosaukumiem, ne stabiņu nosaukumiem nekāda pēdiņas nav vajadzīgas. Kaut arī, varbūt tas ir vienalga, pārliecināts neesmu :)

    `backticks` tiek lietotas, ja gribi tabulai/laukam piešķirt nosaukumu ar norezrvēto SQL/funkcijas nosaukumu. Piem ja gribi nosaukt lauku par `text`,`max` utml

  10. klasi pārāk gari skatīties, kad vēl darbs nedarīts stāv ;) + kaučkādi gatavie varianti laikam ir (Sqlite?)

     

    no redzēta orderBy:

    forā count() nevajadzētu izmantot, it īpaši, ja masīva var būt tūkstošiem elementu (nosacījums tiek novērtēts, lasi - count tiek pārrēķināts pie katra for cikla), + tad, kad jāizskrien masīvs, vienmēr labāk būtu izmantot predekrementu - --$i (n.b. šajā gadījumā arī inkrementu būtu jāizmanto ar "pre" - ++$i), resp.

    $tmp=count($this->result);

    while(--$tmp>-1)

    $sortarr[$i]=$this->result[$i][$colname];

     

    un atkal jau foreach(array_keys() ... ) izskatās ļoti aizdomīgi - tā, it kā array_keys() tiktu izsaukts pie katra caurgājiena

     

    if ($order=='ASC')

    else ..., ja vien nedomā izmantot kādu citu orderēšanas veidu

     

    multisortā laikam gan derētu ieskatīties.

  11. ir papildus headers, resp. var norādīt alternatīvos nosaukumus vairākos kodējumos title*baitu prioritāte*=kodējums'val.iso-kods'title (resp.utf-8 tas varētu būt title*2=utf-8'lv'āšā.doc). Bet, of coss, visi pārlūki to pārsvarā ignorē (daži mailparseri gan havo).

    Problēma ir tajā, ka paša pārlūka save dialogs apstrādā faila nosaukumu kā ANSII. Pamēģini vienkārši nolinkot failu (noņem attachment headerī) - droši vien paņems un atvērs. Priekš IE bija kaučkāds patčs, kas iespējoja unicode rakstīšanu adreslogā (visādiem www.glāžšķūņurūķīši.lv) un att. failu nosaukumos.

    Droši vien nāksies izmantot iconv('utf-8','windows-1257//TRANSLIT',$filename);

  12. nu re kā cilvēkis sāka rosīties ;)

    savu mysql klasi lietoju jau kādu otro gadu un arvien atrodu ko pielabot, nesen atkal piesēdos un samazināju kodu par ~30 rindām (pie tam vēl pievienojot funkcionalitāti)

     

     

    Att. uz tā tur else izmantošanu:

    ja nav $mode, tad $tpl ir $this->file

    if(!$mode) {
              $tpl = file($this->file);
              $tpl = join(' ',$tpl);
           }
           else {
              $tpl = $this->file;
           }

    $tpl vienmēr ir $this->file, ja vien ne $mode izņēmums

    $tpl=$this->file;
    if(!$mode)
    {
    $tpl = file($this->file);
    $tpl = join(' ',$tpl);
    }

  13. Tomēr ir šādas tādas pretenzijas - semantiskas:iekš php class un function raxtīt maziem burtiem

    saprātiskas: redzot $this->file drīzāk rodas asociācijas ar $this->filename. Prasās $this->contents vai tml.

    f-jai setValue nav nekāda pamata - kāpēc gan nevarētu pa tieši bliezt klases instancē ($parser->tags=array..., $parser->values=..., $parser->replace())

    f-ju replace atbrīvotu no liekā else

    un vispār - priekš kam value-siem un tag-iem būtu jāizmanto atsevišķi masīvi - vot saputrošos, ka man $tags[123] ir '%%head%%' un uzlikšu $values[121]='<title>...</title>' - labāk pa tiešo masīvs[mainīgais]=vērtība

     

    manā variantā clase būtu kaut kas līdzīgs:

    class Parse
    {
    var $file;
    var $contents;
    var $tags;
    function Parse($file='',$tags=array())
    {
     static $tpl=array();
     if ($tags) $this->tags=$tags;
     if ($file && !isset($tpl[$file]))
      $tpl[$file]=@join('',@file($this->file=$file));
     return $this->contents=@$tpl[$file];
    }
    
    function replace($tags=array(),$file='') {
     if ($file!=$this->file) $this->Parse($file);
     if ($tags) $this->tags=$tags;
     //variants ā - $tags['mainīgais']='vērtība';
     foreach($this->tags as $key=>$value)
      $this->contents=str_replace('%%'.$key.'%%',$value,$this->contents);
    return $this->contents;
     //variants bē - $tags['%%mainīgais%%']='vērtība';
    return $this->contents=str_replace(array_keys($tags),array_values($tags),$this->contents);
    }
    }

    (un arī tas nav beigu variants)

     

    padomā arī pie tā, kā esmu izveitojis parametrmainīgos - vienu un to pašu instanci var izmantot vairāku failu pārsešanai (pie tam kešojot template izejkodu), vai piemērot jaunos mainīgus tam pašam failaum utt.

  14. laikam atkārtošos, bet kāpēc gan nē, viss jaunais ir labi aizmirsts vecais

     

    $fh = fopen($file,'r');

    $tpl = fread($fh,filesize($file));

    fclose($fh);

     

    ir viena no pierastākām konstrukcijām, visās valodās. (Piem Pascal: AssignFile(handle,FileName); ... CloseFile(handle);)

     

    @join('',@file($file)); dara to pašu:

    atver hanldu uz failu

    kamēr nav faila beigas, nolasa to rindu pa rindai un saglabā masīvā

    aizver handlu un pēc tam ar join vēl saliek kopā - varētu būt pat lēnāk, nekā ja ar fread no handla tiek vienkārši nolasīts viss līdz galam vai handla datu beigām, nevis katrs ceļa chars pārbaudīts uz vienādību \0 vai \n vai kā nu tur.

     

    Vēl viens visai ātrs variants iraid

    ob_start();

    include 'template.php'; //nb - esmu ļoti pret .inc un .tpl paplašinājumiem, cik tādu (svešu) esmu nolasījis...

    $tpl=ob_get_clean();

     

    vai var pat nepārsēt katru templatre atsevišķi, bet nobliezt visu beigās:

     

    <?php

    ob_start();

    include 'header.tpl';

    include 'some.htm';

    include 'some.php';

    un citādi ?> <b>samaisīts htmls</b> ar %%template%% mainīgiem<?php

    utt. arī php var izmantot echo '%%template_mainīgais%% teikumā utt';, piem.

    while($r=mysql_fetch_array($q))

    echo '%%date%%'.$r['date'].'%%/date%%';

     

    un kaut kur pašās beigās:

    $allhtml=ob_end_clean();

    include 'template_apstrāde.php';

    foreach($template_var as $key=>$val)

    $allhtml=str_replace('%%'.$key.'%%',$val,$allhtml);

    echo $allhtml;

    flush();

    un var pat to visu $allhtml norepleisotu saglabāt failā

    fwrite($fp=fopen('cache/'.md5($_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']),'w'),$allhtml);

    fclose($fp);

     

    bet pirms sākt ob_start() pašā sākumā pārbaudīt

    if (time()-filemtime($cachefile=md5(_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']))<1800) //e.g. kešs tiek atjaunots katras 3 stundas

    {

    include $cachefile;

    exit;

    }//citādi tiek izpildīts tālākais kods - notiek pārsēšana un ieglabāšana kešfailā

    ?>

×
×
  • Create New...