Jump to content
Fórum Script Brasil
  • 0

SELECT a retornar valores errádos - HELP


joanita
 Share

Question

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 to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

  • 0

então mas para isso não é p+reciso o campo subcategoria porque as categorias e subcategorias deviam aparecer no select "categoria"... e isso é capaz de baralhar as pessoas

Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...