Categories
Programação

Executando Queries com PDO

Para executar uma query SQL vamos usar o método query() da classe PDO, que irá nos rertornar um objeto da classe PDOStatement.

Então vamos lá, executar a query e guardar o resultado em $statement:

$statement = $pdo->query("SELECT city.Name, city.CountryCode, city.District, city.Population FROM world.city");

var_dump($statement);

E aqui está a saída do var_dump() com um objeto da classe PDOStatement:

object(PDOStatement)#2 (1) { ["queryString"]=> string(82) "SELECT city.Name, city.CountryCode, city.District, city.Population FROM world.city" }

Continuando… Já temos um objeto do tipo PDOStatement, e o que fazermos como ele?

Vamos conhecer agora alguns métodos pertencentes a sua classe PDOStatement, começando pelo fetch() que busca a primeira linha retornarda da nossa query:

$one_row = $statement->fetch();
var_dump($one_row);

Como saída na tela, temos um array:

array(4) { ["Name"]=> string(5) "Kabul" ["CountryCode"]=> string(3) "AFG" ["District"]=> string(5) "Kabol" ["Population"]=> int(1780000) }

Vamos agora converter esse array para um objeto JSON, e deixar essa saída pronta para ser recuperada por qualquer outra parte do sistema, como o front-end. Para isso basta substituir nosso var_dump() por um json_encode():

$one_row = $statement->fetch();
echo json_encode($one_row);

E aqui está a informação pronta para se consumida:

{
    Name: "Kabul", 
    CountryCode: "AFG",
    District: "Kabol", 
    Population: 1780000
}

Aqui já temos algo útil para uso, mas… Calma aí. Até agora viemos trabalhando com POO, usando classes, métodos e objetos… E então recebemos esses dados em um array antes de passá-los adiante. Por que?

O que ocorre é que o retorno padrão do metódo fetch() é um array. Isso não chega a ser um problema se você quiser logo depois imprimir as informações em formato JSON, uma vez que a função json_encode() recebe justamente um array.

Mas e se quisermos receber do fetch() um objeto ao invés de um array? É fácil:

$one_row = $statement->fetch(true);
var_dump($one_row);

Dessa vez passamos no método fetch() um parâmetro booleano com “true”. Isso vai nos garantir que o retorno seja um objeto. Vamos de novo a saída…

object(PDORow)#3 (5) { 
    ["queryString"]=> string(82) "SELECT city.Name, city.CountryCode, city.District, city.Population FROM world.city" 
    ["Name"]=> string(5) "Kabul" 
    ["CountryCode"]=> string(3) "AFG" 
    ["District"]=> string(5) "Kabol" 
    ["Population"]=> int(1780000) 
}

Legal, agora temos um objeto PDORow, com cinco atributos, sendo o primeiro “queryString” a query SQL que foi executada, e os demais cada uma das colunas que vieram da query. Vamos imprimir cada coluna, e ver código completo até aqui, incluindo o que foi feito nos posts anteriores:

$dsn = "mysql:host=localhost;dbname=world;port=3306;charset=utf8mb4";
    
$username = 'my_username';
$password = 'my_password';
        
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
        
try {
     $pdo = new PDO($dsn, $username, $password, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

$statement = $pdo->query("SELECT city.Name, city.CountryCode, city.District, city.Population FROM world.city");

$one_row = $statement->fetch(true);

echo $one_row->Name;
echo $one_row->CountryCode;
echo $one_row->District;
echo $one_row->Population;

Como saída temos agora:

Kabul AFG Kabol 1780000

Poderíamos até concatenar no final de cada echo ali em cima uma tag <br> para quebrar linhas e organizar melhor a informação impressa, mas isso começaria a sujar nosso código de backend, que deve somente buscar a informação no banco de dados.

Vamos então devolver a informação em formato JSON:

$one_row = $statement->fetch(true);
$one_object_json = array(
    $one_row->Name, 
    $one_row->CountryCode, 
    $one_row->District, 
    $one_row->Population
);
echo json_encode($one_object_json);

Se você leu o código com atenção, percebeu que eu coloquei cada um dos atributos: Name, CountryCode, District e Population dentro de um novo array, através da função array(), isso é devido ao fato da função json_encode() realmente precisar de um array como parâmetro de entrada.

Aqui está a saída:

[
    "Kabul",
    "AFG",
    "Kabol",
    1780000
]

Como visto, quando se trata de passar os dados obtidos para frente como JSON, não há vantagem em retornar um objeto no método fetch(). Mas então, como trabalhar com um objeto ao invés de um array e conseguir um retorno em JSON de forma fácil em PDO?

Vamos resolver isso no próximo post, com a criação de uma pequena mas poderosa classe! “A classe esquecida do PDO”.

Leave a Reply

Your email address will not be published. Required fields are marked *