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