Pravljenje proste forme pomoću PHP i MySQL

2.deo


U prethodnom delu, uspeli smo da podignemo lokalni server i napravimo formu koja radi kada se unesu svi parametri. U ovom delu ćemo podesiti da forma radi i kada se unese barem jedan parametar, ne nužno svi.

Ukoliko ste do sad sve odradili kako treba, forma bi trebalo da izgleda ovako:



Pre nego što počnemo, treba da sredimo PHP kod na vrhu stranice, zato što ćemo naš upit sastavljati u zavisnosti od toga koji parametar forme je popunjen. Brišemo sve u try bloku osim $connection = new PDO($dsn, $username, $password, $options). Ispod ćemo inicijalizovati promenljive na prazne niske, što će se kasnije menjati. Imamo $location = "", $price = "", $size = "";

Dakle, ideja je da sastavimo upit u zavisnosti od toga šta je prosleđeno u formi. Pre nego što smo obrisali upit, izgledao je ovako: SELECT * FROM houses WHERE location = :location AND price = :price AND size = :size. Ovde smo pretpostavili da će korisnik uneti sve parametre u formu.

Sada nam prvi deo upita ostaje isti: $sql = "SELECT * FROM houses WHERE";, a ostatak će zavisiti od forme. Na primer, ako je unet parametar za lokaciju, stavljamo location = :location u upit. Zatim, kada proveravamo za cenu, prvo proverimo da li je lokacija već postavljena i ako jeste, onda dodajemo AND price = :price, a ako lokacija nije postavljena, onda dodajemo price = :price.

Počinjemo sa lokacijom. Prvo, proveravamo da li je lokacija postavljena i da li je postavljena na nepraznu nisku. Ispod $sql = "SELECT * FROM houses WHERE";, proveravamo if(isset($_POST['location']) && $_POST['location'] != ""){}. Unutar if bloka, dodaćemo vrednost POST promenljive, promenljivoj u PHP-u: $location = $_POST['location'];. Što se tiče SQL upita; Pošto je lokacija postavljena, menjamo upit dodavanjem " location = :location", ovako: $sql = $sql . " location = :location";. Tačka označava spajanje dve ili više niski, tzv. konkatenaciju. Sada naš upit izgleda ovako: $sql = "SELECT * FROM houses WHERE location = :location.";. Važna stvar, ne zaboravite razmak ispred location = :location, ili će vaš upit izgledati ovako "SELECT * FROM houses WHERElocation = :location", a to će vam izbaciti grešku u SQL sintaksi.

To je to što se tiče lokacije, kod bi trebalo da izgleda ovako:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
    if(isset($_POST['submit'])){
        try{
            require "config.php";
            
            $connection = new PDO($dsn, $username, $password, $options);
            
            $location = "";
            $price = "";
            $size = "";
            
            $sql = "SELECT *
                    FROM houses
                    WHERE";
                        
            if(isset($_POST['location']) && $_POST['location'] != ""){
                $location = $_POST['location'];
                $sql = $sql . " location = :location";
            }
            
            
        }catch(PDOException $error){
            echo $error->getMessage();
        }
    }

?>

Isto ćemo uraditi za cenu, samo što ćemo pre toga proveriti da li je $location prazna niska, jer ako jeste, onda naš početni SQL upit nije promenjen i treba da mu dodamo cenu.

Dakle, if(isset($_POST['price']) && $_POST['price']) i unutar if bloka pridružujemo vrednost promenljivoj: $price = $_POST['price']; a ispod proveravamo da li je lokacija prazna niska: if($location != ""). U if blok stavljamo $sql = $sql . " AND price = :price"; (naš SQL upit će biti $sql = "SELECT * FROM houses WHERE location = :location AND price = :price") , a u else blok stavljamo $sql = $sql . " price = :price" (naš SQL upit će biti $sql = "SELECT * FROM houses WHERE price = :price";). Kao što vidite, jedina razlika je u ključnoj reči AND. Imamo je kada je lokacija već postavljena, tj. kada cena nije prvi parametar koji je unet.

Sada bi naš kod trebalo da izgleda ovako:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
    if(isset($_POST['submit'])){
        try{
            require "config.php";
            
            $connection = new PDO($dsn, $username, $password, $options);
            
            $sql = "SELECT *
                    FROM houses
                    WHERE";
                        
            if(isset($_POST['location']) && $_POST['location'] != ""){
                $location = $_POST['location'];
                $sql = $sql . " location = :location";
            }
            
            if(isset($_POST['price']) && $_POST['price'] != ""){
                $price = $_POST['price'];
                if($location != ""){
                    $sql = $sql . " AND price = :price";
                }else{
                    $sql = $sql . "price = :price";
                }
            }
            
            
        }catch(PDOException $error){
            echo $error->getMessage();
        }
    }

?>

Konačno, za size parametar, sve će biti isto kao za price parametar, samo što proveravamo i za $price promenljivu, ne samo za $location:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
    if(isset($_POST['submit'])){
        try{
            require "config.php";
            
            $connection = new PDO($dsn, $username, $password, $options);
            
            $sql = "SELECT *
                    FROM houses
                    WHERE";
                        
            if(isset($_POST['location']) && $_POST['location'] != ""){
                $location = $_POST['location'];
                $sql = $sql . " location = :location";
            }
            
            if(isset($_POST['price']) && $_POST['price'] != ""){
                $price = $_POST['price'];
                if($location != ""){
                    $sql = $sql . " AND price = :price";
                }else{
                    $sql = $sql . "price = :price";
                }
            }
            
            if(isset($_POST['size']) && $_POST['size'] != ""){
                $size = $_POST['size'];
                if($location != "" || $price != ""){
                    $sql = $sql . " AND size = :size";
                }else{
                    $sql = $sql . " size = :size";
                }
            }
            
            
        }catch(PDOException $error){
            echo $error->getMessage();
        }
    }

?>

Dobro, sada imamo spreman SQL upit. Ispod svih ovih blokova, možete ištampati upit; echo $sql; ukoliko želite da vidite kako izgleda koji u zavisnosti od toga koji parametar unesete.

Sada treba da pridružimo vrednosti promenljivih parametrima u upitu. U prvom delu smo pridruživali sva tri parametra jer smo radili tako da moraju da se unesu sva tri parametra forme, ali sada moramo da proverimo koja promenljiva nije prazna niska i na osnovu toga da pridružujemo upitu. Pre pridruživanja, pripremamo naredbu sa $statement = $connection->prepare($sql);. Pridruživanje:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$statement = $connection->prepare($sql);
            
            
            if($location != ""){
                $statement->bindParam(":location", $location, PDO::PARAM_STR);
            }
            if($price != ""){
                $statement->bindParam(":price", $price, PDO::PARAM_STR);
            }
            if($size != ""){
                $statement->bindParam(":size", $size, PDO::PARAM_STR);
            }
            

Nakon toga, sve što treba je da izvršimo naredbu i dohvatimo rezultate: $statement->execute();
$result = $statement->fetchAll();.

Konačno, naš kod izgleda ovako:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
<?php
    if(isset($_POST['submit'])){
        try{
            require "config.php";
            
            $connection = new PDO($dsn, $username, $password, $options);
            
            $sql = "SELECT *
                    FROM houses
                    WHERE";
            
            $location = "";
            $size = "";
            $price = "";
                        
            if(isset($_POST['location']) && $_POST['location'] != ""){
                $location = $_POST['location'];
                $sql = $sql . " location = :location";
            }
            
            if(isset($_POST['price']) && $_POST['price'] != ""){
                $price = $_POST['price'];
                if($location != ""){
                    $sql = $sql . " AND price = :price";
                }else{
                    $sql = $sql . "price = :price";
                }
            }
            
            if(isset($_POST['size']) && $_POST['size'] != ""){
                $size = $_POST['size'];
                if($location != "" || $price != ""){
                    $sql = $sql . " AND size = :size";
                }else{
                    $sql = $sql . " size = :size";
                }
            }
            
            
            $statement = $connection->prepare($sql);
            
            
            if($location != ""){
                $statement->bindParam(":location", $location, PDO::PARAM_STR);
            }
            if($price != ""){
                $statement->bindParam(":price", $price, PDO::PARAM_STR);
            }
            if($size != ""){
                $statement->bindParam(":size", $size, PDO::PARAM_STR);
            }
            
            $statement->execute();
        
            $result = $statement->fetchAll();
            
        }catch(PDOException $error){
            echo $error->getMessage();
        }
    }

?>

<!DOCTYPE html>
<html>
<head>
<title>Basic form</title>
</head>
<body>

<h2>Simple PHP form</h2>    

<form method="post">
    <label for="location">Location:</label>
    <input type="text" name="location" id="location"> <br>

    <label for="price">Price:</label>
    <input type="text" name="price" id="price"><br>

    <label for="size">Size:</label>
    <input type="text" name="size" id="size"><br>

    <input type="submit" name="submit" value="Submit">

</form>
    
    <?php
        if(isset($_POST['submit'])){
            if($result && $statement->rowCount() > 0){?>
                <h2>Available houses:</h2>
        <?php 
            foreach($result as $row){
                echo "Location: " . $row['location'] . "<br>";
                echo "Price: " . $row['price'] . "<br>";
                echo "Size: " . $row['size'] . "<br>";
            }
        
            }
        }
    ?>

</body>
</html>

Ako unesete samo jedan parametar u formu i pritisnete Submit, trebalo bi da dobijete rezultat ukoliko on postoji (u našem slučaju, npr. price -> 500).
To je sve za ovaj deo :)


Pravljenje proste forme pomoću PHP i MySQL: 1.deo



Hvala što ste čitali, nadam se da je bilo korisno. :)

Lazar Ristić