Ir para conteúdo
Fórum Script Brasil
  • 0

SELECT a retornar valores errádos - HELP


joanita

Pergunta

boa noite, tenho o seguinte código no index.php que chama o ficheiro functions.php:

<label for="categoria">Escolha a Categoria:</label>
<br>
<select name="categoria" id="categoria">
<?php
 $categorias = listaCategorias();
 
 if( $categorias >  ){
  foreach($categorias as $id => $categoria){
   echo '<option value="'.$id.'">'. $categoria .'</option>'."\r\n";
  }
 }
?>
</select>

mas ele em vez de retornar apenas os valores "categoria (que contém os nomes delas)" está a retornar apenas a primeira entrada, mostrando o ID e a Categoria... Devia mostrar apenas as categorias das várias entradas.

 

functions.php

<?php
// ##############################
// FUNÇÃO QUE TRATA AS CATEGORIAS
// ##############################

function listaCategorias(){

 // Na função a variável $mysqli não é reconhecida, por isso informamos que existe.
 global $mysqli;

 // Agora já reconhece a ligação à BD, já podemos executar o código.
 $sql = "SELECT id, categoria FROM categorias ORDER BY categoria ASC";

 if(!$mysqli = $mysqli->query($sql)){
  die('Erro ao consultar a base de dados: [' . $mysqli->error . ']');
 }

 if( $mysqli->num_rows >  ){
  $rows = $mysqli->fetch_assoc();
  
  return $rows;
 }else{
  return ;
 }
}

?>

 

Link para o comentário
Compartilhar em outros sites

24 respostass a esta questão

Posts Recomendados

  • 0

A função 

$mysqli->fetch_assoc();

é a original do MySQLi ou foi implementada por você? Porque se for a do MySQLi, ela só retorna 1 registro a cada chamada: 
http://php.net/manual/pt_BR/mysqli-result.fetch-assoc.php

A função que retorna todos os registros é a fetch_all, ficaria assim:

$rows = $mysqli->fetch_all(MYSQLI_ASSOC);
Link para o comentário
Compartilhar em outros sites

  • 0

Qual mensagem de erro aparece?

E essa função fetch_assoc, você que criou? Ou é a função do PHP?

Se possível, adicione este código antes do if($categorias), teste e cole aqui o resultado (de preferência um print screen):

echo "<pre>";
var_dump($categorias);
die();

 

Link para o comentário
Compartilhar em outros sites

  • 0

tal como expliquei no primeiro post, tenho 2 files, um é o index.php e o outro o fuctions.php.

ao inserir esse codigo antes do if nada da, o unico sitio que permite alguma resposta é antes do fuction, e aparece apenas NULL. Em qualquer outro lado não aparece nada e e mostra so meia pagina.

functions.php

<?php
// ##############################
// FUNÇÃO QUE TRATA AS CATEGORIAS
// ##############################

function listaCategorias(){

 // Na função a variável $mysqli não é reconhecida, por isso informamos que existe.
 global $mysqli;

 // Agora já reconhece a ligação à BD, já podemos executar o código.
 $sql = "SELECT id, categoria FROM categorias ORDER BY categoria ASC";

if(!$mysqli = $mysqli->query($sql)){
  die('Erro ao consultar a base de dados: [' . $mysqli->error . ']');
 }

if( $mysqli->num_rows >  ){
  $rows = $mysqli->fetch_all(MYSQLI_ASSOC);
  
  return $rows;
 }else{
  return ;
 }
}

?>

e o index.php tem o seguinte select:

<label for="categoria">Escolha a Categoria:</label>
<br>
<select name="categoria" id="categoria">
<?php
 $categorias = listaCategorias();
 
 if( $categorias >  ){
  foreach($categorias as $id => $categoria){
   echo '<option value="'.$id.'">'. $categoria .'</option>'."\r\n";
  }
 }
 
?>
</select>

 

ERRO:

[28-Apr-2016 20:10:29 Europe/Lisbon] PHP Fatal error:  Call to undefined method mysqli_result::fetch_all() in .../functions.php on line 19

ou seja, a linha:  

$rows = $mysqli->fetch_all(MYSQLI_ASSOC);

 

há e não fui eu que criei não

 

Link para o comentário
Compartilhar em outros sites

  • 0

aparece no select escrito array e array de novo abaixo

 

<?php
// ##############################
// FUNÇÃO QUE TRATA AS CATEGORIAS
// ##############################

function listaCategorias(){

 // Na função a variável $mysqli não é reconhecida, por isso informamos que existe.
 global $mysqli;

 // Agora já reconhece a ligação à BD, já podemos executar o código.
 $sql = "SELECT id, categoria FROM categorias ORDER BY categoria ASC";

 if(!$mysqli = $mysqli->query($sql)){
  die('Erro ao consultar a base de dados: [' . $mysqli->error . ']');
 }

 if( $mysqli->num_rows >  ){
  $rows = Array();
  while($rows[] = $mysqli->fetch_assoc()){}
  return $rows;
 }
}

?>

 

Link para o comentário
Compartilhar em outros sites

  • 0

Então agora retornou todos os dados corretamente.

Mas precisa fazer uma última alteração... no código que cria os elementos "option", altera para assim:

foreach($categorias as $categoria){
	echo "<option value='{$categoria["id"]}'>{$categoria["categoria"]}</option>\r\n";
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

excelente! esta a funcionar maravilhosamente... Stoma muito obrigado :)

será que me podes ajudar no resto do código que falta? Isto é assim, eu estou a criar um banco de sementes organicas, onde dá para a pessoa inserir a semente que tem e meter por categoria, tem os campos (nome, categoria e subcategoria) imagina... tu metes o nome de uma semente e o código tem que ver se alguma categoria esta selecionada, se tiver uma selecionada adiciona a semente nessa ou permite criar uma subcategoria dessa categoria, caso não esteja nenhuma selecionada, o campo subcategoria tem que permitir criar uma nova categoria, mas nada como veres a funcionar neste link: http://www.rpublicidade.com/teste/index.php

eu tenho 2 bases de dados (bancos como voces chamam no brasil) uma chamada teste com os dados da semente, outra chamada categorias com as categorias, assim:

--
-- Estrutura da tabela `categorias`
--

CREATE TABLE IF NOT EXISTS `categorias` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idcategoria` int(11) NOT NULL,
  `categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Estrutura da tabela `teste`
--

CREATE TABLE IF NOT EXISTS `teste` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  `imagem` longtext NOT NULL,
  `id_categoria` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=73 ;

 da uma olhada no link para perceberes primeiro o que queria. Já coloco o que faz falta ainda fazer

bom vamos por partes...

  1. a parte do select das categorias já ficou a funcionar, só uma coisa... (aparece um espaço no fim do select sem nada, esse espaço deveria aparecer no inicio do select para caso estivesse vazio como aparece, poder-mos criar outra nova categoria usando o campo subcategoria). Nesta parte falta ainda permitir criar nova categoria ou uma subcategoria da categoria selecionada, ou simplesmente não ser usado ficando apenas com a categoria selecionada.

Abaixo o código inteiro atual do index.php

  1. <?php
    include "topo.php";
    require_once "ligar-bd.php";
    require_once "functions.php";
    require_once "estilos/estilos.css";
    require_once "conta_total.php";
    
    ini_set('default_charset','UTF-8');
    ?>
    
    <html>
    <body>
    <center>
    <titulo>Adicionar Nova Entrada</titulo>
    <hr size=1 width=500 class="degrade">
    
    <form action="envia.php" method="POST" enctype="multipart/form-data">
    
    <table align="center" width="500px" border="0" cellpading="4" cellspacing="8"  bgcolor="#f0f0f0">
    <tr>
    <td align="center">
    <hr size=1 width=500 class="degrade">
    <label for="nome">Nome:</label>
    <br>
    <input type="text" name="nome">
    <br>
    
    
    
    
    
    
    
    <label for="categoria">Escolha a Categoria:</label>
    <br>
    <select name="categoria" id="categoria">
    <?php
     $categorias = listaCategorias();
     
     if( $categorias >  ){
      foreach($categorias as $categoria){
    	echo "<option value='{$categoria["id"]}'>{$categoria["categoria"]}</option>\r\n";
    }
     }
    ?>
    </select>
    
    
    
    
    
    
    <br>
    ou insira uma nova...
    <br>
    <br>
    
    <label for="subcategoria">Nova Subcategoria ou Categoria:</label>
    <br>
    <input type="text" name="subcategoria">
    <br>
    
    <label for="imagem">Adicione uma imagem:</label>
    <br>
    <input type="file" name="file">
    <hr size=1 width=500 class="degrade">
    <br>
    
    <input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
    <br>
    <br>
    
    </td>
    </tr>
    </table>
    
    </form>
    
    <?php include "rodape.php"; ?>
    
    </center>
    
    </body>
    </html>
    
    
    
    
    

     

além disso, eu quando comecei o código fiz apenas uma tabela para tudo, depois é que me deram o concelho para fazer antes em duas, logo o resto dos ficheiros deixaram de funcionar (é uma questão de adaptar ás novas tabelas, mas ainda está por fazer...) mas vamos primeiro tratar isso das subcategorias.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi joanita.

Que bom que deu certo! :)

Sobre o item vazio que aparece na categoria, precisamos fazer uma correção na função listaCategorias... altere o while que tem nela para este:

$rows = Array();
while($row = $mysqli->fetch_assoc()){
	$rows[] = $row;
}
return $rows;

Assim resolve esse problema.

Agora, qual a outra dúvida? Em relação a inserir a nova categoria/subcategoria?

Link para o comentário
Compartilhar em outros sites

  • 0
42 minutos atrás, Stoma disse:

Oi joanita.

Que bom que deu certo! :)

Sobre o item vazio que aparece na categoria, precisamos fazer uma correção na função listaCategorias... altere o while que tem nela para este:


$rows = Array();
while($row = $mysqli->fetch_assoc()){
	$rows[] = $row;
}
return $rows;

Assim resolve esse problema.

Agora, qual a outra dúvida? Em relação a inserir a nova categoria/subcategoria?

perfeito :) será que podemos avançar mais com o resto podes ajudar?

Link para o comentário
Compartilhar em outros sites

  • 0

a duvida é que te4nho 2 campo ne? o catefgoria e por baixo o subcategoria (que tambem tem que dar para nele criar a categoria nova)...

imagina tu podes escolher uma categoria das que já existe e criar uma subcategoria dessa categoria ou simplesmente usar a categoria existente ou ainda criar uma nova categoria no caso de nenhuma estar selecionada... nós já conseguimos meter o campo categoria a listar as categorias, agora falta o subcategoria funcionar

Link para o comentário
Compartilhar em outros sites

  • 0

Eu faria assim... deixaria os dois campos (categoria e subcategoria) como elemento do tipo "select" apenas listando os itens que já estão cadastrados, e abaixo desses campos um botão para que o usuário possa inserir novos itens caso precise. Semelhante à imagem abaixo:

 

joanita.png

Link para o comentário
Compartilhar em outros sites

  • 0

??? então mas isso assim não da, acho que não estas a perceber... os campos nome e imagem são obrigatórios, tal como uma categoria... seja ela criada de novo ou selecionada... logo não posso deixar apenas 2 campos de seleção um para a cat e outro para a sub, tem que permitir criar uma percebes? imagina que eu quero adicionar uma nova planta numa categoria que não existe ou subcategoria de uma categoria já existente...

Link para o comentário
Compartilhar em outros sites

  • 0
19 horas atrás, joanita disse:

logo não posso deixar apenas 2 campos de seleção um para a cat e outro para a sub, tem que permitir criar uma percebes?

Acredito ter entendido sim.

A minha ideia é a seguinte: para criar nova categoria, o usuário clica no "botão" (abaixo do campo categoria) com o texto "ou clique aqui para inserir uma nova categoria", e para a subcategoria o usuário clica no "botão" (abaixo do campo subcategoria) com o texto "ou clique aqui para inserir uma nova subcategoria". Ao clicar, você exibe uma janela solicitando o nome da nova categoria ou subcategoria (um modal, como esse por exemplo http://adodson.com/jquery.prompt.js/#function-callback -- abre esta página e clica no botão "try it" para ver). Após o usuário cadastrar, você atualiza o campo select com a nova informação.

Link para o comentário
Compartilhar em outros sites

  • 0

pensa comigo...

o campo de cima (categoria) deveria mostrar todas as categorias e respetivas subcategorias caso existam...
o campo de baixo deveria permitir apenas criar uma nova subcategoria ou categoria.

deveria existir algo tipo um IF que verificasse se o campo categoria tinha alguma categoria/subcategoria selecionada e caso sim, usasse esse destino para a nova entrada e ao mesmo tempo p+ermitisse criar uma nova subcategoria dessa se fosse preciso, caso não existisse nada selecionado então mostraria uma mensagem a obrigar a selecionar uma categoria ou permitia criar uma nova.

o que tem que ser obrigatório é ter uma categoria selecionada ou criar uma nova cat ou sub dessa,

Link para o comentário
Compartilhar em outros sites

  • 0

Então antes de inserir as informações no banco, verifica se $_POST["idcategoria"] está preenchido ou não.

- caso esteja preenchido, usa ele para fazer o insert da semente;
- caso esteja vazio, pega o valor do campo de texto ($_POST), insere ele na tabela de categorias e usa o idcategoria que acabou de criar para fazer o insert da semente.

Link para o comentário
Compartilhar em outros sites

  • 0

isso :) algo do género sim... mas estou meio baralhado de como fazer isso... o código que tenho é????

<?php
 require_once 'ligar-bd.php';

 if( count($_POST) == 3 ){

  $nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
  $categoria = filter_var($_POST['categoria'], FILTER_SANITIZE_STRING);
  $id_categoria = filter_var($_POST['id_categoria'], FILTER_SANITIZE_STRING);

  $erros = array();

  if( $nome  == "" ){
   $erros[0] = "Preencha o nome!";
  }

  if( $categoria == "0" ){
   $erros[1] = "Escolha a categoria ou insira uma nova!";
  }

  if( count($erros) > 0 ){
   $_SESSION['erros'] = $erros;
   // redireciona para o link
   echo '<meta http-equiv="refresh" content="0; url=index.php" />';
   exit;
  }

 }

 exit;
?>

Link para o comentário
Compartilhar em outros sites

  • 0

como assim? tenho o index.php com o form que depois redireciona para este envia.php que tem as instruções para enviar os dados, mas ainda está em faase de construção pois alterei o original... agora o que tenho é isso que postei. A ideia será enviar apenas após fazer isto tudo que te falei, ou seja, verificar as categorias e inserir nome e categorias... a estrutura do banco é:

--
-- Estrutura da tabela `categorias`
--

CREATE TABLE IF NOT EXISTS `categorias` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idcategoria` int(11) NOT NULL,
  `categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Estrutura da tabela `produtos`
--

CREATE TABLE IF NOT EXISTS `produtos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  `imagem` longtext NOT NULL,
  `id_categoria` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=73 ;

e a do index atualmente é:

<?php
 require_once 'ligar-bd.php';
 require_once "funcoes.php";
 require_once "estilos/estilos.css";

 include "topo.php";

 require_once "conta_total.php";

 ini_set('default_charset','UTF-8');
?>

<html>
<body>
<center>
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">

<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="500px" border="0" cellpading="4" cellspacing="8"  bgcolor="#f0f0f0">

<?php
 echo $_SESSION['erros'];
?>

<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
<label for="nome">Nome:</label>
<br>
<input type="text" name="nome">
<br>

<label for="categoria">Escolha a Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value='0' select='selected'>---</option>
<?php
 $categorias = listaCategorias();
 
 if( $categorias >  ){
  foreach($categorias as $categoria){
   echo "<option value='{$categoria["id"]}'>{$categoria["categoria"]}</option>\r\n";
  }
 }
?>
</select>
<br>

ou insira uma nova...
<br>
<br>
<label for="subcategoria">Nova Subcategoria ou Categoria:</label>
<br>
<input type="text" name="subcategoria">
<br>

<label for="imagem">Adicione uma imagem:</label>
<br>
<input type="file" name="file">
<hr size=1 width=500 class="degrade">
<br>

<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>

</td>
</tr>
</table>

</form>

<?php
 include "rodape.php";
?>

</center>

</body>
</html>




Atenção que o index infelizmente ainda me está a dar um erro de sessão que não estou a conseguir resolver (só para variar rsrsrsr) :D

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...