Dynamické načítání dat z databáze pomocí jQuery a PHP
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.
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.
Kde začít
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.
Pro zobrazení ukázky je nutné mít povolený javascript a prohlížeč, který podporuje tagy HTML5!
První kroky
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í:
Tento skript bude získávat data z databáze a vypisovat je. Skript funguje následovně:
Nejdříve se provede připojení k databázi.
Pokud se připojení podařilo, provede se získání a následný výpis dat z databáze. Pokud ne, skript se ukončí a vypíše se chybová hláška.
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
}
?>
Load.js
Odesílání dat je prováděno metodou $_GET[].
Tento skript bude provádět následující operace:
Nejdříve se zkontroluje, zda je dokument načtený a připravený.
Pokud ano, začne se zaznamenávat klikání na odkazy v menu.
Pokud bylo kliknuto na nějaký odkaz v menu, získá se jeho atribut href a k tomu se přičte div article.
Obsah divu content se smaže a na jeho místo se vloží zobrazení procesu.
Jakmile se získají data z databáze, smaže se zobrazení procesu a získaná data se vypíši do divu content.
Nejdříve zaznamenáme načtení dokumentu, kliknutí na odkaz a vytvoříme proměnou content, ve které bude uložen atribut odkazu a php skript obsažený v divu article.
// 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ě.
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;
})
})
Závěrem
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ší.
DISCUSSION
For this item is no comments.
Add comment is possible for logged registered users.