Executando instruçÔes

InstruçÔes podem ser executadas com mysqli::query(), mysqli::real_query() e mysqli::multi_query(). A função mysqli::query() Ă© a mais comum, e combina a instrução em execução com uma busca em buffer de seu conjunto de resultados, se houver, em uma chamada. Chamar mysqli::query() Ă© idĂȘntico a chamar mysqli::real_query() seguido de mysqli::store_result().

Exemplo #1 Executando consultas

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

Conjunto de resultados com buffer

Depois da execução da instrução, os resultados podem ser recebidos de uma vez ou lidos linha a linha do servidor. O buffer do conjunto de resultados do lado do cliente permite ao servidor liberar recursos associados com os resultados da instrução da forma mais antecipada possível. Em geral, clientes são consumidores lentos dos resultados. Portanto, é recomendado usar conjuntos de resultados com buffer. mysqli::query() combina buffer de execução de instrução e de conjunto de resultados.

As aplicaçÔes PHP podem navegar livremente através de resultados em buffer. A navegação é råpida porque os conjuntos de resultados são mantidos na memória do cliente. Tenha em mente que muitas vezes é mais fåcil escalar por cliente do que escalar por servidor.

Exemplo #2 Navegando através de resultados em buffer

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

echo
"Ordem reversa...\n";
for (
$row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
$row = $result->fetch_assoc();
echo
" id = " . $row['id'] . "\n";
}

echo
"Ordem do conjunto de resultados...\n";
foreach (
$result as $row) {
echo
" id = " . $row['id'] . "\n";
}

O exemplo acima produzirĂĄ:

Ordem reversa...
 id = 3
 id = 2
 id = 1
Ordem do conjunto de resultados...
 id = 1
 id = 2
 id = 3

Conjuntos de resultado sem buffer

Se a memĂłria do cliente Ă© um recurso escasso e liberar recursos do servidor tĂŁo cedo quanto possĂ­vel para manter a carga baixa nĂŁo seja necessĂĄrio, resultados sem buffer podem ser usados. Navegar por resultados sem buffer nĂŁo Ă© possĂ­vel enquanto os dados nĂŁo tenham sido completamente lidos.

Exemplo #3 Navegando através de resultados sem buffer

<?php

$mysqli
->real_query("SELECT id FROM test ORDER BY id ASC");
$result = $mysqli->use_result();

echo
"Ordem do conjunto de resultados...\n";
foreach (
$result as $row) {
echo
" id = " . $row['id'] . "\n";
}

Tipos de dados dos valores do conjunto de resultados

As funçÔes mysqli::query(), mysqli::real_query() e mysqli::multi_query() são usadas para executar instruçÔes não preparadas. No nível do protocolo cliente-servidor do MySQL, o comando COM_QUERY e o protocolo de texto são usados para execução de instrução. Com o protocolo de texto, o servidor MySQL converte todos os dados de um resultado em strings antes do envio. Esta conversão é feita independente do tipo de dados da coluna do resultado SQL. As bibliotecas do cliente mysql recebem todos os valores de colunas como strings. Nenhuma conversão adicional do lado do cliente é feita para retornar as colunas a seus tipos nativos. Ao invés disso, todos os valores são fornecidos como strings PHP.

Exemplo #4 Protocolo de texto retorna strings por padrĂŁo

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

O exemplo acima produzirĂĄ:

id = 1 (string)
label = a (string)

É possĂ­vel converter colunas de inteiros e floats de volta para nĂșmeros PHP configurando a opção de conexĂŁo MYSQLI_OPT_INT_AND_FLOAT_NATIVE, se a biblioteca mysqlnd estiver sendo usada. Se configurada, a biblioteca mysqlnd irĂĄ verificar os tipos de coluna nos metadados do conjunto de resultados e converter colunas SQL para nĂșmeros PHP, se a faixa de valores do tipo de dado PHP permitir. Desta forma, por exemplo, colunas INT do SQL sĂŁo retornadas como inteiros.

Exemplo #5 Tipos de dados nativos com mysqlnd e opção de conexão

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

O exemplo acima produzirĂĄ:

id = 1 (integer)
label = a (string)

Veja também

adicionar nota

Notas de UsuĂĄrios

NĂŁo hĂĄ notas de usuĂĄrios para esta pĂĄgina.