Načítání dat z databáze lze provést mnoha způsoby. U některých z nich ale proběhne vizuálně nepříjemné znovunačtění stránky (refresh), které může kazit dojem jinak pěkné webové prezentace. V tomto článku podrobně vysvětlím, jak se této vadě na kráse vyhnout.
6.3.2013 00:00 | Vladimír Macháček | přečteno 21712×
Dynamické načítání se dá použít teoreticky všude. Ankety, chaty, komentáře k článkům, hry, aplikace na webu a samotné načítání obsahu jako např. článků, novinek a obrázků. Další možnost je třeba odesílání článků, emailů a úprava právě odeslaného komentáře, což je např. na Facebooku. Největší nevýhoda je asi ta, že pokud bude mít uživatel vypnutý javascript, tak většina aplikací, anket a dynamické načítání apod. používající tuto knihovnu, nebudou fungovat.
Nejdříve by bylo vhodné si ujasnit, jak budeme postupovat, jaká bude struktura stránky a co chceme za výsledek. V tomto návodu budeme načítat článek z databáze a budeme chtít vypsat nadpis, anotaci a samotný článek. Chceme tedy, aby se po kliknutí na odkaz v menu načetl článek bez přenačítání stránky a zobrazil se na určitém místě. Při načítání dat, pro lepší dojem a vzhled, přidáme loader (obrázek při načítání) nebo progressbar, který je zabudovaný v každém prohlížeči, který podporuje tagy HTML5. Nemusí tedy fungovat v každém prohlížeči! Progressbar je grafické zobrazení probíhajícího procesu. Je to taková ikona. Loader je animovaný obrázek ve formátu gif. Je ho možné vytvořit v jakémkoliv grafickém programu, ve kterém je možnost vytvářet animace. Tím nejznámějším je asi Photoshop, Corel a Gimp. Na internetu je mnoho stránek, kde se dá tento obrázek vytvořit bez větší námahy. Později v článku uvedu, jak zprovoznit obě možnosti zobrazení procesu.
Když jsme si ujasnili úlohu, můžeme se pustit do samotného programování. Vytvoříme si 3 soubory (index.php, load.php a load.js). Potom si stáhneme knihovnu jQuery. Knihovnu lze také načítát přímo ze stránek vydavatele. Stačí pouze do atributu href zadat adresu souboru. U tohoto příkladu budu ale používat pouze staženou knihovnu.
Teď si vytvoříme strukturu v souboru index.php. Budeme mít nějaký odkaz na článek a div, do kterého se budou načítát data. Div, do kterého budeme načítat data, bude content. Struktura bude následující:
<html>
<head>
<script src="js/jquery.js"></script>
<script src="js/load.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Dynamické načítání dat</title>
</head>
<body>
<div id="menu">
<a href="index.php?id-article=1">1.článek</a>
<br />
<a href="index.php?id-article=2">2.článek</a>
</div>
<div id="content">
<div id="article">
<?php
include('php/load.php');//Načtení souboru load.php
?>
</div>
</div>
</body>
</html>
Tento skript bude získávat data z databáze a vypisovat je. Skript funguje následovně:
Nejdříve si vytvoříme všechny proměnné pro připojení a získání článku.
<?php
$dblogin='root';//Uživatelské jméno
$dbpassword='password';//Uživatelské heslo
@$idarticle=$_GET['id-article'];//Id požadovaného článku
?>
Teď vytvoříme try-catch blok s připojením a chybovou hláškou.
<?php
$dblogin='root';//Uživatelské jméno
$dbpassword='password';//Uživatelské heslo
@$idarticle=$_GET['id-article'];//Id požadovaného článku
//try-catch blok
try {
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF-8', $dblogin, $dbpassword);//Připojení k databázi
}
} catch (Exception $e) {//Pokud se připojení nepodařilo
exit("Nelze se připojit k databázi ".$e->getMessage());//Vypiš chybovou hlášku a chybu
}
?>
Jako další si připravíme dotaz, ošetříme jej proti SQL injection a provedeme jej.
<?php
$dblogin='root';//Uživatelské jméno
$dbpassword='password';//Uživatelské heslo
@$idarticle=$_GET['id-article'];//Id požadovaného článku
//try-catch blok
try {
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF-8', $dblogin, $dbpassword);//Připojení k databázi
$stmt = $db->prepare("SELECT * FROM articles WHERE id=?");//Připravení dotazu
$stmt ->bindParam(1, $idarticle, PDO::PARAM_INT);//Ošetření dotazu proti SQL injection
$stmt->execute();//Provedení dotazu
}
} catch (Exception $e) {//Pokud se připojení nepodařilo
exit("Nelze se připojit k databázi ".$e->getMessage());//Vypiš chybovou hlášku a chybu
}
?>
Nakonec vypíšeme všechna nalezená data. Protože očekáváme jen jeden článek = jeden řádek z databáze, tak použijeme metodu fetch(). Pokud by bylo řádků více, použijeme metodu fetchAll().
<?php
$dblogin='root';//Uživatelské jméno
$dbpassword='password';//Uživatelské heslo
@$idarticle=$_GET['id-article'];//Id požadovaného článku
//try-catch blok
try {
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF-8', $dblogin, $dbpassword);//Připojení k databázi
$stmt = $db->prepare("SELECT * FROM articles WHERE id=?");//Připravení dotazu
$stmt ->bindParam(1, $idarticle, PDO::PARAM_INT);//Ošetření dotazu proti SQL injection
$stmt->execute();//Provedení dotazu
while ($row = $stmt->fetch()) {//Vypsání dat
echo '<div class="article">'.$row['title'].'<thr /><br />'.$row['annotation'].'<hr /><br />'.$row['article'].'</div>';
}
} catch (Exception $e) {//Pokud se připojení nepodařilo
exit("Nelze se připojit k databázi ".$e->getMessage());//Vypiš chybovou hlášku a chybu
}
?>
Odesílání dat je prováděno metodou $_GET[]. Tento skript bude provádět následující operace:
// JavaScript Document
$(document).ready(function(){//Zaznamenání načtení dokumentu
$('#menu a').click(function(){//Zaznamenání kliknutí na odkaz v menu
var content = $(this).attr('href')+' #article';//Vytvoření proměnné content a získání atributu href;
})
})
Potom zobrazíme průběh procesu pomocí jedné z dříve jmenovaných možností.
// JavaScript Document
$(document).ready(function(){//Zaznamenání načtení dokumentu
$('#menu a').click(function(){//Zaznamenání kliknutí na odkaz v menu
var content = $(this).attr('href')+' #article';//Vytvoření proměnné content a získání atributu href;
$('#content').html('<img src="images/loader.gif" id="loader" />');//Zobrazení procesu
})
})
Pokud nechcete zobrazovat proces pomocí obrázku můžete použít progressbar. Stačí akorát zaměnit kód v závorce a to následovně.
$('#content').html('Načítám...<br /><progress></progress>')//Zobrazení procesu;
Nakonec načteme data a vypíšeme je v divu content.
// JavaScript Document
$(document).ready(function(){//Zaznamenání načtení dokumentu
$('#menu a').click(function(){//Zaznamenání kliknutí na odkaz v menu
var content = $(this).attr('href')+' #article'//Vytvoření proměnné content a získání atributu href;
$('#content').html('Načítám...<br /><progress></progress>');
$('#content').load(content),//Načtení obsahu z proměnné
function(output) {
$('#content').html(output);//Výpis obsahu na požadované místo
}
return false;
})
})
Jak je vidět již na první pohled, tak načítání dat pomocí knihovny jQuery a PHP není nic složitého. Dle mého názoru je to jednoduché a efektivní. Data se načítají rychleji a to bez zbytečného problikávání a skákání stránky. Pro uživatele je to určitě příjemnější.