Pergunta

Foi usando PHP / MySQL por um tempo agora, e eu estou querendo saber se existem vantagens específicas (de desempenho ou de outra forma) para usar mysql_fetch_object() vs mysql_fetch_assoc() / mysql_fetch_array().

Foi útil?

Solução

Em termos de performance, não importa o que você usa. A diferença é que objeto mysql_fetch_object retornos:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc () retorna matriz associativa:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

e mysql_fetch_array () retorna matriz:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

Outras dicas

mysql_fetch_array torna seu código difícil de ler = um pesadelo maintenace. Você não pode ver de relance quais dados o seu objeto está lidando. É um pouco mais rápido, mas se isso é importante para você que você está processando tantos dados que PHP não é provavelmente o caminho certo a seguir.

mysql_fetch_object tem alguns inconvenientes, especialmente se você basear uma camada db nele.

  • Os nomes das colunas podem não ser identificadores PHP válidos, por exemplo tax-allowance ou user.id se o driver de banco de dados dá-lhe o nome da coluna, como especificado na consulta. Então você tem que começar a usar {} em todo o lugar.

  • Se você deseja obter uma coluna com base em seu nome, stroed em alguma variável que você também tem que começar a usar propriedades variável $row->{$column_name}, enquanto variedade sintaxe $row[$column_name]

  • Construtores não se invocado quando você poderia esperar se você especificar o nome da classe.

  • Se você não especificar o nome da classe que você começa um stdClass, que dificilmente é melhor do que um conjunto de qualquer maneira.

mysql_fetch_assoc é o mais fácil dos três para trabalhar com, e eu como a distinção isso dá no código entre objetos e linhas de resultados de banco de dados ...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

Enquanto muitos fãs OOP (e eu sou um fã OOP) como a idéia de transformar tudo em um objeto, eu sinto que a matriz associativa é um modelo melhor de uma linha de um banco de dados do que um objeto, como em minha mente um objeto é um conjunto de propriedades com métodos para agir sobre eles, enquanto que a linha são dados apenas e deve ser tratado como tal, sem complicação adicional.

Algo para se manter em mente: matrizes podem ser facilmente adicionados a um cache de memória (eaccelerator, XCache, ..), enquanto os objetos não pode (eles precisam para obter serializado quando armazenar e desserializado em cada recuperação!)

.

Você pode passar a usar matrizes em vez de objetos quando você deseja adicionar suporte de memória cache -. Mas pelo tempo que você pode ter que mudar um monte de código já, que usa os valores de retorno de tipo de objeto usados ??anteriormente

Buscando um array com mysql_fetch_array() permite percorrer o conjunto de resultados, quer através de um loop foreach ou um loop for. mysql_fetch_object() não pode ser atravessado por um loop for.

Não tenho certeza se isso ainda importa muito, apenas pensei que eu iria mencioná-lo.

Além disso, se você eventualmente querer aplicar Memcaching aos seus resultados do MySQL, você pode querer opt para arrays. Parece que é mais seguro para os tipos de loja matriz, em vez de resultados tipo de objeto.

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

... é como eu sempre fiz isso. I preferem objetos de uso para coleções de dados em vez de matrizes, uma vez que organiza os dados um pouco melhor, e eu sei que eu sou muito menos propensos a tentar adicionar propriedades arbitrárias para um objeto do que eu tentar adicionar um índice para uma matriz (para os primeiros anos eu usei PHP, eu pensei que você não poderia apenas atribuir propriedades arbitrárias para um objeto, por isso é enraizado para não fazer isso).

Eu acho que a diferença entre todas estas funções é insignificante, especialmente quando comparado com a legibilidade do código.

Se você estiver preocupado com este tipo de otimização, utilização mysql_fetch_row(). É o mais rápido porque não usar arrays associativos (por exemplo $ row [2]), mas é mais fácil de quebrar seu código com ele.

Em termos de velocidade, mysql_fetch_object() é idêntico ao mysql_fetch_array(), e quase tão rápido quanto mysql_fetch_row().

Além disso, com mysql_fetch_object() você só vai ser capaz de dados de campo acesso por nomes de campo correspondente.

Eu voto contra mysql_fetch_array()

Porque você voltar tanto colunas numericamente indexados e nomes de coluna, isso cria uma matriz que é duas vezes maior. É bom se você não precisa para depurar seu código e visualizar o seu conteúdo. Mas para o resto de nós, torna-se mais difícil de debug desde que você tem que percorrer duas vezes mais dados em um formato de aparência estranha.

Às vezes eu correr em um projeto que usa essa função, em seguida, quando eu depurar, eu acho que algo deu terrivelmente errado desde que eu tenho colunas numéricos misturados com os meus dados.

Assim, em nome da sanidade, por favor não use esta função, faz a manutenção do código mais difícil

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top