Vykonanie query a výpis asociatívneho poľa
Keďže už vieme, čo sú asociatívne polia a ako sa pripojiť na databázu, neostáva nám nič iné, ako už našu databázu využívať:) Na tejto prednáške si načítame dáta z našej tabuľky users z databázy zapr_db_1 a vypíšeme ich formou tabuľky tak, ako to je v sekcii O nás nášho projektu. Vykonávanie príkazov do databázy (query) v jazyku PHP je úplne jednoduché. Stačí ovládať jazyka SQL, ktorý sme sa naučili v predchádzajúcom semestri, pretože presne tak, ako sme zadávali SQL príkazy cez systém phpMyAdmin, tak aj v kóde budeme priamo vykonávať tieto príkazy.
Ešte predtým si však budeme musieť pridať jeden parameter do funkcie na pripojenie na databázový server. My sme zatiaľ použili iba adresu, meno a heslo, čo v podstate indikuje len databázový server, ale nie konkrétnu databázu. Teraz už chceme vykonávať query nad konkrétnou databázou, takže ako štvrtý parameter do funckei mysqli_connect pridáme názov našej databázy. Vykonanie samotnej query je možné pomocou funkcie mysqli_query, ktorá očakáva dva parametre, kde prvým parametrom je pripojenie do databázy, resp. vrátená odpoveď a druhým parametrom je samotná query (string s obsahom príkazu tak, ako sme to učili). Kód pre načítanie všetkých dát z našej tabuľky vyzerá takto:
index.php:
$server_name = "localhost";
$user_name = "root";
$password = "root";
$dbname = "zapr_db_1";
$connection = mysqli_connect($server_name, $user_name, $password, $dbname);
if (!$connection) {
echo 'Spojenie s databázou sa nepodarilo nadviazať.';
}else{
echo 'Spojenie s databázou sa podarilo úspešne nadviazať.';
}
$sql_query = "SELECT * FROM users";
$result = mysqli_query($connection, $sql_query);
echo '<pre>';
print_r($result);
echo '</pre>';
Všimnite si, čo sme dostali ako odpoveď. Keď sa pozriete na indexy, už viete, že to ja asociatívne pole. Aj tu vidíte ďalšiu výhodu tohto typu poľa. Keby sme mali indexy číselné, nevedeli by sme, čo dané hodnoty znamenajú. Pri asociatívnom poli sa veľmi často samotné indexy využívajú aj ako označenie samotnej hodnoty (prvku), čo vlastne daná hodnota (prvok) znamená alebo popisuje. Pre nás sú dôležité dva prvky a to field_count (počet polí – stĺpcov) a num_rows (počet riadkov), čo definuje, koľko stĺpcov sme dostali a koľko riadkov sa nachádza v odpovedi. Ak sú tieto odpovede nenulové, tak sa príkaz vykonal správne. Ak sú nulové, znamená to, že sa nám nič nevrátilo a musíme si skontrolovať query, ktorú sme zadali, či je správna a či popisuje to, čo sme chceli vykonať.
V danej premennej, do ktorej sme priradili výsledok vykonania query, v našom prípade $result, sa okrem týchto položiek nachádza oveľa viac dát. Prístup k nim je možný pomocou viacerých funkcií mysqli a každé vracajú niečo iné. My si nateraz ukážeme funkciu, ktorá nám vytiahne z výsledky query dáta tak, ako sme si ich popísali skorej, kde číselné indexy budú indikovať poradové číslo riadka a stringové indexy budú reprezentovať názov stĺpca. Takúto formu dát dostaneme zavolaním funkcie mysqli_fetch_all (fetch – vybrať,dostať – akokeby vytiahni všetky dáta), ktorej prvý parameter je premenná s obsahom výsledky query a druhý parameter je typ dát, resp. typ poľa, aké chceme dostať. Sú tri možnosti, my budeme používať hodnotu MYSQLI_ASSOC, čo označuje asociatívne pole (so stringovými – stĺpcovými indexami). Vytiahnutie dát z nášho SELECTu vyzerá teda nasledovne:
index.php (za výpisom result/za koniec predchádzajúceho kódu):
if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
echo '<br><br><pre>';
print_r($data);
echo '</pre>';
} else {
echo "0 results were selected.";
}
Ako vidíte vo výsledku, dáta sú skutočne zoradené, resp. usporiadané v poli tak, ako sme si to želali. Číselené indexy reprezentujú poradové číslo záznamu z tabuľky a v konkrétnom prvku (zázname/riadku) sa nachádza asociatívne pole, kde indexy reprezentujú názvy stĺpcov. Keď už máme čo potrebujeme, musíme si vysvetliť ešte jednu vec. Číselné indexy vieme veľmi ľahko prechádzať cyklami, kde poradové číslo kroku cyklu reprezentuje aj index prvkov v poli. My si ale v tomto prípade budeme musieť prejsť aj asociatívne pole a otázka je, ako pristúpime k jednotlivým položkám, keď nevieme názov indexov (my teraz vieme, že to je id, user_name atď, ale nebude to vždy tak)?
Na prechádzanie asociatívneho poľa slúži funkcia (akokeby cyklus) s názvom foreach (for each – pre každý prvok), ktorá prejde celé pole podobne ako cyklus. Pomocou špeciálneho zápisu (v zátvorke za slovom foreach) si vieme do dvoch premenných priradiť aktuálnu hodnotu indexu (konkrétny string) a takisto aj aktuálny obsah prvku na danej pozícii (podobne ako pri cykle). Takto vieme prejsť celým poľom a mať prístup aj k indexu aj k hodnote. Aplikujeme si to rovno na našu tabuľku, použijeme tabuľku zo sekcie O nás:
index.php (kód po pripojení na DB):
if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
echo '<table class="persons">';
echo '<tr>';
echo '<th>ID</th>';
echo '<th>Meno</th>';
echo '<th>Priezvisko</th>';
echo '<th>Vek</th>';
echo '<th>Rola</th>';
echo '</tr>';
for($i=0; $i<count($data); $i++){
echo '<tr>';
foreach($data[$i] as $index => $value){
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo "0 results were selected.";
}
Ako vidíte vo výsledku, skutočne sa v našej tabuľke zobrazili všetky dáta tak, ako ich vidíme v tabuľke cez systém phpMyAdmin. Týmto sme dosiahli význam informačných systémov. Priamo v kóde systému (našej webstránky) sme sa pripojili na externú databázu, načítali z nej dáta, ktoré sa inak v našej stránke nenachádzajú (nie sú tam natvrdo uložené ako text) a zobrazili sme ich používateľovi. Pekné nie? A toto je len začiatok, v ďalších kapitolách si vyskúšame ďalšie príkazy (delete, update, insert), s ktorými sa denne stretávate pri surfovaní po internete:)