31 decembrie 2008

Cautare in diacritice

Lucrez la un site la care a trebuit sa fac cautare pe campuri text in care existau diacritice. Asa ca am facut clasicul SELECT FROM table WHERE field LIKE '%cautare%' , care mi-a dat buba, cautarea dupa 'mâna' (membru superior), am scris 'mana', si logic ca nu a gasit, asa ca am introdus in DB un camp suplimentar "field_fd" care sa contina textul fara diacritice, pe care l-am completat filosind
function diac($s) {
$p = array("ã","º","þ","î","â","Ã","ª","Þ","ă","ş","ţ","î","â","Ă","Ş","Ţ","Î","Â");
$r = array("a","s","t","i","a","A","S","T","a","s","t","i","a","A","S","T","I","A");
$ds = str_replace($p, $r, $s);
return $ds;
}
Asta va fi ultimul post pe 2008 asa ca  http://www.dancingsantacard.com/?santa=6591466  

Incarcare in MySQL pentru fisiere CSV de dimensiuni mari

Am avut o "mica" problema, de vreo 100 Mb, un fisier CSV care trebuia importat intr0o baza de date MySQL din  PHPMyAdmin sau script PHP.
Fisierul CSV se gaseste la
http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity_20081201.zip
Daca foloseam :
<?php
$file=file_get_contents("blocks.csv"); $rows=explode("\n",$file);
foreach($rows as $r) mysql_query("INSERT INTO geolocate
VALUES($r)");?>

se genera Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes), si chiar daca nu aparea asta, sigur aparea limitarea timpului de executie a scriptului PHP (de obicei 30 secunde). Mai tarziu a venit si ideea :
Creez tabelele :
 
CREATE TABLE `blocks` (
  `ipn1` int(11) NOT NULL,
  `ipn2` int(11) NOT NULL,
  `locid` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
CREATE TABLE `location` (
  `locid` int(11) NOT NULL,
  `country` varchar(5) NOT NULL,
  `region` varchar(5) NOT NULL,
  `city` varchar(150) NOT NULL,
  `postcode` varchar(20) NOT NULL,
  `lat` int(11) NOT NULL,
  `lng` int(11) NOT NULL,
  `metro` varchar(11) NOT NULL,
  `area` varchar(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
fac upload la fisierele CSV prin FTP,  si apoi
 
<?php 
 mysql_query("LOAD DATA INFILE 'path/blocks.csv' REPLACE INTO TABLE blocks FIELDS ENCLOSED BY '\"' TERMINATED BY ','") or die('Invalid query: ' . mysql_error());
 mysql_query("LOAD DATA INFILE 'path/location.csv' REPLACE INTO TABLE location FIELDS OPTIONALLY ENCLOSED BY '\"' TERMINATED BY ','") or die('Invalid query: ' . mysql_error());
?>

18 decembrie 2008

Verificare disponibilitate video Youtube

Exista destule video-uri de pe YouTube pe bloguri/siturie. Si stiti ce neplacut e cand descoperiti dupa un timp ca multe dintre ele nu mai sunt disponibile (cu pateticul black screen of death "We're sorry, this video is no longer available"). Solutia (PHP) este :
function curl_get_file_contents($URL)
{
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c) or die("SIZE ERROR<script type='text/javascript'>var t=setTimeout('timeFct()',5000)</script>");
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}

function urlfilesize($url,$thereturn) {
if (substr($url,0,4)=='http') {
$x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
$x = $x['content-length'];
}
else { $x = @filesize($url); }
if (!$thereturn) { return $x ; }
elseif($thereturn == 'mb') { return round($x / (1024*1024),2) ; }
elseif($thereturn == 'kb') { return round($x / (1024),2) ; }
}
$vtemp = $_GET['v'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.youtube.com/watch?v=".$vtemp);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
$info= curl_exec($ch);
$lun = strlen($info);
$pos1 = strpos($info,"&t=",$pos1);
$Stri=substr($info, $pos1+3, 32);
if($Stri!='') echo "Disponibil"; else echo "Indisponibil";


[EDITARE 19-12-2008] Sunt stupid, functiile nu isi au locul aici ! Asa ca codul poate incepe de la $vtemp = $_GET['v'];