Ir para conteúdo

POWERED BY:

Arquivado

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

tony_lu

consulta com mysqli e bind_param

Recommended Posts

Ola pessoal, estou iniciando meus estudos em OOP com mysqli... estou com duvidas para exibição das informações do banco.

 

Minha duvida é de pegar um unico registro por exemplo id de uma empresa, apenas aquele registro, e também fazer um while exibindo diversos registros. Ex:

  $sql = $mysqli->prepare("SELECT `id`, `titulo`, `link` FROM `noticias` WHERE ` codNoticia = ?");
  $sql->bind_param('i', $id);
  $sql->execute();

A partir do $sql->execute(); como eu faria para exibir as informações apenas da noticia que eu selecionei?

 

Ou em outro caso

$sql = $mysqli->prepare("SELECT `id`, `titulo`, `link` FROM `noticias` WHERE ` codCategoria = ?");
$sql->bind_param('i', $id);
$sql->execute();

Neste caso gostaria de exibir a lista de noticias de uma determinada categoria.

 

Qual a melhor maneira de se trabalhar nesses dois casos?

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei uma consulta simples:

 

$empresa = $mysqli->prepare("SELECT * FROM empresas WHERE codEmpresa = ?");
$empresa->bind_param("i", $id);
$empresa->execute();
$x = $empresa->fetch_assoc();
echo $x['nome_empresa'];
echo $x['codEmpresa']; 

Deu este erro:

 

Fatal error: Call to a member function bind_param() on a non-object in

 

Pode me ajudar a corrigir este erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

se prepare() não retornou objeto, houve falha na consulta. Use $error para verificar:

$empresa = $mysqli->prepare("SELECT * FROM empresas WHERE codEmpresa = ?") or exit( $mysqli->error );

Fiz exatamente da forma que você colocou mas não retornou nada

 

 

Beraldo, mudei a programação:

 

 

$empresa = $mysqli->prepare("SELECT * FROM empresas WHERE codEmpresa = ?") or exit( $mysqli->error );$empresa->bind_param("i", $id);$empresa->execute();$row = $empresa->fetch_assoc();

Agora esta dando outro tipo de erro:

 

Fatal error: Call to undefined method mysqli_stmt::fetch_assoc() in [/size]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, fetch_assoc() é do objeto mysqli_result. Você está executando-o em mysqli_stmt.

 

Tem que usar get_result() antes. Nem eu lembrava :P

 

Dê uma olhada no Exemplo #1:

http://php.net/manual/en/mysqli-stmt.get-result.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, fetch_assoc() é do objeto mysqli_result. Você está executando-o em mysqli_stmt.

 

Tem que usar get_result() antes. Nem eu lembrava :P

 

Dê uma olhada no Exemplo #1:

http://php.net/manual/en/mysqli-stmt.get-result.php

 

Obrigado Beraldo,

 

tentei seguir o exemplo, só que fora do while, pois gostaria de pegar apenas 1 registro, mas voltou a dar problema:

 

$stmt = $mysqli->prepare("SELECT * FROM empresas WHERE codEmpresa = ?") or exit( $mysqli->error );
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

Fatal error: Call to undefined method mysqli_stmt::get_result() in

 

Desculpe o transtorno mas não estou conseguindo :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

No manual diz que essa função só existe a partir do PHP 5.3. Seu PHP é 5.2 ainda?

 

Testei aqui com uma tabela interna do mysql e deu certo. Veja:

 

$mysqli = new mysqli( 'localhost', 'root', '', 'mysql' );
$stmt = $mysqli->prepare( "SELECT * FROM user" ) or exit( $mysqli->error );
 
$stmt->execute();
 
$result = $stmt->get_result();
 
while( $row = $result->fetch_assoc() )
{
    print_r( $row );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

No manual diz que essa função só existe a partir do PHP 5.3. Seu PHP é 5.2 ainda?

 

Testei aqui com uma tabela interna do mysql e deu certo. Veja:

$mysqli = new mysqli( 'localhost', 'root', '', 'mysql' );
$stmt = $mysqli->prepare( "SELECT * FROM user" ) or exit( $mysqli->error );
 
$stmt->execute();
 
$result = $stmt->get_result();
 
while( $row = $result->fetch_assoc() )
{
    print_r( $row );
}

 

Ola Beraldo, sim é php 5.2 ... então deve ser por isso! Deu o mesmo erro seguindo o codigo que você fez.

 

O engraçado é que consigo executar a query com o prepare para Insert, delete e update... mas para select não consigo, queria usar pela questão de segurança, mas parece que não tem como então eu fazer um select com bind_param na versão 5.2 neh?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É possível, sim.

Dê uma olhada aqui:

http://php.net/manual/pt_BR/mysqli-stmt.bind-result.php

 

Parece que isso vai resolver seu problema.

 

 

Com PDO isso tudo seria bem mais fácil. Se estiver afim de migrar, vale a pena. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Beraldo,

 

dessa forma sim funcionou!

 

Vou começar a estudar o PDO, em questão de segurança ambos são seguros correto?

 

Obrigado mais uma vez

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou começar a estudar o PDO, em questão de segurança ambos são seguros correto?

Sim

Usando Prepared Statements, está seguro.

A grande vantagem do PDO é que ele é independente de SGBD. Se um dia precisar migrar, por exemplo, de MySQL para PostgreSQL, você precisará mexer em uma única linha de código (a conexão).

 

Veja: http://www.ultimatephp.com.br/como-usar-pdo-com-banco-de-dados-mysql/

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.