Categoria: Php

Feed desta categoria: php

Por algum motivo,  o cURL estava retornando o erro "413 Request Entity Too Large" ao enviar uma requisição para iniciar a sessão na url https://ws.pagseguro.uol.com.br/v2/sessions.

Segundo a api deles, o token e o e-mail da conta devem ser passados na url, mas a requisição tem que ser via POST. O que é estranho, mas enfim.

 

No fim, o que resolveu foi passar o token e o e-mail também no corpo da requisição, assim:

 

<?php

$data['email'] = 'email@dominio.com';
$data['token'] = '57BE455F4EC148E5A54D9BB91C5AC12C';
$url = 'https://ws.pagseguro.uol.com.br/v2/sessions?'.http_build_query($data);

$ch = curl_init();

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));//pulo do gato

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$ret = curl_exec($ch);
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($ret, 0, $header_len);
$body = substr($ret, $header_len);

Sometimes, one does need to use different versions of PHP, for the sake of maintaining older applications.

To do this, you can use Docker, but since i didn't had the time to learn it (yet), here's the old school way to do it.

With this method, you can have multiple versions of PHP running as apache modules. It means that you can have how many versions you want to. But, you can't have them all running at the same time - you can only choose one and enable it. But you can change it via terminal, with just one command line (well, actually it's three commands, but you can execute them in one line, so..).

 

TL;DR

First, create the famous info.php file, with the phpinfo() inside:

<?php
phpinfo();

If you're in apache, you may create it under /var/www/html.

Once you run it, it will show your current PHP version (mine is 7.0.8-3ubuntu3).

 

Next, you must find the repository of the PHP version that you want to use.
I'll be using 5.3, from this package:

https://launchpad.net/~sergey-dryabzhinsky/+archive/ubuntu/php53

To use it, you must add the ppa to the system. Edit /etc/apt/sources.list, adding these two lines:

deb http://ppa.launchpad.net/sergey-dryabzhinsky/php53/ubuntu xenial main
deb-src http://ppa.launchpad.net/sergey-dryabzhinsky/php53/ubuntu xenial main

(if you're using another ubuntu version than 16.04 (xenial), click in "Technical details about this PPA" in the launchpad page, and follow the guide there)

 

Then, update your system, and install it:

sudo apt update
sudo apt install php53-apache2

 

Lastly, you must disable the current php module, enable the new, and restart apache:

sudo a2dismod php7.0
sudo a2enmod php53
sudo service apache2 restart

Then, run again the info.php, and you'll see your new old php version:
5.3.29-Ubuntu/16.04-SergeyD/13.1

 

When you want to go back to the future, just use:

sudo a2dismod php53
sudo a2enmod php7.0
sudo service apache2 restart

 

You can combine the three commands in just one line:
sudo a2dismod php53 && sudo a2enmod php7.0 && sudo service apache2 restart

 

One thing that you have to remember is that you must install all the modules that you need, since we just installed the core modules of PHP.
For example, to enable mysql, you must run:
sudo apt install php53-mod-mysql

 

You can find all the modules available here:
https://launchpad.net/~sergey-dryabzhinsky/+archive/ubuntu/php53/+packages

 

To install more PHP versions, you must find the PPA's containing the version that you want to install.


O comando list cria variáveis com os nomes passadas como parâmetros, e as popula com os valores do array que também é passado.

Exemplo:


$info = array('Café', 'marrom', 'cafeína');
list($bebida, $cor, $substancia) = $info;
echo "$bebida é $cor e $substancia o faz especial.n";


Retorno: Café é marrom e cafeína o faz especial.


O operador lógico XOR retorna verdadeiro se qualquer um dos valores testados for verdadeiro, mas retorna falso se ambos forem verdadeiros.

Exemplo:


$a = true;
$b = true;
if($a xor $b)
{
echo 'verdadeiro';
}else{
echo 'falso';
}


retorno: falso


O conteúdo entre os acentos graves (não confundir com aspas simples) é executado como o comando shell_exec(), que executa um comando no console.

Exemplo:


$output = `ver`;
echo "<pre>$output</pre>";


/* retorno:
Microsoft Windows [versÆo 6.1.7601]


O operador ternário é formado por um teste ($v1==true), e duas opções. Caso o teste seja verdadeiro, será retornado a opção à esquerda. Caso seja falso, será retornado a opção à direita.

Exemplo:

$v1 = false;
$v2 = ($v1 == true) ? 'sim' : 'nao';
echo $v2;

retorno: nao


O comando do-while é parecido com o while, com a diferença que o teste é feito após executar o bloco de comando.
Assim, no caso abaixo, o bloco é executado só uma vez, pois $i não é maior que zero.

Exemplo:


$i = 0;
do {
echo $i;
} while ($i > 0);



Utilizando o while, o bloco não seria executado nenhuma vez.


$i = 0;
while($i>0)
{
echo $i;
}



O comando switch faz um teste e executa um bloco de código conforme o resultado deste teste. Utiliza-se o break para encerrar o bloco de código a ser executado. Caso nenhum dos testes seja verdadeiro, executa o bloco default. O bloco default não precisa do break.

Exemplo:


$teste = 3;
switch($teste){
case 1:
echo 1;
break;
case 2:
echo 2;
break;
default:
echo 0;
}



O continue é semelhante ao break, com a diferença que o break interrompe a execução do laço (no caso, foreach), e o continue apenas pula a execução atual.

Exemplo:


$arr = array(1, 2, 3);
foreach($arr as $number) {
if($number == 2) {
continue;
}
print "$number,";
}

retorno:1,3,
Se trocássemos o continue por break, o retorno seria apenas 1.


Outra coisa que precisei fazer hoje, foi pegar a miniatura de um vídeo do youtube. Consegui usando php e expressões regulares (viu como serviu pra algo o livro?):
 $embed = '';//código que o youtube disponibiliza. pode ser usado tanto o iframe quanto o embed antigo, com ou sem https.  
 preg_match('/http(s)?:\/\/www.youtube.com\/(v|embed)\/[a−zA−Z0−9]1,}/',$embed,$array_embed); //expressão regular pra pegar só o link e jogar no $array_embed  
 $id_youtube = end(explode('/',$array_embed[0]));//pega somente a última parte do link, que é o código do vídeo $preview_video = "http://img.youtube.com/vi/$id_youtube/0.jpg";//monta o link da imagem. Trocando o 0.jpg por 1 ou 2.jpg dá pra pegar as imagens em tamanhos diferentes.  


É utilizada para criar uma string. Ela se comporta como uma string entre aspas duplas, ou seja, o conteúdo de variáveis será exibido.
Demarcamos o início de uma string assim:


<<TESTE
para demarcar o fechamento, utilizamos exatamente o mesmo texto que foi informado na abertura, sem os caracteres <<<.

 

$array[] = '1';
$array[] = '2';

$string = <<<TESTE
teste de alguma coisa
em várias linhas
item do array: $array[0]
outro item do array: $array[1]
TESTE;


Resultado:

teste de alguma coisa em várias linhas item do array: 1 outro item do array: 2





$num = 3;
$location = 'tree';
$format = 'There are %d monkeys in the %s';
printf($format,$num,$location);


O comando printf recebe um formato de string, e variáveis que serão utilizadas para montar a string que será retornada.

Os caracteres % serão substituídos pelos parâmetros informados, na ordem em que forem aparecendo.

O exemplo acima retorna:

There are 3 monkeys in the tree

Caso os parâmetros não sejam informados na ordem em que eles precisam ser substituídos, precisamos informar qual é o parâmetro que será utilizado:


$format = 'The %2$s contains %1$d monkeys';
printf($format,$num,$location);


O exemplo acima retorna:

The tree contains 3 monkeys


Os tipos de formação são os seguintes:

%b - Binário

%d - Decimal

%f - Float

%o - Octal

%e - Notação Científica

%s - String




Na verdade, não é bem agrupar, e sim colocar dentro de arrays, o que não deixa de ser um certo tipo de agrupamento.
Exemplo: temos esse formulário assim:
Campo 1
Campo 2
Campo 3
Campo 4
Campo 5
O retorno desse formulário vai sair assim:
Array
(
[campos] => Array
(
[campo1] => valor 1
[campo2] => valor 2
[campo3] => valor 3
[campo4] => valor 4
[campo5] => valor 5
)

)


Pena que não dá pra colocar mais sub-arrays, mas já é algo.

Basta colocar este bloco de comentários antes da definição da função:

1:  /**   
2:   * contarDiffHoras  
3:   *  
4:   * conta a diferença em horas entre a data informada e a data do sistema  
5:   * obs: sempre uma data no passado  
6:   *  
7:   * @param string $data a data para comparar no formato d/m/Y H:i  
8:   */  


Fica assim:

1:  /**   
2:   * contarDiffHoras  
3:   *  
4:   * conta a diferença em horas entre a data informada e a data do sistema  
5:   * obs: sempre uma data no passado  
6:   *  
7:   * @param string $data a data para comparar no formato d/m/Y H:i  
8:   */  
9:  function contarDiffHoras($data){  
10:       $data = date_create_from_format('d/m/Y H:i', $data);//data informada  
11:       $now = date_create();//data atual  
12:       $diff = date_diff($now, $data);//calcula a diferença entre as datas  
13:       return ($diff->format('%a') * 24) + $diff->format('%H');//calcula a diferença em horas  
14:  }  

E, no Netbeans, aparece assim:

Primeiro, precisamos do cliente da api do google em php, no seguinte link:

https://github.com/google/google-api-php-client

Incluímos a biblioteca e instanciamos a classe, assim:

 set_include_path(get_include_path() . PATH_SEPARATOR . '/home/ferramen/public_html/src');  
 require_once 'Google/Client.php';  
 require_once 'Google/Service/Urlshortener.php';  
 $client = new Google_Client();  
 $client->setApplicationName("API Project");//nome do seu projeto  
 $client->setDeveloperKey("sua_developer_key");sua chave de autenticação no google developer  
 $service = new Google_Service_Urlshortener($client);  
 $url = new Google_Service_Urlshortener_Url();  
 $url->longUrl = $link; //$link contém a url original  
 $shortUrl = $service->url->insert($url);  



Após isso, é só acessar as propriedades do objeto $shorUrl pra pegar o link encurtado. Não lembro agora quais são, mas um var_dump nesse objeto resolve.

Também precisa ter uma conta no Google Developers, pra pegar a chave de autenticação.

What the following code will print out?

 echo true ? 'a':true ? 'b' : 'c';  


//resposta: b
//a condição "true ? 'a':true" é avaliada como true
//e por isso retorna 'b', pois é a opção da esquerda