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:)

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Obsah súborov projektu po tejto prednáške

1 - footer.php

<div class="footer">
</div>

2 - fotogaleria.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "fotogaleria";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div id="gallery-content" class="main-content right">
<h1>Fotogaléria</h1>
<div class="line"></div>

<?php

$pictures = array();

for($i = 0; $i < 30; $i++){
$pictures[] = 'images/placeholder.jpg';
}

//zadefinovanie maximalneho poctu pre jednu stranku a nacitanie parametra (urcenie aktualnej stranky)
$countPerPage = 12;
if($_GET['page']){
$page = $_GET['page'];
}else{
$page = 1;
}

//vypocet od ktorej po ktoru fotku zobrazujeme galeriu
$start = ($page-1)*$countPerPage;
$end = $page*$countPerPage;

echo '<ul id="gallery">';
for($i = $start; $i < $end; $i++){

if($pictures[$i]){
echo '<li class="left';

if(($i+1)%3){
echo ' photo-margin';
}

echo '">';

echo '<img src="'.$pictures[$i].'">';

echo '<a target="_blank" href="'.$pictures[$i].'" class="over_div">';
echo '<span>Kliknite pre zväčšenie!</span>';
echo '</a>';

echo '</li>';
}
}
echo '</ul>';

//cyklus, ktory nam vypise dostatocny pocet odkazov pre jednotlive stranky
$pageLink = 1;
$photosCount = count($pictures);

echo '<ul class="pagination">';
while($photosCount > 0){

echo '<li><a ';

if($pageLink == $page){
echo ' class="active" ';
}

echo 'href="fotogaleria.php?page='.$pageLink.'">'.$pageLink.'</a>';
echo '</li>';
$photosCount = $photosCount - $countPerPage;
$pageLink++;
}
echo '</ul>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

3 - global.css

BODY{
margin: 0;
background-color: #dee8e7;
font-family: Arial;
}

H1{
color: #5b6b78;
margin-bottom: 10px;
}

.line{
height: 3px;
border-top: 1px dotted #5b6b78;
border-bottom: 1px dotted #5b6b78;
margin-bottom: 25px;
}

.main{
background-color: #f6f7f1;
width: 900px;
margin: auto;
margin-top: 20px;
margin-bottom: 20px;
}

.header{
border-bottom: 1px solid #7d8079;
height: 150px;
}

.header-inner1{
}

.header-inner2{
}

.content{
}

.footer{
border-top: 1px solid #7d8079;
height: 200px;
}

.half-width{
width: 50%;
}

.full-height{
height: 100%;
}

.left{
float: left;
}

.right{
float: right;
}

.clear{
clear: both;
}

/**********MENU***********/
.sidebar{
width: 200px;
height: 400px;
}

.sidebar UL{
list-style-type: none;
padding: 0;
margin: 0;
}

.sidebar UL LI{
position: relative;
}

.sidebar UL LI A, .sidebar UL LI:HOVER .submenu A{
display: block;
padding: 15px 0px 15px 35px;
border-bottom: 1px solid #7d8079;
color: #7d8079;
text-decoration: none;
text-transform: uppercase;
}

.sidebar UL LI A.active{
color: #f5f7f4;
background-color: #f96b81;
}

.sidebar UL LI:HOVER A, .sidebar UL LI .submenu LI:HOVER A{
background-color: #5b6b78;
color: #d6e3e9;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

.submenu{
display: none;
border: 2px solid #7d8079;
position: absolute;
top: -1px;
left: 201px;
width: 200px;
background-color: #FFFFFF;
}

.sidebar UL LI:HOVER .submenu{
display: block;
}

.sidebar UL LI:HOVER .submenu A{
background-color: #FFFFFF;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

/**********GALERIA***********/
/**********GALERIA***********/
#gallery{
display: inline-block;
width: 100%;
list-style-type: none;
margin: 0;
padding: 0;
}

#gallery LI{
position: relative;
height: 133px;
margin-bottom: 10px;
}

#gallery LI IMG{
width: 213px;
height: 133px;
}

.photo-margin{
margin-right: 10px;
}

#gallery A{
display: none;
}

#gallery LI:HOVER A{
display: block;
}

#gallery LI:HOVER{
outline: 2px solid #7d8079;
}

#gallery A{
text-decoration: none;
position: absolute;
background-color: grey;
opacity: 0.4;
height: 100%;
width: 100%;
top: 0px;
}

#gallery A SPAN{
position: relative;
top: 100px;
color: #FFFFFF;
font-weight: bold;
}

/**********PERSONS***********/
.persons{
width: 100%;
table-layout: fixed;
font-family: Arial;
}

.persons, .persons TH, .persons TD{
border: 1px solid #D9E4E6;
}

.persons TH, .persons TD{
padding: 15px;
}

.persons TH{
background-color: #167F92;
color: #FFFFFF;
font-weight: normal;
text-transform: uppercase;
}

.persons TR:nth-child(odd){
background-color: #D9E4E6;
}

.persons TR{
color: #024457;
background-color: #FFFFFF;
}

.persons TD{
font-size: 14px;
}

.persons TR:HOVER{
color: #f5f7f4;
background-color: #f96b81;
cursor: pointer;
}

/**********PERSONS***********/
.contact_form{
padding: 20px;
border: 1px solid #ebebeb;
background-color: white;
font-family: Arial;
font-size: 14px;
color: #455560;
text-transform: uppercase;
text-align: center;
}

.contact_form INPUT, .contact_form TEXTAREA, .contact_form LABEL{
display: block;
width: 100%;
}

.contact_form LABEL{
margin-bottom: 5px;
text-align: left;
}

.contact_form INPUT, .contact_form TEXTAREA{
height: 30px;
border: 1px solid #bababa;
margin-bottom: 30px;
}

.contact_form TEXTAREA{
min-height: 100px;
min-width: 100%;
max-width: 100%;
}

.contact_form INPUT[type="submit"]{
display: inline;
width: 200px;
height: 40px;
background-color: #7bc143;
border: 1px solid #6fae3c;
font-size: 16px;
color: #FFFFFF;
text-transform: uppercase;
}

.contact_form INPUT[type="submit"]:HOVER{
cursor: pointer;
background-color: #42aa44;
}

.success, .error{
border: 1px solid;
margin: 10px 0px;
padding:15px 10px 15px 10px;
}

.success {
color: #4F8A10;
background-color: #DFF2BF;
}

.error {
color: #D8000C;
background-color: #FFBABA;
}
/**********PAGINATION***********/
#gallery-content{
text-align: center;
}

ul.pagination {
display: inline-block;
padding: 0;
margin: 10px 0px 20px 0px;
}

ul.pagination li {
display: inline;
}

ul.pagination li a {
color: black;
padding: 8px 16px;
text-decoration: none;
border: 1px solid #ddd;
}

ul.pagination li a.active {
background-color: #4CAF50;
color: white;
}

ul.pagination li a:hover{
background-color: #ddd;
}

.map{
margin: 30px 0px;
text-align: center;
padding: 25px 0px;
background-color: #FFFFFF;
}

4 - header.php

<div class="header">
<div class="header-inner1 full-height half-width left"></div>
<div class="header-inner2 full-height half-width left"></div>
</div>

5 - index.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "index";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Domov</h1>
<div class="line"></div>

<?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);

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.";
}

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

6 - kontakt.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "kontakt";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Kontakt</h1>
<div class="line"></div>

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['contact_form']){
if(!preg_match('#^[a-zA-Z0-9]{5,10}$#', $_POST['name']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
echo '<p class="error">Zadajte prosim korektne udaje</p>';

//naplnenie formulara
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
}else{
//odoslanie emailu
echo '<p class="success">Vasa sprava bola uspesne odoslana.</p>';

$name = '';
$email = '';
$subject = '';
$message = '';
}

}

?>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" class="contact_form">
<label for="email">Meno a priezvisko</label>
<input type="text" name="name" id="name" value="<?php echo $name;?>"><br><br>

<label for="email">Email</label>
<input type="text" name="email" id="email" value="<?php echo $email;?>"><br><br>

<label for="subject">Predmet</label>
<input type="text" name="subject" id="subject" value="<?php echo $subject;?>"><br><br>

<label for="message">Správa</label>
<textarea name="message" id="message" placeholder="Zadajte text spravy..."><?php echo $message;?></textarea><br><br>

<input type="submit" name="contact_form" value="Odoslat">
</form>

<div class="map">
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d84199.38373426767!2d19.06093170408453!3d48.73928892777478!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47153de36e8ad42f%3A0xf8223f8a0b8b9032!2sBansk%C3%A1+Bystrica!5e0!3m2!1ssk!2ssk!4v1465151393672" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

7 - menu.php

<div class="sidebar left">
<ul>
<li><a class="<?php if($actual_page == "index"){echo 'active';}?>" href="index.php">Domov</a></li>
<li><a class="<?php if($actual_page == "o-nas"){echo 'active';}?>" href="o-nas.php">O nás</a></li>
<li><a class="<?php if($actual_page == "fotogaleria"){echo 'active';}?>" href="fotogaleria.php">Fotogaléria</a></li>
<li>
<a class="<?php if($actual_page == "kontakt"){echo 'active';}?>" href="kontakt.php">Kontakt</a>

<ul class="submenu">
<li><a href="kontakt.php">Kontakt</a></li>
<li><a href="kontakt.php">Kontakt</a></li>
</ul>

</li>
</ul>
</div>

8 - o-nas.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "o-nas";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>O nás</h1>
<div class="line"></div>

<?php
$person_1 = array('Raťafák', 'Plachta', 'plachtos@mail.sk','0903 123 123');
$person_2 = array('Od kuka', 'do kuka', 'kuko@mail.sk','0903 123 123');
$person_3 = array('Joey', 'Tribbiani', 'ako.sa.mas@mail.sk','0903 123 123');
$person_4 = array('Charlie', 'Harper', 'hooker@mail.sk','0903 123 123');
$person_5 = array('Chruno', 'Moysey', 'abstinent@mail.sk','0903 123 123');

$pole = array($person_1, $person_2, $person_3, $person_4, $person_5);

$pole[5] = array('Jardo', 'Jágr', 'legenda@mail.sk','0903 123 123');

echo '<table class="persons">';
echo '<tr>';
echo '<th>Meno</th>';
echo '<th>Priezvisko</th>';
echo '<th>Email</th>';
echo '<th>Telefónne číslo</th>';
echo '</tr>';

for($i=0; $i<count($pole); $i++){
echo '<tr>';

for($j=0; $j<count($pole[$i]); $j++){
echo '<td>'.$pole[$i][$j].'</td>';
}

echo '</tr>';
}

echo '</table>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

mysqli_connectmysqli_queryforeachkeyvalueforeach key valueforeach index valuephp mysqlphp queryphp sql queryphp sql resultsql resultmysqli_fetch_allnacitanie dat v php z databazy

IT ftip

Sedí maniak pred počítačom a zrazu ho trhne: - Sakra, veď ja som už na tom internete zavislý! Chvíľu rozmýšľa, otvorí si nové okno s browserom a hovorí: - Hmm... niekde tu na to musí niečo byť.