Latest News
- Visão Ágil – Community Journal 01
- Cast entre objetos PHP
- PDO e MySQL com UTF-8
- PHP – Criando e tratando exceptions
- Encontro Ágil 2008
- PHP Conference 2008
- Era uma vez…
- On duplicate key update
- SCRUM – Primeiros passos
- Google developer day 2008
Categorias
- AJAX/XAJAX
- Artigos
- Banco de Dados
- Engenharia de Software
- Fun
- geral
- Metodologias
- PHP
- Smarty/Templates
- Uncategorized
Arquivo
PDO e MySQL com UTF-8
Posted by cristianmedeiros
Se você esta usando PDO, esta tendo dificuldades com UTF-8 no seu MySQL, mesmo com tudo setado para UTF-8, você pode tentar isso:
$pdo = new PDO(
‘mysql:host=localhost;dbname=nomedobanco’,
"user",
"pass",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
O último parametro do construtor do PDO é um array com as opções específicas do driver, no caso, do driver od MySQL. Este parametro é alimentado no velho estilo "array" chave=>valor.
Observem que o parametro (PDO::MYSQL_ATTR_INIT_COMMAND) não se trata de uma configuração de charset, mas sim de um comando que é executado todas as vezes que você conecta no banco. Neste caso, todas as vezes que ele se conecta no banco, ele executa a query "SET NAMES utf8" (acho que é específica do MySQL) que diz para o MySQL utilizar UTF-8 como charset para nossa conexão.
Para saber mais:
- PDO e BEAN no PHP
- MySQL “Connection Character Sets and Collation” documentation
- PDO constructor documentation
- PDO MySQL driver documentation
Fonte:
http://www.laszlo.nu/post/34159352/how-to-use-utf-8-with-mysql-and-php-data-objects-pdo
Tags BlogBlogs: php, pdo, mysql, utf8, unicode
PDO e BEAN no PHP
Posted by cristianmedeiros
PDO é uma extensão nativa no PHP a partir dar versão 5.1, com ela conseguimos trabalhar com diversos bancos de dados sem precisar alterar as as querys feitas (claro que devemos usar SQL ANSI para isso). Para os acostumados com ADODB ou MDB2, o PDO é um facilitador e tanto, pois é nativo do PHP e trabalha a uma velocidade muito superior à essas duas classes.
Implementa cache de query em nível de código (o mesmo que o bind do oracle) e permite uma flexibilidade na manipulação dos resultados tanto como arrays ou objetos.
Por se tratar de uma feature relativamente nova, ela não esta completamente finalizada pelo time do PHP e algumas funções estão disponíveis apenas no cvs.
Um pequeno exemplo de como utilizar o PDO:
1 2 3 4 5 6 7 8 | prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
?> |
Eu tenho utilizado PDO com grande sucesso em meus projetos e cada vez mais me acostumo a utiliza-la no lugar de ADODB/MDB2, tenho trabalhado 100% orientado a objetos no padrão BEAN igual ao do java (gosto de manter os dados protegidos dentro do meu código).
Abaixo um pequeno exemplo de como utilizao PDO em meus projetos. O código está comentado, porém se surgirem dúvidas me mande um e-mail ou comente abaixo que eu dou uma força.
Conexao.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | persistencia = true; }
}
public function getConnection(){
try{
$this->con = new PDO(
$this->dbType.":host=".$this->host.";
dbname=".$this->db,$this->user,
$this->pass,
array(PDO::ATTR_PERSISTENT=> $this->persistencia)
);
/*ESTA PROPRIEDADE INDICA COMO O PDO VAI RETORNAR OS
ERROS SQL NO MODO PDO::ERRMODE_WARNING O RETORNO DO
ERRO É IGUAL AO QUE VEMOS SEM A UTILIZAÇÃO DO PDO*/
$this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
return $this->con;
}catch(PDOException $ex){
echo "ERRO:".$ex->getMessage();
}
}
public function Close(){
if($this->con != NULL){
$this->con = NULL;
}
}
}
?> |
cliente.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | id_cliente = $id_cliente;
}
public function getIdCliente(){
return $this->id_cliente;
}
public function setEmail($email){
$this->email = $email;
}
public function getEmail(){
return $this->email;
}
public function setTelefone($telefone){
$this->telefone = $telefone;
}
public function getTelefone(){
return $this->telefone;
}
}
?> |
clienteModel.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | con = Conexao::getConnection();
}
public function Insert($cliente){
$query = "insert into cliente (id_cliente, nome, email, telefone)
values (:id_cliente,:nome,:email,:telefone)";
try{
$stmt = $this->con->prepare($query);
$stmt->bindValue(':id_cliente',$cliente->getIdCliente());
$stmt->bindValue(':nome',$cliente->getNome());
$stmt->bindValue(':email',$cliente->getEmail());
$stmt->bindValue(':telefone',$cliente->getTelefone());
return $stmt->execute();
}catch(PDOException $ex){
echo $ex->getMessage();
}
}
public function Update($cliente){
$query = "update users set nome=:nome, email=:email,
telefone=:telefone where id_cliente=:id_cliente";
try{
$stmt = $this->con->prepare($query);
$stmt->bindValue(':nome',$user->getNome());
$stmt->bindValue(':email',$user->getEmail());
$stmt->bindValue(':telefone',$user->getTelefone());
$stmt->bindValue(':id_cliente',$user->getIdCliente());
$stmt->execute();
}catch(PDOException $ex){
echo $ex->getMessage();
}
}
public function Select($query = NULL){
if(trim($query) == NULL){
$query = "select * from clientes";
try{
$stmt = $this->con->prepare($query);
$stmt->execute();
/*
ESSE AQUI É O PULO DO GATO: fetchObject(nome_da_classe)
COM fetchObject COLOCAMOS O RETORNO DO BANCO DE DADOS EM
UMA CLASSE COM O NOME ESPECIFICADO NO PARAMETRO
NO ARQUIVO EM QUE UTILIZAMOS A CONSULTA, TEMOS UM INCLUDE
DO ARQUIVO cliente.php QUE POSSUI A DEFINIÇÃO
DA CLASSE cliente. LOGO, QUANDO A QUERY FOR EXECUTADA,
TEREMOS COMO RETORNO UMA CLASSE cliente COM TODOS OS
ATRIBUTOS PREENCHIDOS PODENDO UTILIZAR OS SET´S E GET´S AUTOMATICAMENTE.
*/
$stmt->fetchObject('cliente');
}catch(PDOException $ex){
echo $ex->getMessage();
}
}else{
try{
$stmt = $this->con->prepare($query);
$stmt->setFetchMode(PDO::FETCH_CLASS, 'cliente');
$stmt->execute();
/*
AQUI TEMOS UMA IMPLEMENTAÇÃO DIFERENTE, NÃO TEMOS COMO GARANTIR QUE
A QUERY PASSADA RETORNARÁ EXATAMENTE OS ATRIBUTOS DA CLASSE cliente,
PORTANTO, SETAMOS O RETORNO PARA A CLASSE cliente, SE O RESULTADO
PREENCHER OS ATRIBUTOS, TEREMOS UMA CLASSE cliente COM OS
ATRIBUTOS PREENCHIDOS E PODENDO SER MANIPULADA PELOS GET´S E SET´S
CASO NÃO, ELE RETORNA UMA CLASSE ONDE OS DADOS PODEM SER
ACESSADOS COMO ATRIBUTOS.
*/
return $users = $stmt->fetch(PDO::FETCH_CLASS);
}catch(PDOException $ex){
echo $ex->getMessage();
}
}
}
}
?> |
operacao.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | clienteValid(); //CONSULTA $query = "select * from cliente where id_cliente=".$_REQUEST['cliente']; $cliente = $clienteModel->Select($query); echo $cliente->getNome(); echo $cliente->getEmail(); //ATUALIZAÇÃO $cliente->setIdCliente($cliente->getIdCliente()); $cliente->setNome($cliente->getNome()); $cliente->setEmail($cliente->getEmail()); $cliente->setTelefone($_REQUEST['telefone']); $clienteModel->Update($cliente); //INSERT $cliente->setNome($_REQUEST['nome']); $cliente->setEmail($_REQUEST['email']); $cliente->setTelefone($_REQUEST['telefone']); $clienteModel->Insert($cliente); ?> |
Este código é bem simples, mas é o que tenho utilizado, ele vêm evoluindo com o tmepo, e para minhas necessidades é bem eficiente. O PDO2 está por vir e promente melhorar muito toda essa interface e suporte a outra bancos.
Algumas referências que me ajudaram a entender a utilização do PDO:
- http://www.htmlstaff.org/ver.php?id=8117
- http://www.htmlstaff.org/ver.php?id=9527
- http://php.net/pdo
Qualquer sugestão me mande, ainda estou aprendendo a trabalhar com PDO.
Edit
Conforme as observações do Dimas Gomez, acertei o código exibido e aproveito para disponibilizar os fontes aqui.
Quanto ao erro “could not find driver” você pode deve habilitar o driver para seu banco de dados em seu php.ini. Como fazer isso está bem descrito no manual do php em http://php.net/pdo.



