GAJDAW


MOJE KSIĄŻKI

Książka pt. Git. Recipes
Książka pt. Git. Rozproszony system kontroli wersji
Książka pt. PhpStorm Starter
Książka pt. Symfony w przykładach
Książka pt. GIMP. Praktyczne projekty. Wydanie II
Książka pt. PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych
Książka pt. PHP. Praktyczne projekty

PROGRAMY

1 2 3 4


Słownik z autouzupełnianiem przy użyciu jQuery

Włodzimierz Gajda

4. Implementacja słownika w oparciu o bazę danych

Rozwiązanie tak jak poprzednio składa się z trzech plików:

Skrypt slownik.php jest identyczny jak poprzednio. Zmianie ulegają wyłącznie pliki podaj-wyrazy.php oraz podaj-wyjasnienie.php.

4.1 Baza danych i aktywne rekordy

Najpierw projektujemy bazę danych przedstawioną na rysunku 4 oraz generujemy obiekty Propel-a.

Rysunek 4. Model bazy danych

Następnie wypełniamy bazę danych rekordami. Zadanie to wykonuje skrypt parse.php. Został on przetestowany na pliku ze słownikiem Webstera, hasła na literę D oraz E.

4.2 Skrypt podaj-wyrazy.php wykorzystujący bazę danych

Skrypt podaj-wyrazy.php, który wykorzystuje bazę danych rozpoczyna się od inicjalizacji obiektów Propel-a:

require_once 'propel/Propel.php';
require_once 'dictionary/Word.php';

Propel::init('dictionary-conf.php');

Następnie tworzymy nowe kryteria wyszukiwania, które będą zwracały wyrazy posortowane alfabetycznie:

$c = new Criteria;
$c->addAscendingOrderByColumn(WordPeer::HEADWORD);

Jeśli jest podana zmienna $_GET['limit'] to w kryteriach ustalamy limit liczby zwracanych rekordów:

if (isset($_GET['limit']) && str_ievpi($_GET['limit'])) {

    $c->setLimit($_GET['limit']);

};

Ostatnie kryterium wyszukiwania odpowiada za pobranie z bazy danych tylko słów o zadanym przedrostku:

if (isset($_GET['q']) && (preg_match('/^[a-z]+$/ui', $_GET['q']))) {

    $c->add(WordPeer::HEADWORD, $_GET['q'] . '%', Criteria::LIKE);

}

Po ustaleniu kryteriów pobieramy rekordy z bazy danych:

$slowa = WordPeer::doSelect($c);

po czym przetwarzamy w pętli, drukując słowa:

foreach ($slowa as $s) {
    echo $s->getHeadword() . "\r\n";
}

Listing 4 przedstawia kompletny skrypt podaj-wyrazy.php wykorzystujący bazę danych.

require_once 'propel/Propel.php';
require_once 'dictionary/Word.php';

Propel::init('dictionary-conf.php');

require_once 'walidacja.inc.php';

$c = new Criteria;
$c->addAscendingOrderByColumn(WordPeer::HEADWORD);

if (isset($_GET['limit']) && str_ievpi($_GET['limit'])) {

    $c->setLimit($_GET['limit']);

};

if (isset($_GET['q']) && (preg_match('/^[a-z]+$/ui', $_GET['q']))) {

    $c->add(WordPeer::HEADWORD, $_GET['q'] . '%', Criteria::LIKE);

}

$slowa = WordPeer::doSelect($c);

foreach ($slowa as $s) {
    echo $s->getHeadword() . "\r\n";
}

Listing 4. Baza danych — skrypt podaj-wyrazy.php

4.3 Skrypt podaj-wyjasnienie.php wykorzystujący bazę danych

W skrypcie odpowiedzialnym za pobieranie wyjaśnienia z bazy danych najpierw sprawdzamy, czy zostało podane słowo. Jeśli nie, to drukujemy słowo brak:

if (isset($_GET['word']) && (preg_match('/^[a-z]+$/ui', $_GET['word']))) {

    ...

    
} else {

    echo 'brak';
    
}

Jeśli słowo zostało podane, to tworzymy kryteria i pobieramy z bazy danych słowa:

$c = new Criteria;
$c->add(WordPeer::HEADWORD, $_GET['word']);
$slowa = WordPeer::doSelect($c);    

Jeśli pobrana lista nie jest pusta, przetwarzamy ją, drukując wyjaśnienia wszystkich słów:

if (!empty($slowa)) {
    foreach ($slowa as $slowo) {
        echo $slowo->getExplanation() ."\r\n\r\n";
    }    
}

Kompletny skrypt jest przedstawiony na listingu 5.

require_once 'propel/Propel.php';
require_once 'dictionary/Word.php';

Propel::init('dictionary-conf.php');

require_once 'walidacja.inc.php';

if (isset($_GET['word']) && (preg_match('/^[a-z]+$/ui', $_GET['word']))) {

    $c = new Criteria;
    
    $c->add(WordPeer::HEADWORD, $_GET['word']);
    
    $slowa = WordPeer::doSelect($c);    
    
    
    if (!empty($slowa)) {
        foreach ($slowa as $slowo) {
            echo $slowo->getExplanation() ."\r\n\r\n";
        }    
    }
    
    
} else {

    echo 'brak';
    
}

Listing 5. Baza danych — skrypt podaj-wyjasnienie.php

Słowa zawarte w słowniku (ang. headword, entry) nie są unikalne. Stwierdzisz to szukając w słowniku angielsko-polskim wyrazu plumb. Dlatego po wywołaniu

$c = new Criteria;
$c->add(WordPeer::HEADWORD, 'plumb');
$slowa = WordPeer::doSelect($c);    

tablica $slowa będzie zawierała kilka elementów.


Reklama

Szkolenia z Zend Framework 2.0


1 2 3 4