Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal,
Estou com um problema com um array que é carregado com dados de uma pesquisa no BD.
Já tentei de tudo aqui e ele sempre me mostra apenas o último valor, quando percorro para exibir na tela.
Alguém consegue enxergar algum erro:
public function pesquisar($textoPesquisa) {
try {
$query = "SELECT * FROM produto WHERE nome LIKE '%$textoPesquisa%' ORDER BY nome ASC";
$stmt = $this->_conexao->query($query);
foreach ($stmt as $linha) {
$this->_listaProdutos[] = $this->carregar($linha["id"]);
}
return $this->_listaProdutos;
}
catch (PDOException $ex) {
echo "Erro: " . $ex->getMessage();
}
}
public function carregar($id){
try{
$query = "SELECT * FROM produto WHERE id = :id";
$stmt = $this->_conexao->prepare($query);
$stmt->execute(array(':id' => $id));
$obj = $stmt->fetchObject();
$this->_produto->setId($obj->id);
$this->_produto->setNome($obj->nome);
$this->_produto->setDescricao($obj->descricao);
$this->_produto->setEstoqueMin($obj->estoque_min);
$this->_produto->setEstoqueMax($obj->estoque_max);
$this->_produto->setLocalizacao($obj->localizacao);
$this->_produto->setPerecivel($obj->perecivel);
$this->_produto->setAtivo($obj->ativo);
$this->_produto->setQtd($obj->qtd);
$this->_produto->setObs($obj->obs);
$this->_produto->setValorAtual($obj->valor_atual);
$this->_produto->setValorAnterior($obj->valor_anterior);
$this->_produto->setCustoMedio($obj->custo_medio);
$this->_produto->setUnidade($this->_unidadeDAO->carregar($obj->id_unidade));
$this->_produto->setSubCategoria($this->_categoriaDAO->carregar($obj->id_sub_categoria));
$this->_produto->setLote($obj->id_lote);
//$this->_produto->setLote($this->_loteDAO->carregar($obj->id_lote));
return $this->_produto;
}
catch (PDOException $ex){
echo "Erro: ".$ex->getMessage();
}
}
Quando estou dentro do foreach funciona corretamento, mas quando tento em outro arquivo percorrer o listaUsuario mostra apenas o ultimo registro.
Pessoal,
Agora ele não retorna mais nada, só carrega a primeira pesquisa que faço, depois não altera, se fizer outra pesquisa.
Não entendi
Ele perguntou se isso é uma classe... Tá com cara mesmo... :closedeyes:
Se o erro é em outro arquivo, onde está o código desse outro arquivo?
É uma classe sim. Um DAO.
O erro acontece na hora que o usuário vai pesquisar produto.
O codigo é esse:
if ($_POST["textoPesquisa"] != "") {
$listaProdutos = $produtoController->pesquisar($_POST["textoPesquisa"]);
}
<tr>
<table border=1>
<tr>
<td colspan="6">
<label for="consulta">Buscar:</label>
<input type="text" name="textoPesquisa" size="50"
maxlength="100" title="Digite o nome do produto que deseja encontrar"/>
<input type="submit" name="pesquisar" value="OK" />
</td>
</tr>
<tr>
<td></td>
<td>Cód.</td>
<td>Produto</td>
<td>Quantidade</td>
<td>Preço Unitário (R$)</td>
<td>Valor Total (R$)</td>
</tr>
<?php
$i = 1;
foreach ($listaProdutos as $produto) {
?>
<tr>
<td><input type="checkbox"/></td>
<td><?php echo $produto->getId(); ?></td>
<td><?php echo $produto->getNome(); ?></td>
<td><input type="text" name="qtd<?php echo $i?>""/></td>
<td><input type="text" name="valorUnitario<?php echo $i?>" onchange="calculate();" onblur="calculate();"/></td>
<td><input type="text" name="valorTotal<?php echo $i?>" onclick="calculate();" readonly/></td>
</tr>
<?php
$i++;
}
?>
</table>
</tr>Debuga a variável $lista_produtos ex: print_r($lista_produtos);
Eu acredito que seja por estar utilizando variáveis do escopo da classe, onde não há necessidade.
Como por exemplo: [inline]$this->_listaProdutos[][/inline] e [inline]$this->_produto[/inline].
Se essas variáveis não serão mais utilizadas, dentro do escopo da classe, utilize variáveis locais, tal como:
$listaProdutos = new ArrayIterator();
foreach ($stmt as $linha) {
$listaProdutos->append($this->carregar($linha["id"]));
}
return $listaProdutos;
E
$produto = new Produto()//se isso for assim
$produto->setId($obj->id);
Objetos são passados por refêrencia, logo, se não iniciar um novo objeto em [inline]$this->_produto[/inline], os valores serão sempre substituídos dentro do mesmo objeto.
E uma class?
está fazendo errado.