Putting multiple rows into an array:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = $mysqli->query($query);
while($row = $result->fetch_array())
{
$rows[] = $row;
}
foreach($rows as $row)
{
echo $row['CountryCode'];
}
/* free result set */
$result->close();
/* close connection */
$mysqli->close();
?>
mysqli_fetch_array
result->fetch_array
(PHP 5)
mysqli_fetch_array -- result->fetch_array — Obtem uma linha do resultado como uma matriz associativa, numérica, ou ambas
Descrição
Estilo de procedimento:
Estilo orientado a objetos (metodo):
$resulttype
] )
Retorna uma matriz que corresponde a linha obtida ou NULL se não houverem mais linhas
para o conjunto deresultados representado pelo parâmetro result.
mysqli_fetch_array() é uma versão extendida da função mysqli_fetch_row(). Alem de guardar os dados em índices numéricos na matriz do resultado, a função mysqli_fetch_array() pode também guardar os dados em índices associativos, usando os nomes dos campos do conjunto de resultado como chave.
Nota: Nomes de campos nesta função diferenciam maiúsculas e minusculas.
Nota: Esta função assimila campos NULL para o o
NULLdo PHP.
Se duas ou mais colunas do resultado tiverem o mesmo nome do campo, a ultima coluna terá precedencia e irá sobrescrever os dados anteriores. Para poder acessar múltiplas colunas com o mesmo nome, deve ser usada a versão com os índices numéricos.
O segundo arqumento, que é opcional, resulttype é uma constante indicando qual tipo
de matriz deve ser produzido da linha atual do resultado. Os valores possíveis para este parâmetro
são as constantes MYSQLI_ASSOC, MYSQLI_NUM, ou MYSQLI_BOTH. Pos padrão, a função mysqli_fetch_array() irá assumir MYSQLI_BOTH para este parâmetro.
Usando a constante MYSQLI_ASSOC esta função irá funcionar de modo identico a mysqli_fetch_assoc(), enquando MYSQLI_NUM irá funcionar de modo identico a função mysqli_fetch_row(). A opção final MYSQLI_BOTH irá criar uma única matriz com os atributos de ambas.
Valores de retorno
Retorna uma matriz que corresponde a linha obtida ou NULL se não houverem mais linhas
no conjunto de resultados.
Veja também
mysqli_fetch_assoc(), mysqli_fetch_row(), mysqli_fetch_object().
Exemplo
Exemplo #1 Estilo orientado a objeto
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = $mysqli->query($query);
/* numeric array */
$row = $result->fetch_array(MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);
/* associative array */
$row = $result->fetch_array(MYSQLI_ASSOC);
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
/* associative and numeric array */
$row = $result->fetch_array(MYSQLI_BOTH);
printf ("%s (%s)\n", $row[0], $row["CountryCode"]);
/* free result set */
$result->close();
/* close connection */
$mysqli->close();
?>
Exemplo #2 Estilo de procedimento
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = mysqli_query($link, $query);
/* numeric array */
$row = mysqli_fetch_array($result, MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);
/* associative array */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
/* associative and numeric array */
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
printf ("%s (%s)\n", $row[0], $row["CountryCode"]);
/* free result set */
mysqli_free_result($result);
/* close connection */
mysqli_close($link);
?>
Os exemplos acima devem produzir a seguinte saída:
Kabul (AFG) Qandahar (AFG) Herat (AFG)
Note that the array returned contains only strings.
E.g. when a MySQL field is an INT you may expect the field to be returned as an integer, however all fields are simply returned as strings.
What this means: use double-equals not triple equals when comparing numbers.
<?php
print $array_from_mysqli_fetch_array['id'] == 1 ? "true" : "false"; // true
print $array_from_mysqli_fetch_array['id'] === 1 ? "true" : "false"; // false
?>
Here is a function to return an associative array with multiple columns as keys to the array.
This is a rough approximation of the perl DBI->fetchall_hashref function - something I find myself using quite a bit.
Given a simple mySQL table:
mysql> select * from city;
+----------------+----------------+------------------+------------+
| country | region | city | hemisphere |
+----------------+----------------+------------------+------------+
| South Africa | KwaZulu-Natal | Durban | South |
| South Africa | Gauteng | Johannesburg | South |
| South Africa | Gauteng | Tshwane | South |
| South Africa | KwaZulu-Natal | Pietermaritzburg | South |
| United Kingdom | Greater London | City of London | North |
| United Kingdom | Greater London | Wimbledon | North |
| United Kingdom | Lancashire | Liverpool | North |
| United Kingdom | Lancashire | Manchester | North |
+----------------+----------------+------------------+------------+
*Note* - this is a simple function that makes no attempt to keep multiple values per key, so you need to specify all the unique keys you require.
<?php
$link = mysqli_connect("localhost", "username", "password", "test");
$result = mysqli_query($link, "select * from city");
$results_arr = fetch_all_assoc($result,array('hemisphere','country','region','city'));
function fetch_all_assoc(& $result,$index_keys) {
// Args : $result = mysqli result variable (passed as reference to allow a free() at the end
// $indexkeys = array of columns to index on
// Returns : associative array indexed by the keys array
$assoc = array(); // The array we're going to be returning
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$pointer = & $assoc; // Start the pointer off at the base of the array
for ($i=0; $i<count($index_keys); $i++) {
$key_name = $index_keys[$i];
if (!isset($row[$key_name])) {
print "Error: Key $key_name is not present in the results output.\n";
return(false);
}
$key_val= isset($row[$key_name]) ? $row[$key_name] : "";
if (!isset($pointer[$key_val])) {
$pointer[$key_val] = ""; // Start a new node
$pointer = & $pointer[$key_val]; // Move the pointer on to the new node
}
else {
$pointer = & $pointer[$key_val]; // Already exists, move the pointer on to the new node
}
} // for $i
// At this point, $pointer should be at the furthest point on the tree of keys
// Now we can go through all the columns and place their values on the tree
// For ease of use, include the index keys and their values at this point too
foreach ($row as $key => $val) {
$pointer[$key] = $val;
}
} // $row
/* free result set */
$result->close();
return($assoc);
}
?>
