Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hugo Borges_120734

esconder erro de conexão com mysqli

Recommended Posts

Sim o PDO é uma das APIs novas para conexão com o banco de dados outra é o mysqli. Uma das vantagens do PDO é o suporte a vários bancos e prepared statements(emulados).

No constutor do PDO são necessários cinco informações que são, driver, servidor/host, nome da base, usuário e senha.

Parâmetros do construtor

Algumas opções interessesantes como o controle de erro que podem ser erros ou exceções, des/ativar o autocommit entre outros podem ser definidos no construtor como último argumento. Isso também pode ser feito através do método setAttribute(). Lista de opções disponíveis.

No exemplo abaixo é definido que os erros serão tratados como exceptions, o tipo de retorno padrão é um array associativo e o último indica que o nome das chaves do array serão maiusculas.

No construtor:

$opcoes = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_CASE => PDO::CASE_UPPER);
$db = new PDO('mysql:host=localhost;dbname=catalogo', 'root', 'root');

Ou com setAttribute:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Prepared statements e mysql_*

As funções mysql_* já foram descontinuadas a muito tempo e não suportavam prepared statements, para pegar o resultado de um select era preciso de três passos, definição da sql, executar(transformar a string em um comando sql e aplicar no banco) a consulta e obter o resultado para uma insert/update/delete o último passo é omitido.

Tipico código com mysql_*

$link = mysql_connect($host, $usuario, $senha);
mysql_select_db($banco);

//1 - passo
$sql = "SELECT * FROM tabela WHERE nome = 'admin' AND senha = '#4skdjf' AND ativo = 1";
//2 - passo
$res = mysql_query($sql) or die(mysql_error());
//3 - passo
while($row = mysql_fetch_assoc($res)){
echo $row['nome'];
}

Com prepared statements temos cinco passos, definição da sql, transformar a string numa consulta preparada, substituição dos placeholders pelos valores, execução da consulta no banco e por último obter o resultado.

A substituição das marções(:valor ou ?) também conhecidos named placeholders e placeholders pode ser feita através de três métodos, bindValue(), bindParam() e no execute(). A diferença entre bindValue() e bindParam() é que o segundo aceita apenas referências(variáveis/constantes) logo retornos de funções/métodos causam um erro.

//bindParam

$valor = 10;

$stmt = $db->prepare($sql);
$stmt->bindParam(':v1', $valor); //válido
$stmt->bindParam(':v1', 10); //inválido
$stmt->bindParam(':v1', getValor()); //inválido
$stmt->bindParam(':v1', $obj->getValor()); //inválido

//bindValue

$stmt = $db->prepare($sql);
$stmt->bindValue(':v1', 10); //válido
$stmt->bindValue(':v1', getValor()); //válido
$stmt->bindValue(':v1', $obj->getValor()); //válido

A terceira forma é passar os valores no execute() como um array ela é mais prática para consultas com parâmetros dinâmicos.

$stmt = $db->prepare($sql);
$stmt->execute(array(':v1' => '10', ':v2' => 'admin'));

Para insert/update/delete

$db = new PDO('mysql:host=localhost;dbname=base', 'usuario', 'senha');

//1 - passo
$sql = 'INSERT INTO tabela (c1,c2,c3) VALUES(?,?,?)';
//2 - passo
$stmt = $db->prepare($sql);
//3 - passo é aqui é o array(...), 4 - passo é chamada de execute()
if($stmt->execute(array('valor1', 'valor2', 3)) === false){
print_r($stmt->errorInfo());
}else{
echo 'insert realizado com sucesso';
}

Para selects

//1 - passo
$sql = 'SELECT * FROM tabela WHERE c = :v1 AND c2 = :v2';
//2 - passo
$stmt = $db->prepare($sql);
//3 - passo
$stmt->bindValue(':v1', 10);
$stmt->bindValue(':v2', 'janeiro');
//4 - passo
$stmt->execute();
//5 - passo
$itens = $stmt->fetchAll(PDO::FETCH_ASSOC);

Retorno em selects

Os alguns dos principais métodos para obter o retorno de um select são fetch() que retornaapenas um registro e fetchAll() que devolve um array como forme o tipo especificado que no exemplo foi PDO::FETCH_ASSOC(array associativo), também pode ser array de objetos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...] porem o meu netbeans esta falando que isso esta errado.

Se o PHP não aponta erro, não é o Netbeans que vai apontar.

 

A IDE pode estar rodando outra versão do PHP, pode estar com o suporte mal implementado etc.

 

Confie nas mensagens do PHP, não da IDE.

 

 

Habilite todas as exibições de erro, como mostrado neste tópico, na Orientação No. 2 e veja se o PHP acusa algum erro.

 

 

Sobre o "@", ele não está errado, se for usado da forma certa, nas ocasiões corretas. Desde que você valide o valor de $mysqli, não vejo problemas. Leia este link.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.