Ir ao conteúdo

Fazer CRUD com chamada a procedure


Eder Cuer

Posts recomendados

Postado

Eae galera...

Estou com um probleminha em fazer um CRUD chamando uma procedure. Eu criei as procedures, e quando tento chamar da um erro, eu peguei um exemplo na net, e como ele ta (me parece) em paradigma OO não sei como fazer funcionar.

Quando chamo a procedure de deletar funciona normalmente, mas quando vou chamar a procedure de consultar, o máximo que ele faz é retornar o código, tentei fazer retornar todas as informações, mas sem sucesso. E quando chamo a procedure de inserir ou alterar da um erro.

Minha tabela chama "usuário", e tem os campos: id INT (AI), nome VARCHAR, telefone VARCHAR, endereço VARCHAR.

Código:


<?php
include("include/connect.php");


$sql = "SELECT * FROM usuario";
$res = mysql_query($sql);

echo '<table width="100%" name="listaUsers" align="center" border="1">
<tr>
<td>Id</td>
<td>Nome</td>
<td>Telefone</td>
<td>Endereço</td>
</tr>';

for($i=0; $i < mysql_num_rows($res); $i++)
{
$id = mysql_result($res, $i, 'id');
$nome = mysql_result($res, $i, 'nome');
$telefone = mysql_result($res, $i, 'telefone');
$endereco = mysql_result($res, $i, 'endereco');

echo'
<tr>
<td>'.$id.'</td>
<td>'.htmlentities($nome).'</td>
<td>'.htmlentities($telefone).'</td>
<td>'.htmlentities($endereco).'</td>
</tr>
';

}
echo '</table>';


$mysqli = new mysqli("localhost","root","","crud");

if (mysqli_connect_errno()) {
printf("<br />Connect failed: %s\n", mysqli_connect_error());
exit();
}

if ($mysqli->multi_query("CALL consultarUsuario(3);")) {
do {
/*("CALL inserirAlterarUsuario('Eder', '(14)11111111', 'Teste');")
Essa é a procedure de inserir ou alterar (é a que da erro)
*/
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}

$result->close();
}

} while ($mysqli->next_result());
}
else {
printf("<br />First Error: %s\n", $mysqli->error);
}

$mysqli->close();

?>

procedure_consultar.jpg

procedure_inserir_alterar.jpg

  • Membro VIP
Postado

Bom, se for ver o erro da sua screenshot o problema está na sua procedure do Insert, pois o número de colunas não bate com o número de valores que você está entrando..

Já revisou a procedure e seus parametros?

Postado

Arrumei a procedure de inserir, agora só estou com problemas na de consultar. Chamei ela direto no mysql e retornou certinho, o problema está na hora de mostrar no php,aquele problema da primeira imagem persiste.

Postado

Acho que ficaria melhor se eu mostrasse como criei a procedure...


DELIMITER |
CREATE PROCEDURE consultar(IN var_id int)
BEGIN
SELECT * FROM usuario WHERE id = var_id;
END |
DELIMITER;

Eu acho que o problema ta ali no código php, ele ta retornando só o código que consultei.

  • Membro VIP
Postado

Pode postar o erro que está acontecendo agora ? por texto ou screenshot..

PS: Se for exatamente o mesmo erro, o problema ainda está no insert. Que me lembre é o unico que daria erro ao colocar mais colunas do que valores..

Sobre seu código, não tenho muito como testar mas parece ok. Só acho que você poderia fazer um loop mais simples:

while($cadastro = mysql_fetch_assoc($query)){
$cadastro['nome']; // nome
// etc
}

Postado

Na verdade não da mais erro. O único problema é que ao chamar a procedure de consulta ele só esta mostrando o código da consulta (imagem 1).

Esse é um trabalho que eu tinha que fazer, eu fui fazer um loop que eu tava mais acostumado a fazer de forma bem simples (para mim), mas tava dando erro.

Eu vi em alguns blogs que ao usar procedure, tenho que usar a função mysqli ao invés de mysql simples, mas não estava funcionando do mesmo jeito, ai achei esse exemplo que funcionou, mas php OO eu não sei usar, e esse código é OO.

Pelo que eu entendi só preciso jogar o nome, telefone, endereço em variáveis, mas é bem diferente da forma procedural.

O "x" da questão ta exatamente nesse trecho:



if ($mysqli->multi_query("CALL consultarUsuario(3);")) {
do {
[B]if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}[/B]

$result->close();
}

}

Eu não consegui fazer retornar o resto das informações da tabela.

  • Membro VIP
Postado
Na verdade não da mais erro. O único problema é que ao chamar a procedure de consulta ele só esta mostrando o código da consulta (imagem 1).

Para mim a imagem 1 parece estar normal. Existem 3 linhas na tela, não está correto? O que você quer dizer com "só esta mostrando o código da consulta" ?

Eu vi em alguns blogs que ao usar procedure, tenho que usar a função mysqli ao invés de mysql simples, mas não estava funcionando do mesmo jeito, ai achei esse exemplo que funcionou, mas php OO eu não sei usar, e esse código é OO.

Na verdade como as stored procedures ficam, obviamente, no servidor do banco de dados, o PHP em si não tem problemas em EXECUTAR a stored procedure uma vez que quem faz isso é o MySQL. O problema está no retorno: stored procedures podem retornar mais de um resultset, e a biblioteca mysql (antiga) não parece saber lidar com multiplos resulsets.. apenas a mysqli (mysql improved).

Pelo que eu entendi só preciso jogar o nome, telefone, endereço em variáveis, mas é bem diferente da forma procedural.

Não necessariamente. Você pode tratar o resultado do banco como objeto, e tratá-lo como:

$result = mysqli_use_result(); // ou mysqli_query(); se não estiver usando prepared statements)
while($cadastro AS $result->fetch_object()){
$cadastro->nome;
$cadastro->telefone; // qualquer seja o nome do banco no banco
}

Quanto ao seu código, porque está utilizando mysqli_multi_query() se você só está passando uma query?

Experimente algo mais simples como:

if($result = mysqli_query("CALL consultarUsuario(3);"){
while($cadastro = $result->fetch_object()){
// utilizar $cadastro
}
}

E a pergunta que não quer calar: porque está fazendo um CRUD utilizando stored procedures?

Postado

Eu to aprendendo procedure agora na faculdade, e meu professor falou pra gente fazer um CRUD com alguma linguagem de programação, e disse que só queria ver a chamada da procedure no código, nada mais.

Eu peguei esse exemplo em um blog, e funcionou as funções de inserir, deletar e editar, e só funcionou o php OO, e eu nem manjo muito.

Em questão da imagem... por exemplo, se eu coloco pra consultar o código 3, ele deveria trazer nome, endereço, telefone do código 3, mas ele só trás o código que eu coloquei pra consultar.

Eu vou tentar a dica que você passou pra ver se funciona.

  • Membro VIP
Postado
Eu to aprendendo procedure agora na faculdade, e meu professor falou pra gente fazer um CRUD com alguma linguagem de programação, e disse que só queria ver a chamada da procedure no código, nada mais.

Aiai, por isso que nossa TI não vai pra frente.. faculdade que ensina stored procedure antes de POO, como se SP fosse a coisa mais mágica do mundo..

Em questão da imagem... por exemplo, se eu coloco pra consultar o código 3, ele deveria trazer nome, endereço, telefone do código 3, mas ele só trás o código que eu coloquei pra consultar.

Ah, agora entendi! Tanto a imagem quanto seu código.

Só está aparecendo o código pois você programou para só aparecer o código:

if ($mysqli->multi_query("CALL consultarUsuario(3);")) {
do {
[B]if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
[COLOR="Red"][B]printf("%s\n", $row[0]);[/B][/COLOR]
}[/B]

$result->close();
}

}

Aqui, você só imprime o indice 0 da array $row, que por sua vez é o seu campo "id" do banco.

Você pode fazer algo como:

if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
echo "Cadastro ID #{$row[0}: <br />Nome: {$row[1]}<br />Telefone: {$row[2]}<br /> Endereço: {$row[3]}";
}

ou

if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_object()) {
echo "Cadastro ID #". $row->Id . ": <br />Nome: " . $row->Nome . "<br />Telefone: " . $row->Telefone . "<br /> Endereço: " . $row->Endereco;
}

Te dando apenas exemplos, o código pode ser melhorado. Também, acredito que o código que passei anteriormente pode ser melhor (uma vez que você não está trabalhando com prepared statements)

Postado

A gente aprendeu POO, mas eu sou uma negação e a falta de prática me faz saber exatamente nada.

Vou testar aqui o que você passou pra ver se vai agora.

Do segundo jeito deu erro, mas o primeiro foi, brigadão hein Lucas.

Ficou assim a conexão:



$mysqli = new mysqli("localhost","root","","crud");

if (mysqli_connect_errno()) {
printf("<br />Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Call my stored procedure the first time */
if ($mysqli->multi_query("CALL consultar(3);")) {
do {

if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
echo "ID: {$row[0]} Nome: {$row[1]} Telefone: {$row[2]} Endereço: {$row[3]}";
}

$result->close();
}

} while ($mysqli->next_result());
}
else {
printf("<br />First Error: %s\n", $mysqli->error);
}

$mysqli->close();

  • Membro VIP
Postado
Do segundo jeito deu erro, mas o primeiro foi, brigadão hein Lucas.

Como fiz direto no forum, posso ter errado e não tenho como testar.. qual erro deu?

Bom, independente disso recomendo que estude um pouco mais tanto POO que é absurdamente simples (não é ser negação, é não ter um bom professor) e as funções da biblioteca mysqli. Como você está usando um exemplo de outro blog, está utilizando funções que não seriam necessárias e etc. Procure estudar semântica.

No mais, disponha, foi um prazer ajudar :joia:

Posso encerrar seu tópico ?

Postado

Alguma coisa falando que não era objeto, acho que era como você tinha dito, não tinha prepared statements.

Eu tenho umas video aulas boas aqui e ta engatilhado pra eu começar a estudar, e meu professor até entende, mas pra explicar realmente ele complica um pouco, pra você ter uma ideia, ele tinha mania de passar do jeito errado pra depois passar o certo (em java), e como eu tenho uma certa dificuldade para entender isso, minha cabeça dava um nó.

Pode fechar sim Lucas, e mais uma vez obrigado pela paciência e disponibilidade.

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!