Archive for the skriptai Category

Trumpas, paprastas būdas, kaip ištrinti iš mysql duomenų bazės pasikartojančius įrašus, t.y., eilutes, kuriose tam tikro stulpelio duomenys yra vienodi.

Tam yra įvairių mysql užklausų, man labiausiai priimtina ši:

ALTER IGNORE TABLE lentele ADD UNIQUE INDEX(stulpelis);

Įvykdžius šią užklausą, turėtų būti ištrintos eilutės, sutampančios nurodytame stulpelyje.

Viena iš varginančių problemų kuriant lietuvišką svetainę su UTF koduote - lietuviškų raidžių pradingimas, nors duomenų bazėje viskas atrodo gerai (UTF-8 koduote). Tai gali būti dėl kelių priežasčių:

nenustatyta puslapio koduotė

failas išsaugotas ne UTF koduote

standartinė serverio koduotė yra ne UTF

Pastarajam variantui ilgus metus tekdavo naudoti papildomą mysql užklausą SET NAMES iškart po prisijungimo prie bazės:

$conn = mysql_connect($host, $user, $pass) or die (”Service temporarily unavailable”);
mysql_select_db($db, $conn) or die;
mysql_query(”SET NAMES ‘utf8′”);

Talpinant svetainę pigiame hostinge, kur labai ribojamas mysql užklausų skaičius (pvz., mano svetainė yra smarkiai lankoma, o hostingas leidžia atlikti tik10.000 užklausų per valandą), tenka taupyti kiekvieną užklausą ir baisiai nesinori jų naudoti, jei nėra būtina. Nuo PHP5 atsiradimo SET NAMES užklausos galima išvengti naudojant PHP funkciją mysql_set_charset:

mysql_set_charset(’utf8′,$conn);

Ji padeda rodyti normalias lietuviškas raides UTF-8 koduotėje iš Mysql bazės su ta pačia koduote.

Norint, kad, pavyzdžiui, komentaruose nebūtų per ilgų (dažniausiai beprasmiškų) žodžių (tokių kaip “ooo-ooo-ooo-oooooooo” ir pan.), tekstą galima įvairiais būdais nuo to išvalyti - jei iš eilės eina daugiau nei nustatyta simbolių, automatiškai įterpiamas tarpas.

Paprasčiausias būdas tai padaryti - funkcija wordwrap:

Naudojimo pavyzdys:

function skaldom($tekstas, $limit)
{
$zodziai = explode(’ ‘, $tekstas);
foreach($zodziai as $v)
{
if(strlen($v) > $limit)
{
return false;
}
}
return true;
}

Naudojimas:

$tekstas=skaldom($tekstas, 25);

Šiuo atveju maksimalus iš eilės einančių simbolių skaičius yra 25. Jei bus daugiau, žodis bus suskaldytas įterpiant tarpo simbolį.

Viena iš teksto filtravimo funkcijų - strip_tags. Ji skirta pašalinti HTML ir PHP simbolius iš teksto. Lieka švarus, saugus tekstas be jokių papildomų kodų.

Tačiau kai kurias HTML elementus yra galimybė palikti, pvz., paryškinimus ir t.t. Labai naudinga funkcija valant tekstus komentaruose, formose ir kitur, kur gali pasitaikyti nepageidaujamų elementų.

Itin elementarus kodas, kaip padaryti reklamos rotaciją, t.y., kad kiekvieną kartą būtų rodoma atsitiktinė reklama.

Šiuo atveju reklamų (banerio ar kt.) kodai surašomi atskiruose puslapiuose (1.php, 2.php ir t.t.).

Taigi štai koks super sudėtingas algoritmas:

<?php

$x=rand(0,2);

if($x==0){ include (”1.php”); }

elseif($x==1){ include (”2.php”); }

else { include (”3.php”); }

?>

Naudojamos funkcijos: rand ir if/elseif/else.

Yra daug būdų patikrinti, ar adresas tuo metu yra pasiekiamas. Vienas iš jų – su Curl.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $nuoroda);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,8);

// sekundžių skaičius – kiek laiko bandyti jungtis prie

// adreso. Kuo trumpesnis laikas, tuo lengviau

// apsirikti – gauti atsakymą, kad svetainė neveikia, nors

// faktiškai veikia  

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$atsakas = curl_exec($ch);

curl_close($ch);

if ($atsakas==false){echo „Adresas $url nepasiekiamas“;}

Štai kaip. Bet yra ir kitų būdų, čia labai paprasti, bet dažnai praverčiantys dalykai.

Dar, pavyzdžiui, galima su tokia paprasta funkcija (kadangi CURL kai kuriuose serveriuose su “safe mode” normaliai neveikia): 

if(is_array(@get_headers($adresas))){
echo “OK”;
}else{
echo “blogai”;
}

Neilgas, bet ne itin paprastas kodas, skirtas ištraukti visas nuorodas iš teksto/puslapio kodo. Naudingas indeksuojant nuorodas, darant savo paieškos sistemą ir panašiais atvejais, kai reikia “išžvejoti” iš didelio teksto tik nuorodas ir kiekvienos nuorodos tekstą.

Paprastai tai daroma su reguliariais reiškiniais, konkrečiai - preg_match_all funkcija (kito normalaus būdo neteko bandyti). Skriptas atsižvelgia į įvairius variantus nuorodos kode, pvz.., target=”_blank”, “title” žymas - ištraukia tik adresą ir nuorodos tekstą:

function nuorodos($s)
{
$a = array();

if(preg_match_all(’/<a\s+.*?href=[\”\’]?([^\”\’ >]*)[\”\’]?[^>]*>(.*?)<\/a>/i’,$s,$traukiam,PREG_SET_ORDER))
{
foreach($traukiam as $yra)
{
array_push($a,array($yra[1],$yra[2]));
}
}
return $a;
}

$tekstas =<<<EOD
bele koks tekstas <a href=”http://www.google.com”>pirma nuoroda</a>
visokie beprasmiski zodziai <a href=”http://www.google.de”>antra nuoroda</a>
kuriuos reikia isfiltruoti <a href=”http://www.yahoo.de”>trecia nuoroda</a> pet
kad liktu tik nuorodos <a target=”_blank” href=”http://www.one.lt”>ketvirta nuoroda</a>
<a href=”http://www.delfi.lt”>penkta nuoroda</a>

ggg … dar siek tiek bele kokio teksto…
EOD;

$links = nuorodos($tekstas);
$kiek=count($links);

for ($i = 0; $i < $kiek; $i++) {
echo $links[$i][0].” (”.$links[$i][1].”)<br>”;
}

Rezultatas turėtų gautis toks:

http://www.google.com (pirma nuoroda)
http://www.google.de (antra nuoroda)
http://www.yahoo.de (trecia nuoroda)
http://www.one.lt (ketvirta nuoroda)
http://www.delfi.lt (penkta nuoroda)

(Skliausteliuose - nuorodos tekstas).

Skriptas, naudojamas atsisiųsti video klipus iš Dailymotion.com, minėtas pirmoje dalyje:

Pirmiausia pasiimam Dailymotion puslapio su klipu adresą, pvz., http://www.dailymotion.com/video/x44ls3_suikoden-5-a-lot-to-make-up-for_videogames .

Iš šios nuorodos reikia ištraukti videoklipo ID, jis yra prieš ženklą _ , šiuo atveju x44ls3. Tai, kas yra į dešinę nuo ženklo _ , galima sėkmingai ištrinti, puslapio adresas laisvai gali būti ir http://www.dailymotion.com/video/x44ls3

Tarkim, visa nuoroda perduodama tiesiog su adresu, per GET, kaip kintamasis adr:

if(strpos($_GET[’adr’],”_”)!==false){
$idas=explode(”_”,$_GET[’adr’]);
$pr=explode(”/”,$idas[0]);
$kiek=count($pr)-1;
$id=$pr[$kiek];
}
else {
$pr=explode(”video/”,$_GET[’adr’]);
$id=$pr[1];
}

Kadangi adresas gali būti ir su _ , ir be, norint sužinoti klipo ID, tenka daryti kelis variantus.

Kai jau turim ID, jungiamės prie to puslapio su klipu (beje, sužinoti ID nėra būtina, čia nebent tik kaupiant informaciją apie atskirus klipus) ir ieškom kode slaptos info apie klipo adresą. Patogiausia tam panaudoti preg_match funkciją:

if($id){

$psl=@file_get_contents(’http://www.dailymotion.com/video/’.$id);
if($psl){
preg_match(”/%2Fget%2F(.*?)%40%40/”,$psl,$slaptas);
$adr=”http://www.dailymotion.com/get/”.urldecode($slaptas[1]);

$session = curl_init($adr);
curl_setopt($session, CURLOPT_HEADER, true);
curl_setopt($session, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9′);
curl_setopt($session,CURLOPT_NOBODY, true);
curl_setopt($session, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($session, CURLOPT_TIMEOUT, 4);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($session);
$error = curl_error($session);
$result = array( ‘header’ => ”);

if ( $error != “” )
{
$result[’curl_error’] = $error;
}
else
{

$hdr = curl_getinfo($session,CURLINFO_HEADER_SIZE);
$result[’header’] = substr($response, 0, $hdr);
preg_match(’/Location:(.*?)\n/’, $result[’header’], $matches);
}
}

pačios pabaigos nerašysiu, nes ji labai elementari - čia tik užvedimas ant kelio, ne pilnas skriptas (nors faktiškai 99%).

Šis skriptas naudojamas mano svetainėje http://download.uzeik.net/ , per kurią galima atsisiųsti bet kokius patikusius klipus iš populiariausių užsienio ir lietuviškų video portalų - Youtube, Dailymotion, Vaizdelis.lt, Videogaga.lt, Myspace ir kt.

Kaip atsisiųsti klipus iš Youtube, yra daugybė nemokamų skriptų ir instrukcijų. Youtube visai nesistengia kovoti su mėgėjais atsisiųsti klipus, nors oficialiai to niekada neleido ir netoleruoja. Maža to, visas Youtube turinys yra atviras, tad panaudojant RSS srautus sukurti 100% Youtube kloną, kuriame būtų visi Youtube klipai - juokų darbas. Tokių klonų yra devynios galybės ir jie gerokai šiukšlina internetą, bet ką padarysi.

Iš Dailymotion siųstis klipus kur kas sudėtingiau -jie pridarė visokių apsaugų, proksių ir kitokios velniavos, kad tik būtų kuo sunkiau. Oficiali Dailymotion pozicija - galimybės išsaugoti (atsisiųsti) klipus nėra dėl galimų autorių teisių pažeidimų.

Vis dėlto atsisiųsti klipus iš Dailymotion nėra problema. Antroje dalyje pateikiama skripto ištrauka, naudojama minėtoje svetainėje.

Filtravimas, leidžiant, kad būtų tik lotyniškos raidės + skaitmenys, taip pat kabutės, apostrofas ir kt. reikalingi simboliai, t.y., išfiltruoti tokias frazes, kuriose yra nelotyniškų simbolių:

preg_match(’/^[a-z0-9\”\’]+$/iD’, $s);

Pvz.:

<?php
$s=”zodis”;
if (preg_match(’/^[a-z0-9\”\’]+$/iD’, $s))
{
echo ‘OK’;
}
else
{
echo ‘Blogai’;
}
?>