Ir para conteúdo

POWERED BY:

Arquivado

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

Willian M R

Sobre fetch de objeto e array.

Recommended Posts

Olá pessoal.

Eu estou com uma duvida se há uma forma mais fácil que eu possa estar trabalhando com o fetch.

Eu fiz uma classe que tem o método select a onde eu passo os parâmetros e ele faz a pesquisa no banco de dados, então na hora de retornar eu retorno array | object(mixed) | null | string, sendo null para rowcount 0, string para erros, objeto se for rowcount 1 e array se for rowcount > 1.

Meu problema é que na hora de mostrar dados na view eu tenho que ficar toda hora cuidando disso, if array faz um foreach e if object mostra sem foreach... problema que isso da um certo trabalho extra porque eu tenho que ter 2 código 1 para acesso ao objeto e um para o foreach.

OBS: Trabalho com php 5.2.

exemplo:


<tbody>
    
    <?php if (is_array($this->dados)) {
         foreach ($this->dados as $dado) {
    ?>
        <tr>
            <td><?= $dado->nome ?></td>
        </tr>
    <?php } 
    } elseif (is_object($this->dados)) {
    ?>
        <tr>
            <td><?= $this->dados->nome ?></td>
        </tr>
    <?php } ?>
    

</tbody>

Obrigado :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O 'problema' não é como tratar os dados e sim como está a gerar eles.

$this->dados

Como assim a função ora passa array? ora passa Objeto?

http://php.net/manual/pt_BR/pdostatement.fetchobject.php

http://php.net/manual/pt_BR/pdostatement.fetchall.php

http://php.net/manual/pt_BR/pdostatement.fetch.php

Da uma lida sobre o parâmetro 'fetch_style'

Compartilhar este post


Link para o post
Compartilhar em outros sites

O php 5.2 é muito antigo e frameworks não dão suporte então eu acabo tendo que criar minhas próprias soluções, eu não sou nenhum expert afinal estou a 1 ano e meio trabalhando com php.

na minha classe model eu fiz isso:

/**
 * Faz seleção de linha(s) no banco de dados.
 * 
 * @param array $condicoes
 * @param string $orderby
 * @param string $wherelike
 * @param string $sqladd
 * @return string|object|mixed|null
 */
public function select($condicoes = null, $orderby = null, $wherelike = null, $sqladd = null)
{
    $sql = "SELECT *";
    !is_null($sqladd) ? $sql .= ", {$sqladd}" : null;
    $sql .= " FROM {$this->tabela}";
    if (!is_null($condicoes)) {
        $sql .= $this->where($condicoes);
    } elseif (is_null($wherelike) && is_null($condicoes)) {
        $sql .= " WHERE 1";
    }
    !is_null($wherelike) ? $sql .= " {$wherelike} " : null;
    !is_null($orderby) ? $sql .= " ORDER BY {$orderby} " : null;
    $stmt = $this->run($sql, $condicoes);

    if (is_string($stmt)) {
        return $stmt;
    }
        
    if ($stmt->rowCount() > 1) {
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    } elseif ($stmt->rowCount() == 1) {
        return $stmt->fetch(PDO::FETCH_OBJ);
    }
    return null;
}

/**
 * Executa uma ação no banco de dados.
 * 
 * @return string|PDOStatement
 */
private function run($statement, $values = null)
{
    try {
        $stmt = $this->db->prepare($statement);
        if (is_null($values)) {
            $values = Array();
        }
        $count = 1;
        foreach ($values as $data) {
             $stmt->bindValue($count, $data);
             $count++;
        }
        $stmt->execute();
        return $stmt;
    } catch (PDOException $e) {
        return $e->getMessage();
    }
}

Eu uso uma classe com métodos mágicos para renderizar minha view então eu geralmente eu uso isso no controller.

<?php
$usuario = new Usuario(Connection::getInstance()->getConnection());

$dados = $this->usuario->getUsuarios();

$this->view->dados = $dados;
$this->view->render = "usuario/consultar.php";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bastaria você uniformizar:

if ($stmt->rowCount() >= 1) {
    return $stmt->fetchAll(PDO::FETCH_OBJ);
}

return null;

Dessa forma, sempre retornará um array de objetos.

Outro ponto, que é o recomendável, é não retornar null e sim lançar uma exception.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu podia jurar que eu tinha testado isso e não tinha funcionado >.> tinha dado erro no php (porque eu tentei dar fetchAll em uma linha que iria retornar 1 row tipo id = '1'), testei aqui agora e funcionou O.o.

no mais Obrigado Gabriel Darezzo e Gabriel Heming.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.