tony_lu 1 Denunciar post Postado Agosto 26, 2015 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
Beraldo 864 Denunciar post Postado Agosto 26, 2015 Você pode usar o método fetch_assoc(), por exemplo. Quando há vários resultados, coloque-o em um loop while. Se houver só um resultado, basta chamá-lo uma só vez, sem usar loop Compartilhar este post Link para o post Compartilhar em outros sites
tony_lu 1 Denunciar post Postado Agosto 26, 2015 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
Beraldo 864 Denunciar post Postado Agosto 26, 2015 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 ); Compartilhar este post Link para o post Compartilhar em outros sites
tony_lu 1 Denunciar post Postado Agosto 26, 2015 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
Beraldo 864 Denunciar post Postado Agosto 26, 2015 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
tony_lu 1 Denunciar post Postado Agosto 26, 2015 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
Beraldo 864 Denunciar post Postado Agosto 26, 2015 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
tony_lu 1 Denunciar post Postado Agosto 27, 2015 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
Beraldo 864 Denunciar post Postado Agosto 27, 2015 É 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
tony_lu 1 Denunciar post Postado Agosto 27, 2015 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
Beraldo 864 Denunciar post Postado Agosto 27, 2015 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