Vous êtes sur la page 1sur 18

Curso Completo de PHP PDO

Sejam todos bem vindos (as) ao curso de PDO PHP Data Objects Requisito: Para comear o curso de PDO, aconselho que veja antes, todas as aulas do curso de HTML, php, Banco de dados MYSQL. Ttulo das Aulas + links abaixo: Curso PDO Aula 01 Introduo Curso PDO Aula 02 Conexo com PDO Curso PDO Aula 03 Selecionando Dados com PDO Curso PDO Aula 04 Cadastrando Dados com PDO Curso PDO Aula 05 Deletando Dados com PDO Curso PDO Aula 06 Atualizando Dados com PDO

Aula 01 Introduo
Hoje iremos comear nosso curso exclusivo de PDO (PHP Data Objects). O PDO vem dominando o mercado no mundo dos programadores PHP, e por este motivo no pode ficar para trs correto? Neste curso iremos aprender a fazer um CRUD ( create | read | update | delete criar | ler | atualizar | deletar) completo com PDO, e mais. Iremos tambm fazer comparaes com o modo primitivo do PHP, assim todos ns iremos atender as diferenas entre ambos.

Qual a vantagem do uso do PDO?


Imagine que voc criou um sistema utilizando o modo primitivo do php, e o tipo de banco de dados utilizado foi o MYSQL. Depois de muito tempo, seu cliente, fala pra voc que o banco de dados agora ser do tipo ORACLE. Particularmente, voc teria de mudar diversas pginas correto? Com o PDO j diferente, pois o prprio trabalha com drivers de banco de dados, ou seja, para solucionar o problema de seu cliente utilizando PDO, bastaria modificar apenas o arquivo de conexo com o banco de dados, informando o driver desejado. Com PDO, podemos ficar mais tranquilos co-relao a vulnerabilidades , pois com a utilizao do prprio , poderemos evitar situaes de SQL Injection. Est gostando? Continue acompanhando o curso, pois este apenas o inicio. Gostaria de comprar um curso online conosco, e no conhece nosso campus virtual? Visite: http://www.escolacompleta.com/campus Continuao vamos a uma rpida introduo do PDO.
Introduo

O PHP Data Objects ( PDO ) define uma interface leve em PHP. Cada driver de banco de dados que implementa a interface PDO pode expor dados de recursos especficos. Note que voc no pode executar quaisquer funes de banco de dados usando a extenso PDO, por si s, voc deve usar um banco de dados especfico do driver PDO para acessar um servidor de banco de dados. PDO fornece um acesso de dados abstrato, o que significa que, independentemente de qual banco de dados voc est usando, voc usa as mesmas funes para emitir consultas e buscar dados (CRUD).

Aula 02 Conexo com PDO


Nesta aula iremos aprender a criar uma conexo com o banco de dados utilizando o PDO, lembrando que faremos comparaes do modo primitivo e o modo PDO. De fato uma conexo primitiva sem a utilizao do PDO, ficaria como o exemplo abaixo:

<?php $host = "localhost"; $user = "root"; $pass = ""; $bd = "banco_teste";

$conexao = mysql_connect($host,$user,$pass) OR DIE ("Erro ao conectar com o banco de dados: ".mysql_error());

if($conexao){ mysql_select_db($bd) OR DIE ("Erro ao selecionar banco de dados: ".mysql_error()); }else{} ?>

De certa forma o modo primitivo menos complexo, e mais rpido de ser desenvolvido, contudo existem desvantagens. Uma delas a vulnerabilidade; Outra questo o famoso cdigo macarro; E mais uma a questo de tempo longo para mudanas de tipos de banco de dados. Veja agora como criar sua conexo com banco de dados utilizando o PDO, baseando-se no exemplo acima.
<?php $host = "localhost"; $user = "root"; $pass = ""; $bd = "banco_teste"; /*O que o PDO pede na conexao? ex: PDO($dsn,$user,$pass); mais o que dsn ? dsn = tipo_do_banco:host='seu_host';dbname='nome_do_seu_banco'; */ $dsn = "mysql:host=".$host.";dbname=".$bd; try{ $conexao = new PDO($dsn,$user,$pass); $conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $conexao; }catch(PDOException $error){ echo "Erro ao conectar com o banco de dados: ".$error->getMessage();

} ?>

O que o PDO pede de diferente na conexo?


ex: PDO($dsn,$user,$pass);
Como funciona a estrutura do dsn ?

A estrutura do dsn funciona da seguinte forma: ex: $dsn = tipo_do_banco:host=seu_host;dbname=nome_do_seu_banco; resultado: $dsn = mysql:host=localhost;dbname=banco_teste; At ai tudo bem mas o que quer dizer est linha:
$conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

setAttribute Define um atributo na declarao. Para ver a lista de atributos clique aqui. PDO::ATTR_ERRMODE relatrio de erros. PDO::ERRMODE_EXCEPTION - Atributo filho do atributo ATTR_ERRMODE , este representa um erro gerado pelo PDO.
Endentendo os atributos

Quando voc define um atributo no PDO, os prprios possuem valores padres, e filhos nicos. A sintaxe para a utilizao funciona da seguinte forma: setAttribute(atributo, filho_do_atributo); Para isso, veja a lista abaixo , que seta os atributos , e seus filhos alheios.
1. PDO::ATTR_CASE nomes de colunas fora para um caso especfico. o Filhos do atributo PDO::ATTR_CASE o PDO::CASE_LOWER Fora nomes de coluna para minsculas. o PDO::CASE_NATURAL nomes de colunas deixar como retornados pelo driver de banco de dados. o PDO::CASE_UPPER nomes de colunas fora para maisculas. 2. PDO:: ATTR_ERRMODE relatrio de erros. o Filhos do atributo PDO :: ATTR_ERRMODE o PDO::ERRMODE_SILENT Basta definir cdigos de erro. o PDO::ERRMODE_WARNING Levante E_WARNING. o PDO::ERRMODE_EXCEPTION Throw excees. 3. PDO::ATTR_ORACLE_NULLS (disponvel com todos os drivers, e no apenas da Oracle): Converso de strings nulas e vazias. o Filhos do atributo PDO :: ATTR_ORACLE_NULLS o PDO::NULL_NATURAL No converso. o PDO::NULL_EMPTY_STRING string vazio convertido para NULL . o PDO::NULL_TO_STRING NULL convertido para uma cadeia vazia.

Existem muitos atributos e seus alheios , para isso saiba mais no site do oficial do php clicando aqui. Agora que sabemos mais sobre os atributos devemos saber sobre est linha:
}catch(PDOException $error){

O que o PDOException? Ele representa um erro gerado pelo PDO. Desta forma estamos atribuindo o erro gerado pelo PDO varivel Desta forma devemos apenas chamar a mensagem de error utilizando a varivel $error

$error.

Observem que para mostrar a mensagem de error gerada, eu utilizei:


$error->getMessage();

Mas o que o getMessage()? getMessage() Obtm a mensagem da exceo.

Aula 03 Selecionando Dados com PDO


Nesta aula iremos aprender a fazer a seleo, ou listagem de dados com PDO. Lembrando que iremos fazer as comparaes e observaes devidas com o modo primitivo do PHP. Primeiramente temos o primeiro exemplo, onde iremos fazer a seleo dos dados utilizando o modo primitivo do php. Veja o exemplo abaixo:
< ?php include_once("conexao.php"); /*incluindo arquivo de conexao da aula passada*/ $sql = "SELECT * FROM alunos"; $query = mysql_query($sql);

if(mysql_num_rows($query) > 0){ while($linha_alunos = mysql_fetch_array($query)){ echo $linha_alunos['nome_aluno']."<br />"; } }else{} ?>

Simples no? Lembrando que fizemos a incluso do arquivo de conexo da aula passada. Se voc no visitou a aula passada clique aqui. Agora que voc j sabe como funciona a seleo de dados utilizando o modo primitivo, iremos agora fazer o mesmo utilizando o PDO. Primeiramente iremos fazer uma seleo comum sem a utilizao de condies (WHERE).

SELEO COMUM COM PDO


< ?php include_once("conexao.php"); function listar_alunos(){ try{ $listar = $conexao->query("SELECT * FROM alunos"); $listar->execute();

if($listar->rowCount() > 0){ return $listar->fetchAll(PDO::FETCH_ASSOC);

}else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos();

foreach($alunos as $aluno): echo $aluno['nome_aluno']."<br />"; endforeach; ?>

Voc poderia tambm, utilizar o FETCH_OBJ ao invs de FETCH_ASSOC , contudo nosso foreach ficaria desta forma:
foreach($alunos as $aluno): echo $aluno->nome_aluno."<br />"; endforeach;

O resultado de todo o cdigo utilizando FETCH_OBJ seria:


< ?php include_once("conexao.php");//inclusao do arquivo de conexao da aula passada function listar_alunos(){ try{ $listar = $conexao->query("SELECT * FROM alunos"); $listar->execute();

if($listar->rowCount() > 0){ return $listar->fetchAll(PDO::FETCH_OBJ); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } }

$alunos = listar_alunos();

foreach($alunos as $aluno): echo $aluno->nome_aluno."<br />"; endforeach; ?> <h3>SELEO COMPOSTA COM PDO</h3> A seleo composta j diferente, pois iremos utilizar <strong>condies</strong> , e devemos utilizar o <strong>prepare</strong> do PDO. O mtodo <strong>query</strong> utilizado apenas para selees comuns que no envolvem condies (WHERE). Exemplo de seleo composta: <?php include_once("conexao.php");//inclusao do arquivo de conexao da aula passada function listar_alunos_com_condicao(){ try{ $idade = 15;/*aqui defini a idade desejada para condicao*/ $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = :idade"); $listar->bindValue(":idade",$idade);/*O bindValue protege os dados que voc est passando , seta o valor para o parametro.*/ $listar->execute();

if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos_com_condicao();

foreach($alunos as $aluno): echo $aluno['nome_aluno']."<br />";

endforeach; ?>

Observem que no exemplo acima, eu no utilizei o fetchAll, mas sim apenas o fetch, pois estou querendo retornar apenas um valor especfico informado em minha condio. Lembrando tambm que ao invs de utilizar bindValue, podemos utilizar tambm bindParam, que ir retornar o mesmo valor , contudo voc poder tambm especificar o tipo do parmetro ( type ) passado e o tamanho ( lenght ) . Exemplo:
$listar->bindParam(":idade",$idade,PDO::PARAM_INT,3);

Desta forma estou especificando que o valor passado do tipo inteiro (PARAM_INT), e o tamanho 3. Ou seja, no existe pessoa com idade maior que 3 digitos correto? (Por favor, no inclua as mmias neste rolo).
E para tipos strings? Como seria?
$listar->bindParam(":aluno_nome",$aluno_nome,PDO::PARAM_STR, 255);

J no exemplo acima, estou informando que o parmetro aluno_nome do tipo string(PARAM_STR) e o tamanho mximo de 255 caracteres. Caso queiram saber mais sobre bindParams clique aqui Agora, irei mostrar uma situao que muitos alunos tm dvida. O famoso ponto de interrogao. Quando passamos parmetros, podemos tambm utilizar o ponto de interrogao, e logo aps a posio do ndice que pretendemos atribuir o valor corrente. Exemplo:
<?php include_once("conexao.php"); function listar_alunos_com_condicao(){ try{ $idade = 15; $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ?"); $listar->bindValue(1,$idade); $listar->execute();

if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); }

} $alunos = listar_alunos_com_condicao();

foreach($alunos as $aluno): echo $aluno['nome_aluno']."<br />"; endforeach; ?>

Vejam que as linhas modificadas foram as listadas abaixo:


$listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ?"); $listar->bindValue(1,$idade);/*O bindvalue protege os

Contudo, fica a pergunta. E se eu quisesse passar dois parmetros na condio? Como ficaria?

Veja o exemplo abaixo:


<?php include_once("conexao.php"); function listar_alunos_com_condicao(){ try{ $idade = 15; $sobrenome = "Alberto"; $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ? AND sobrenome = ?"); $listar->bindValue(1,$idade); $listar->bindValue(2,$sobrenome); $listar->execute();

if($listar->rowCount() > 0){ return $listar->fetch(PDO::FETCH_ASSOC); }else{ echo "No existem alunos cadastrados na base."; } }catch(PDOException $error){ echo "Error ao listar alunos: ".$error->getMessage(); } } $alunos = listar_alunos_com_condicao();

foreach($alunos as $aluno): echo $aluno['nome_aluno']."<br />"; endforeach; ?>

Concluindo nosso exemplo, vejam as linhas alteradas.


$sobrenome = "Alberto"; $listar = $conexao->prepare("SELECT * FROM alunos WHERE idade = ? AND sobrenome = ?"); $listar->bindValue(1,$idade);/*O bindvalue protege os dados que voc est passando.*/ $listar->bindValue(2,$sobrenome);

Viram como simples fazer seleo com o PDO?

Aula 04 Cadastrando Dados com PDO


Nesta aula iremos aprender a fazer cadastros com o PDO. Primeiramente veremos um exemplo utilizando o modo primitivo do php.

CADASTRANDO SEM UTILIZAR PDO


<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $nome = "Carlos"; $sobrenome = "Alberto";

$sql = "INSERT INTO alunos (nome,sobrenome) VALUES ('$nome','$sobrenome')"; $query = mysql_query($sql);

if($query){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } ?>

Vejam que o cadastro do primitivo fica totalmente vulnervel. Veja agora, o exemplo acima utilizando PDO.
CADASTRANDO UTILIZANDO PDO
<?php include_once("conexao.php");

$nome = "Carlos"; $sobrenome = "Alberto";

try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (:nome,:sobrenome)"; $cadastrar->bindValue(":nome",$nome); $cadastrar->bindValue(":sobrenome",$sobrenome); $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>

Lembrando, que com a utilizao do PDO, eu no precisei deixar o parmetro dentro de aspas simples, como foi utilizado no modo primitivo. Veja:
$cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (:nome,:sobrenome)";

Vimos tambm que utilizei uma condicional diferente, veja:


if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; }

Fica a pergunta: Mas o rowCount no funciona apenas para selecionar dados?

Resposta: No! O rowCount , neste caso est com a funo do antigo mysql_affected_rows, que retorna o nmero de linhas afetadas. Em nosso caso, 1 cadastrado foi executado com sucesso , resultando ento na mensagem Aluno cadastrado com sucesso!; Lembrando que poderamos tambm fazer nosso cadastro utilizando os pontos de interrogao. Exemplo:
<?php include_once("conexao.php");

$nome = "Carlos"; $sobrenome = "Alberto";

try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (?,?)"; $cadastrar->bindValue(1,$nome); $cadastrar->bindValue(2,$sobrenome); $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>

CADASTRANDO COM PDO UTILIZANDO ARRAY


<?php include_once("conexao.php"); $nome = "Carlos"; $sobrenome = "Alberto";

$dados = array( 'nome'=> $nome, 'sobrenome'=> $sobrenome );

try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (:nome,:sobrenome)"; foreach($dados as $indice => $valor): $cadastrar->bindValue(":$indice",$valor);

endforeach; $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno."; } }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>

CADASTRANDO COM PDO UTILIZANDO ARRAY E INTERROGAO


<?php include_once("conexao.php"); $nome = "Carlos"; $sobrenome = "Alberto";

$dados = array( 1=> $nome, 2=> $sobrenome );

try{ $cadastrar = $conexao->prepare("INSERT INTO alunos (nome,sobrenome) VALUES (?,?)"; foreach($dados as $indice => $valor): $cadastrar->bindValue($indice,$valor); endforeach; $cadastrar->execute; if($cadastrar->rowCount() > 0){ echo "Aluno cadastrado com sucesso!"; }else{ echo "Erro ao cadastrar aluno.";

} }catch(PDOException $error){ echo "Erro ao cadastrar aluno: ". $error->getMessage(); } ?>

Simples, fcil e seguro utilizar o PDO para fazer nosso INSERT n?

Aula 05 Deletando Dados com PDO


Na aula de hoje iremos aprender a deletar dados do banco de dados utilizando o super PDO =) Primeiramente, como toda aula, vejamos um exemplo utilizando o modo primitivo, ou simples do php, como muitos dizem.

DELETANDO SEM A UTILIZAO DO PDO


<?php include_once("conexao.php"); $matricula = $_GET['matricula']; $sql = "DELETE * FROM alunos WHERE matricula = '$matricula'"; $query = mysql_query($sql);

if($query){ echo "Aluno deletado com sucesso!"; }else{ echo "No foi possvel deletar o aluno."; } ?>

Lembrou como era utilizado o modo primitivo do php ? Agora , veja o mesmo utilizando PDO.
DELETANDO UTILIZANDO O PDO
<?php include_once("conexao.php"); try{ $matricula = $_GET['matricula']; $deletar = $conexao->prepare("DELETE * FROM alunos WHERE matricula = :matricula"); $deletar->bindValue(":matricula",$matricula); $deletar->execute();

if($deletar->rowCount() > 0){ echo "Aluno deletado com sucesso!"; }else{ echo "No foi possvel deletar o aluno."; } }catch(PDOException $error){ echo "Error ao deletar aluno: ". $error->getMessage(); } ?>

LEMBRANDO TAMBM, QUE PODERIAMOS UTILIZAR OS FAMOSOS PONTOS DE INTERROGAO PARA DELETAR. Exemplo:
< ?php include_once("conexao.php"); try{ $matricula = $_GET['matricula']; $deletar = $conexao->prepare("DELETE * FROM alunos WHERE matricula = ?"); $deletar->bindValue(1,$matricula); $deletar->execute();

if($deletar->rowCount() > 0){ echo "Aluno deletado com sucesso!"; }else{ echo "No foi possvel deletar o aluno."; } }catch(PDOException $error){ echo "Error ao deletar aluno: ". $error->getMessage(); } ?>

Simples, e descomplicado.

Aula 06 Atualizando Dados com PDO


Hoje iremos ento, finalizar nosso CRUD (create read- update delete = criar ler atualizar deletar).

Na aula de hoje aprenderemos a atualizar os dados utilizando o PDO. Mantendo a rotina exposta em todas as aulas do curso, primeiramente irei mostrar o modo tradicional ou primitivo do php. Logo aps, o mesmo exemplo utilizando o PDO.

ATUALIZANDO DADOS SEM UTILIZAR PDO


<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $matricula = $_POST['matricula']; $nome = $_POST['nome']; $sobrenome = $_POST['sobrenome'];

$sql = "UPDATE alunos SET nome = '$nome', sobrenome = '$sobrenome' WHERE matricula = '$matricula' "; $query = mysql_query($sql);

if($query){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>

ATUALIZANDO DADOS UTILIZANDO PDO


<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $matricula = $_POST['matricula']; $nome = $_POST['nome']; $sobrenome = $_POST['sobrenome'];

$atualizar = $conexao->prepare("UPDATE alunos SET nome = :nome, sobrenome = :sobrenome

WHERE matricula = :matricula "); $atualizar->bindValue(":nome",$nome); $atualizar->bindValue(":sobrenome",$sobrenome); $atualizar->bindValue(":matricula",$matricula); $atualizar->execute;

if($atualizar->rowCount() > 0){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>

PERGUNTA:PODERAMOS UTILIZAR OS PONTOS DE INTERROGAO ? SIM. VEJA:


<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $matricula = $_POST['matricula']; $nome = $_POST['nome']; $sobrenome = $_POST['sobrenome'];

$atualizar = $conexao->prepare("UPDATE alunos SET nome = ?, sobrenome = ? WHERE matricula = ?"); $atualizar->bindValue(1,$nome); $atualizar->bindValue(2,$sobrenome); $atualizar->bindValue(3,$matricula); $atualizar->execute;

if($atualizar->rowCount() > 0){

echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>

Pergunta: Poderamos utilizar arrays para fazer tal atualizao? Seria timo para realizar mltiplas atualizaes de dados correto? Resposta: Sim, podemos utilizar arrays. E, sim seria timo para manipulao mltipla de dados.
EXEMPLO UTILIZANDO ARRAY SEM A UTILIZAO DOS PONTOS DE INTERROGAO.
<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $matricula = $_POST['matricula']; $nome = $_POST['nome']; $sobrenome = $_POST['sobrenome'];

$dados = array( 'nome'=>$nome, 'sobrenome'=>$sobrenome, 'matricula'=>$matricula );

$atualizar = $conexao->prepare("UPDATE alunos SET nome = :nome, sobrenome = :sobrenome WHERE matricula = :matricula "); foreach($dados as $indice => $valor): $atualizar->bindValue(":$indice",$valor); endforeach; $atualizar->execute;

if($atualizar->rowCount() > 0){ echo "Aluno atualizado com sucesso!";

}else{ echo "Erro ao atualizar aluno."; } ?>

EXEMPLO UTILIZANDO ARRAY UTILIZANDO OS PONTOS DE INTERROGAO.


<?php include_once("conexao.php");/*Inclui arquivo de conexao com o bd*/ $matricula = $_POST['matricula']; $nome = $_POST['nome']; $sobrenome = $_POST['sobrenome'];

$dados = array( 1=>$nome, 2=>$sobrenome, 3=>$matricula );

$atualizar = $conexao->prepare("UPDATE alunos SET nome = ?, sobrenome = ? WHERE matricula = ?"); foreach($dados as $indice => $valor): $atualizar->bindValue($indice,$valor); endforeach; $atualizar->execute;

if($atualizar->rowCount() > 0){ echo "Aluno atualizado com sucesso!"; }else{ echo "Erro ao atualizar aluno."; } ?>

Viram como simples fazer atualizaes utilizando o PDO?

Vous aimerez peut-être aussi