quinta-feira, 22 de novembro de 2012

json_encode transforma string em "null"

Tinha um array $d em PHP assim:
Array ( [0] => xxx27343xxx [1] => MARIA XXX XXXX SILVA [2] => 1 [3] => xxxx2905xxx [4] => 2010-10-20 11:20:09.000000 [5] => 26123837869 [6] => José XXXX Rodrigues )

Quando fazia o json_encode desse array, em vez da string no [6], era apresentado "null". Isso porque "This function only works with UTF-8 encoded data". Aparentemente esses dados estavam em uma codificação diferente de UTF-8, daí o "é" de "José" causa esse erro.
A solução foi simples:

array_walk($d, 'u8');
function u8(&$v, $k)
{
    $v = utf8_encode($v);
}


E aí sim, pude fazer o json_encode sem problemas!

segunda-feira, 12 de novembro de 2012

Programa PHP se comportando como navegador web

Precisava puxar dados de um site, mas era preciso passar pela seleção de diversos parâmetros que são salvos na sessão até que o usuário veja o resultado.
O que fiz foi um fopen, que no exemplo abaixo é feito através de um proxy, peguei o cabeçalho da resposta com o stream_get_meta_data e dentro wrapper_data e busquei pelo comando 'Set-Cookie'. Peguei a string com o Set-Cookie do jeito que veio e coloquei no header das requisições seguintes.

$uf = $_REQUEST['u'];
$mun = $_REQUEST['m'];
if(!$mun || !$uf)
{
    die("m (nome municipio) ou u (sigla UF) nao foi passado.");
}

$authProxy = base64_encode("<proxy_user>:
<proxy_passwd>");
// Création des options de la requête
$opts = array(
   'http' => array (
       'method'=>'GET',
       'proxy'=>'tcp://
<proxy_addr>:<proxy_port>',
       'request_fulluri' => true,
       'header'=>"Proxy-Authorization: Basic $authProxy"
   )
);
// Création du contexte de transaction
$ctx = stream_context_create($opts);

$u = "http://www.obid.senad.gov.br/portais/OBID/conteudo/web/instituicao/index.php?campo_atuacao%5B%5D=st_prevencao&btn_proximo=Proxima+%3E%3E";
$h = fopen($u, 'r', false, $ctx);

$m = stream_get_meta_data($h);

foreach($m['wrapper_data'] as $wd)
{
    if(strpos($wd, 'Set-Cookie') !== false)
    {
        $ck = str_replace('Set-Cookie', 'Cookie', $wd);
    }
}

$opts = array(
   'http' => array (
    'method'=>'GET',
    'proxy'=>'tcp://
<proxy_addr>:<proxy_port>',
    'request_fulluri' => true,
    'header'=>"Proxy-Authorization: Basic $authProxy\r\n" .
        $ck . "\r\n"
   )
);
// Création du contexte de transaction
$ctx = stream_context_create($opts);
$u = "http://www.obid.senad.gov.br/portais/OBID/conteudo/web/instituicao/index.php?ds_estado=" . $uf;
$h = fopen($u, 'r', false, $ctx);

$m = stream_get_meta_data($h);

foreach($m['wrapper_data'] as $wd)
{
    if(strpos($wd, 'Set-Cookie') !== false)
    {
        $ck = str_replace('Set-Cookie', 'Cookie', $wd);
    }
}

$opts = array(
   'http' => array (
    'method'=>'GET',
    'proxy'=>'tcp://
<proxy_addr>:<proxy_port>',
    'request_fulluri' => true,
    'header'=>"Proxy-Authorization: Basic $authProxy\r\n" .
        $ck . "\r\n"
   )
);
// Création du contexte de transaction
$ctx = stream_context_create($opts);

$u = "http://www.obid.senad.gov.br/portais/OBID/conteudo/web/instituicao/index.php?ds_cidade=" . $mun;
$r = file_get_contents($u, false, $ctx);


$r = substr($r, strpos($r, '<ul class="imp">'), strrpos($r, '</ul>'));

print_r($r);