środa,
Aliasy SQL i mysqli_result
Dla kolumn i tabel w zapytaniu SQL można stosować nazwy zastępcze nazywane aliasami. Czasami ułatwia to pracę, np. nazwy są krótsze i bardziej czytelne. Stosowanie aliasów wpływa na sposób korzystania z niektórych metod obiektu mysqli_result, tworząc kod, należy to uwzględnić.
Wykorzystana w przykładach tabela jest dostępna do pobrania. Jest to zbiór informacji na temat krajowych domen najwyższego poziomu, zawiera nazwy jednostek terytorialnych i zarezerwowane dla nich dwuliterowe domeny.
Wszystkie prezentowane w materiale przykłady można przetestować, wstawiając kod do poniższego skryptu. Należy pamiętać o wpisaniu własnych danych potrzebnych do połączenia się z bazą. Metoda set_charset() służy do ustawienia zestawu znaków używanego do wymiany danych z serwerem MySQL.
<?php
define('DBHOST', 'localhost');
define('DBUSER', 'użytkownik');
define('DBPASS', 'hasło');
define('DBNAME', 'nazwa_bazy');
$mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
$mysqli->set_charset("utf8");
/* TUTAJ WSTAW KOD PRZYKŁADÓW */
$result->close();
$mysqli->close();
?>
W poniższym zapytaniu nie zastosowano aliasów. Jednym z pól wyniku zapytania jest obliczona długość ciągu znaków określającego jednostkę terytorialną, do której przypisano domenę, jego nazwa będzie wyglądać dziwnie i może sprawiać spore problemy przy odwołaniach dla początkujących programistów.
$result = $mysqli->query("SELECT name, entity, LENGTH(entity) FROM domains LIMIT 2");
while ($row = $result->fetch_object()) {
print_r($row);
}
/*
stdClass Object
(
[name] => ac
[entity] => Wyspa Wniebowstąpienia
[LENGTH(entity)] => 23
)
[...]
*/
W uzupełnieniu poprzedniego przykładu przedstawiono sposób odwołania się do własności obiektu z nawiasami w nazwie.
echo $row->{'LENGTH(entity)'};
Zdecydowanie lepszym rozwiązaniem jest zastosowanie aliasu dla potencjalnie problematycznej nazwy, w tym przypadku jest to litera „l”, ale oczywiście alias może być bardziej opisowy. Istnienie aliasu należy uwzględnić w operacjach na danych zwracanych przez metodę fetch_object() i posługiwać się nazwą aliasu, a nie nazwą tabeli.
$result = $mysqli->query("SELECT name, entity, LENGTH(entity) as l FROM domains LIMIT 2");
while ($row = $result->fetch_object()) {
printf('%s - %s (%d)
', $row->name, $row->entity, $row->l);
}
Podczas pobierania danych w formie tablicy asocjacyjnej za pomocą metody fetch_assoc(), także trzeba uwzględnić istnienie aliasu. Sytuacja będzie podobna przy niektórych wywołaniach metod fetch_all() oraz fetch_array(), wtedy kiedy zwracane dane wystąpią jako tablice asocjacyjne.
$result = $mysqli->query("SELECT entity, LENGTH(entity) as l FROM domains LIMIT 2");
while ($row = $result->fetch_assoc()) {
printf('%s (%d)
', $row['entity'], $row['l']);
}
W poniższym przykładzie aliasy zastosowano dla kolumny i nazwy tabeli. Na podstawie wyników zwróconych przez metodę fetch_field_direct() można się o tym zorientować:
- name – nazwa kolumny jest różna od oryginalnej, oznacza to alias;
- orgname – oryginalna nazwa kolumny;
- table – nazwa tabeli jest różna od oryginalnej, oznacza to alias;
- orgtable – oryginalna nazwa tabeli, z której pochodzi pole.
$result = $mysqli->query("SELECT d.entity as e FROM domains as d LIMIT 2");
print_r($result->fetch_field_direct(0));
/*
stdClass Object
(
[name] => e
[orgname] => entity
[table] => d
[orgtable] => domains
[def] =>
[db] => x2x
[catalog] => def
[max_length] => 23
[length] => 180
[charsetnr] => 33
[flags] => 4097
[type] => 254
[decimals] => 0
)
*/
Podobne jak w ostatnim przykładzie dane zwrócą metody fetch_fields() oraz fetch_field().