21

(4 replies, posted in PHP)

na vien php čia neužteks, nes jis tėra skirtas atlikti operacijoms ir visiškai nieko dėtas su vizualizacija. už vizualizaciją atsako HTML ir JS.
lengviausias variantas: tu užkrauni html puslapį kuris atlieka kreipimasi į php script'ą per ajax, o kol gausi complete atsakyma - atvaizduoji tiesiog kažkokį ratuku besisukantį preloaderį. kitas būdas būtų tiesiog tavo atliekamas operacijas išskaiadyti į atskirus scriptus (aišku fiziškai tai gali būti vienas scriptas, atliekantis skirtingas funkcijas, pagal gautus parametrus) ir tuomet per ajax jas visas paeiliui užkrovinėt ir atvaizduot skirtingus užkrovimą identifikuojančius paveiksliukus (vėlgi pasinaudojus ajax complete eventu).

na problemą pavyko dalinai praspręsti (nubraukiant beveik 6s) kombinuojant UNION ir JOIN kontrukcijas. aišku tai dar visai manęs netenkina, bet bent jau pakeičiama.
toliau manau ieškosiu sprendimo keičiant duomenų bazės struktūrą, kad galėčiau paiešką atlikti tarp indeksų, o ne tarp teksto eilučių.

minde wrote:

Be to, pas tave visi "indeksai" yra atskiri, kaip žinia MySQL'as naudoja tik vieną.

Tai tu siūlai tuos indeksus, kuriuos naudoju, apjungti į vieną?

minde wrote:

Beje, ten naudojai "EXPLAIN" ar "EXPLAIN EXTENDED"?

Aš naudojau EXPLAIN, bet EXPLAIN EXTENDED grąžina tą patį.

1) savo atveju aš nematau, kur galėčiau panaudot tuos raktus kaip tik lentelių susiejimui, nes mano atveju viso labo atliekama paieška tarp dviejų lentelių.
2) LIKE naudojami dėl to, kad reikia surasti tokią informaciją, kuri įvedamo kodo fragmentą (raidžių ir skaičių kratinį) gali turėti 3 skirtinguose laukuose (šiuo atveju 2 laukai vienoje lentelėje ir vienas kitoje). kodo fragmentas paieškomas visose lauko vietose (pradžia, galas, vidurys ar net visas laukas)

bėda labai paprasta: turiu ganėtinai paprastą užklausą, tačiau ji vykdoma pernelyg ilgai. pirmiausia pradėsiu nuo lentelių.
Pagrindinė lentelė (36 515 įrašų):

CREATE TABLE IF NOT EXISTS `cms_module_aaproducts_products` (
  `id` int(11) NOT NULL,
  `nr` varchar(40) collate utf8_unicode_ci NOT NULL,
  `name` varchar(200) collate utf8_unicode_ci NOT NULL,
  `vnt` varchar(10) collate utf8_unicode_ci NOT NULL,
  `category` varchar(200) collate utf8_unicode_ci default NULL,
  `acode` varchar(40) collate utf8_unicode_ci NOT NULL,
  `orignr` varchar(40) collate utf8_unicode_ci default NULL,
  `price` float default NULL,
  `stock` float NOT NULL default '0',
  `brand` varchar(100) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`),
  KEY `nr` (`nr`),
  KEY `orignr` (`orignr`),
  KEY `acode` (`acode`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

šalutinė lentelė (242 658 įrašų):

CREATE TABLE IF NOT EXISTS `cms_module_aaproducts_brands` (
  `nr` varchar(25) collate utf8_unicode_ci NOT NULL,
  `brand` varchar(20) collate utf8_unicode_ci NOT NULL,
  `acode` varchar(40) collate utf8_unicode_ci NOT NULL,
  `search` varchar(255) collate utf8_unicode_ci default NULL,
  `modified` datetime NOT NULL,
  `created` datetime NOT NULL,
  KEY `nr` (`nr`),
  KEY `acode` (`acode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Pati užklausa:

SELECT t.* 
FROM cms_module_aaproducts_products t 
LEFT JOIN cms_module_aaproducts_brands b 
    ON b.acode=t.acode 
WHERE (t.name LIKE '%VKM13132%' 
    OR t.acode LIKE '%VKM13132%' 
    OR b.nr LIKE '%VKM13132%') 
    AND t.stock>0 
ORDER BY t.name ASC 
LIMIT 10

Explain gražina tokią informaciją (deja, bet man tai nieko nesako):

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra 
1    SIMPLE    t    index    NULL    name    767    NULL    36515    Using where
1    SIMPLE    b    ref    acode    acode    122    kainynas_autoai.t.acode    18    Using where

Ar matote čias kažkokių netikslumų, kurie galėtu būti lėto užklausos vykdymo priežąstis. Užklausa įvydoma per 7s.

o tai kuom tau netiko jquery dialog variantas (žinoma stilizuotas pagal savo poreikius)?
kitas reikalas, tokį dalyką visai nesudėtinga pačiam su Js pasirašyt. tai man atrodo, kad šiuo atveju tavo darbas gavosi gimdymas per šikną =]

27

(10 replies, posted in PHP)

na aš lygiai taip pat, naudojau savo pateiktą pavyzdį komercijos sistemoje, veikiančioje utf8 koduotėje.

28

(10 replies, posted in PHP)

na visų pirma aš nesuprantu, kodėl tau reikia prašinėt banko, kad tau kažką siuntinėtų..? juk sutartis pasirašyta, parašais esate apsikeitę, tai viskas turėtų veikti automatiškai.
o visų antra, tai kas tau trukdo tesingai konvertuoti duomenis prieš tai, kai su jais kažką darai. arba naudoti duomenų apdorojimui scriptus kaip pateikiau aš, su nurodytom koduotėm, o po to perkoduoti taip kaip reikia tau ir naudoti jau kitose vietose?

29

(10 replies, posted in PHP)

Kažkada man teko su šita nesamone dirbt, tai veikiantį sprendimą pasiekiau taip:
Failas, iš kurio siunčiama informacija į banką

<?php

$HP = array
    (
        'VK_SERVICE'     => '1001', 
        'VK_VERSION'     => '008', 
        'VK_SND_ID'     => '', 
        'VK_STAMP'         => '', 
        'VK_AMOUNT'     => '0.01', 
        'VK_CURR'         => 'LTL', 
        'VK_ACC'         => '', 
        'VK_PANK'         => '73000',
        'VK_NAME'         => '',
        'VK_REF'         => '', 
        'VK_MSG'         => 'Mokėjimas už prekę',
        'VK_MAC'         => '',
        'VK_RETURN'     => '',
        'VK_LANG'         => 'LIT'
    );

$VKMac = array(
    $HP['VK_SERVICE'], 
    $HP['VK_VERSION'], 
    $HP['VK_SND_ID'], 
    $HP['VK_STAMP'], 
    $HP['VK_AMOUNT'], 
    $HP['VK_CURR'], 
    $HP['VK_ACC'], 
    $HP['VK_PANK'], 
    $HP['VK_NAME'], 
    $HP['VK_REF'], 
    $HP['VK_MSG'] );
    
$mac = '';

    foreach($VKMac as $str) {
        $sl = strlen($str);
        if($sl > 0 && $sl < 10) {
            $mac .= "00".$sl.$str;
        }
        if($sl > 9 && $sl < 100) {
            $mac .= "0".$sl.$str;
        }
        if($sl > 99 && $sl < 1000) {
            $mac .= $sl.$str;
        }
    }

$fp = fopen("private.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

openssl_sign($mac, $signature, $pkeyid);
$signature = base64_encode($signature);
$signature = preg_replace("/[\r|\n]/", "", $signature);
openssl_free_key($pkeyid);
    
$HP['VK_MAC'] = $signature;

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

<head>

<title>BankLink</title>


<base href="" />
<meta name="Generator" content="" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1257" />
<meta name="keywords" content="" />
<meta name="description" content="" />

</head>

<body>

<div><?php echo $mac; ?></div>

<div class="container">
    <form name="bankLinkForm" action="https://ib.swedbank.lt/banklink/" method="post">
    
<?php

    foreach($HP as $key => $value) {
        echo '<input style="width: 300px;" type="text" name="'.$key.'" value="'.$value.'" /><br />'."\n";
    }

?>
        
        <button type="submit">siųsti</button>
    </form>
</div>

</body>
</html>

Failas, kuris priima informaciją

<?php
header('Content-Type: text/html; charset=ISO-8859-13');

$HP = $_POST;

$VKMac = array(
    $HP['VK_SERVICE'], 
    $HP['VK_VERSION'], 
    $HP['VK_SND_ID'], 
    $HP['VK_REC_ID'], 
    $HP['VK_STAMP'], 
    $HP['VK_AMOUNT'], 
    $HP['VK_CURR'], 
    $HP['VK_REC_ACC'], 
    $HP['VK_REC_NAME'], 
    $HP['VK_SND_ACC'], 
    $HP['VK_SND_NAME'], 
    $HP['VK_REF'], 
    $HP['VK_MSG'], 
    $HP['VK_T_DATE'] );

$fp = fopen("cert.pem", "r");
$pub_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_publickey($pub_key);

$mac = '';

    foreach($VKMac as $str) {
        //$str = iconv('ISO-8859-13', 'Windows-1257', $str);
        $sl = strlen($str);
        if($sl > 0 && $sl < 10) {
            $mac .= "00".$sl.$str;
        }
        if($sl > 9 && $sl < 100) {
            $mac .= "0".$sl.$str;
        }
        if($sl > 99 && $sl < 1000) {
            $mac .= $sl.$str;
        }
    }
    
$ok = openssl_verify($mac, base64_decode($HP['VK_MAC']), $pkeyid); 
if ($ok == 1) {
   echo "Good signature"; 
} elseif ($ok == 0) {
   echo "Bad signature"; 
} else {
   echo "Error checking signature"; 
}
openssl_free_key($pkeyid);

?>

Tik va nepamenu ar eilutė

$str = iconv('ISO-8859-13', 'Windows-1257', $str);

būtina ar ne. čia aišku galima pasibandyti ir bus matyti.
Beje, failų koduotė buvo ANSI.

na aš manau, kad tokios alternatyvos nėra, nes tai šiek tiek kertasi su logika. pvz. IN() atveju yra imamos konkrečios reikmės be galimybės daryti logines operacijas, tad ieškant alternatyvos AND atveju, gautūsi marazmas, kaip kažkoks domuo gali būti vienu metu lygus kelioms reikšmės? kad ir tavo pateiktu pavyzdžiu:

tadzius wrote:

where number = 5 and number = 6 and number = 7

todėl, kaip žygis ir minėjo - ieškok klaidų savo duomenų bazės struktūroj, arba tiesiog kažkaip ne taip rašai užklausas.
arba tiesiog jei tau atrodo, jog 5 iš eilės einantys AND yra daug, tai nusiramink - tai nėra daug =]

31

(5 replies, posted in Visa kita)

SELECT name FROM nationalities order by name ORDER BY

taigi iš šios klaidos pranešimo dalies aiškiausiai matosi, kokia užklausa buvo įvykdyta - joje atsirado papildomas order by. taip kad, kaip minde ir sakė, ieškok klaidos tolimesniame kodo vykdyme arba parametrų padavime užklausos įvykdimui.

na man pirmas į galvą šovęs variantas, tai skaldyti eilutę į žodžius ir ieškoti jų DB.

na čia dar klausimas ar apskritai ten yra kažkas blogai, nes kiek aš varčiau puslapį iš išorės, tai jis man veikia tikrai greitai. tad čia gali būti tiesgio jų noras, kad veiktų dar greičiau.
na ačiū už komentarus, kolkas man viskas aišku. reikia laukt, kol pamatysiu sistemą iš vidaus, jei apskritai pamatysiu =]

ir dar vienas dalykas.
memcache skirtas patalpinti į atmintį kažkokią informaciją, kuri dažnai naudojama, o jos generavimui sunaudojama daug resursų. ir iš memcache dokumentacijos supratau, kad tai daroma iš tarkime php script'ų. tad jei man reikalinga informacija guli duomenų bazėje, tai aš pirma ją traukiu iš DB, tuomet saugau atmintyje naudodamas memcache ir kitą kartą tiesiogiai traukiu iš atminties.
o mane domintų kiek kitoks scenarijus: tarkime turime kažkokią masyvią lentelę, kurios ištraukimas ilgai trunka. ar eitų tą lentelę saugoti atmintyje nenaudojant memcache, o naudojant MySQL priemones?

tai aš viską kuo puikiausiai suprantu, tačiau konkrečiai šitie pasiūlymai buvo pateikti iš kliento pusės. tad pirmas mano uždavinys ir yra susirinkti kuo daugiau info apie minėtus servisus, o kai jau turėsiu priėjimą prie jų naudojamo kodo - tada spręsiu, ką tikslinga naudoti, o kur gal tiesiog blogai suprogramuota ar suprojektuota.

na esmė yra ta, kad tų servisų prireiks dedikuotam serveryje su jau veikiančia svetaine. kokius ji modulius naudoja konkrečiai, kol kas nežinau. bet php naudojamiems moduliams pasirinktas http serveris įtakos neturi?

Xcache, kaip suprantu, galima naudot tiek su lighttpd, tiek su apache? o kaip dėl nginx? ar net nėra tikslo su juom naudot?

Norėčiau gauti patyrusių žmonių nuomonę apie title paminėtas technologijas: kokių pranašumų suteikia, kokių problemų sukelia, suderinamumas su kitom technologijom ir t.t.
Iš esmės klausimai būtų sekantys.
kuom pranašesni lighthttpd bei nginx serveriai už tarkime rinkoje populiarų apache ir ar neturi jie kokių trūkumų (tarkim iš programavimo pusės su php)? kaip su nustatymais (alternatyva .htaccess)?
xcache ir memcache. kokios realios naudos jie suteikia? vėlgi, kaip tai įtakoja kodo rašymą?
Sphinx Search. apie šį daiktą beveik išvis nieko nežinau, tik suprantu, kad jis skirtas atlikti full-text paieškai duomenų bazėje. ar tai reikalauja kodo pataisymų? ar duoda realią naudą lyginant su standartinėm MySQL galimybėm.

38

(4 replies, posted in Visa kita)

na aš asmeniškai su kitų kalbų karkasais nedirbęs beveik (tik java spring), bet iš php dabar dirbu su Yii framework. visai patiko, net labiau nei cakephp. ir man atrodo, kad jis labiau į RoR panašus nei cakephp. o iš visų php framework'ų ir greičiausiai veikiantis. veikia tik su php5, nes išnaudoja php objektiškumo galimybes, tad labai patogus.

39

(10 replies, posted in PHP)

nu tai pasidaryk ORDER BY id ASC, ip ASC ir tada su php tikrink ar kartojasi

40

(15 replies, posted in Visa kita)

Aš net esu matęs kaip bando žmonės įsirašyti internetą į flash/cd, perkopijuodami IE shortcut'ą =]