Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Βάσεις Δεδομένων Κωδικός Μαθήματος: MK741

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Βάσεις Δεδομένων Κωδικός Μαθήματος: MK741"— Μεταγράφημα παρουσίασης:

1 Βάσεις Δεδομένων Κωδικός Μαθήματος: MK741
Είδος Μαθήματος: Επιλογής-Εργαστηριακό Εξάμηνο: 7o – Μάθημα 1ο Διδάσκων: Κοντογιάννης Σωτήριος

2 Δημοσίευση Δεδομένων της MySQL στο Web
Η όλη ιδέα πίσω από ένα database-driven ιστοχώρο είναι να βρίσκεται (εμφανίζεται) το περιεχόμενο (content) του site σε μια βάση δεδομένων και απ’ αυτό το περιεχόμενο της βάσης δεδομένων να εξάγουμε δυναμικά πληροφορίες για να μπορέσουμε να δημιουργήσουμε ιστοσελίδες (Web pages) που να αλλάζουν δυναμικά χωρίς να κάνουμε συνέχεια αλλαγές σ’ αυτές και δημοσίευσή τους (publish). Έτσι, στο ένα άκρο του συστήματος έχουμε έναν επισκέπτη ή χρήστη στο site μας, ο οποίος χρησιμοποιεί έναν φυλλομετρητή (Web browser) και περιμένει να δει μια συνηθισμένη ιστοσελίδα της HTML (HTML Web page). Στο άλλο άκρο έχουμε το περιεχόμενο (content) του site μας που βρίσκεται σ’ έναν ή περισσότερους πίνακες (tables) σε μια βάση δεδομένων της MySQL και το οποίο το μόνο που γνωρίζει είναι πώς να απαντάει σε ερωτήματα (queries) ή εντολές (commands) της SQL.

3 Δημοσίευση Δεδομένων της MySQL στο Web
Η γλώσσα συγγραφής (scripting language) PHP είναι ο ενδιάμεσος που μιλάει και τις δύο γλώσσες. Χρησιμοποιώντας την PHP, μπορούμε να δημιουργήσουμε την παρουσίαση (όψη) του site, δηλ. τα ωραία γραφικά και τις διατάξεις σελίδας (page layouts) σαν υποδείγματα (templates) στην κανονική HTML. Χρησιμοποιούμε τον κώδικα της PHP για να συνδεθούμε στη βάση δεδομένων της MySQL και δημιουργούμε ερωτήματα (queries) της SQL για να μπορέσουμε να ανακτήσουμε και να εμφανίσουμε κάποιο περιεχόμενο της βάσης δεδομένων μέσα σε μια ιστοσελίδα. ΜySQL εντολές-συναρτήσεις της PHP, συνδέονται στη βάση δεδομένων της MySQL και ζητούν το περιεχόμενο (content) που ανήκει στην ιστοσελίδα (Web page) eκτελώντας SQL queries Η βάση δεδομένων MySQL απαντάει στέλνοντας το ζητούμενο περιεχόμενο στο script της PHP. Το script της PHP αποθηκεύει το περιεχόμενο σε μια ή περισσότερες μεταβλητές της PHP και μετά χρησιμοποιεί τη γνωστή μας συνάρτηση echo() για να το εμφανίσει σαν μέρος της ιστοσελίδας.

4 Δημιουργία MySQL Σύνδεσης με την PHP (1)
Πριν μπορέσουμε να πάρουμε το περιεχόμενο μιας βάσης δεδομένων της MySQL για να το εισάγουμε σε μια ιστοσελίδα, πρέπει πρώτα να δούμε πώς θα συνδεθούμε με την MySQL. Η κλήση στην ακόλουθη συνάρτηση της PHP δημιουργεί αυτή τη σύνδεση : mysqli_connect(<address>, <username>, <password>); Όπου το <address> είναι η IP διεύθυνση ή το hostname του υπολογιστή στον οποίο εκτελείται το λογισμικό του MySQL server, που είναι το localhost αν εκτελείται στον ίδιο υπολογιστή με το λογισμικό του Web server, και τα <username> και <password> είναι τα ίδια με τα user name και password της MySQL που χρησιμοποιήσαμε για να συνδεθούμε στον MySQL server. Η συνάρτηση mysqli_connect() επιστρέφει έναν resource για να μπορούμε να αναγνωρίσουμε (ξεχωρίσουμε) τη σύνδεση (connection). Μπορούμε να κρατήσουμε αυτή την τιμή σε μια μεταβλητή, ως εξής : $link = mysqli_connect("localhost", "maXXXXX", "mypasswd"); Η τιμή που επιστρέφει η συνάρτηση mysql_connect(), που θα την αποκαλούμε connection identifier resource (αναγνωριστικό σύνδεσης), αποθηκεύεται σε μια μεταβλητή με όνομα $link.

5 Δημιουργία MySQL Σύνδεσης με την PHP (2)
Σε περίπτωση που ο εξυπηρετητής της mysql δεν είναι διαθέσιμος ή ο χρήστης δεν ταυτοποιείται στον εξυπηρετητή, η συνάρτηση mysqli_connect() δεν επιστρέφει έναν connection identifier αλλά την τιμή false και μήνυμα λάθους που τυπώνεται στο φυλλομετρητή. Έχουμε έτσι τη δυνατότητα να αντιδράσουμε σε τέτοιες καταστάσεις χρησιμοποιώντας μια εντολή if, ως εξής : $link "root", "mypasswd", [“database_name]”); if (!$link) { echo("<P>Η σύνδεση με τον " ."database server είναι αδύνατη</P>"); exit(); } Έχουμε τοποθετήσει το μπροστά από τη συνάρτηση mysqli_connect(). Πολλές συναρτήσεις, όπως και η mysqli_connect(), εμφανίζουν αυτόματα άσχημα μηνύματα λάθους όταν κάτι πάει στραβά. Η τοποθέτηση του μπροστά από το όνομα της συνάρτησης μάς δίνει τη δυνατότητα να αποκρύψουμε το εξ'ορισμού μήνυμα και να εμφανίσουμε το δικό μας μήνυμα λάθους, που θα είναι πιο φιλικό. Ενναλακτικά:error_reporting(0); στην αρχή του PHP script σας.

6 Δημιουργία MySQL Σύνδεσης με την PHP (3)
Το ! είναι ο τελεστής άρνησης (negation operator) της PHP, ο οποίος στην ουσία μετατρέπει μια τιμή false σε true και μια τιμή true σε false. Έτσι, αν η σύνδεση αποτύχει και η συνάρτηση mysqli_connect() επιστρέψει false, η μεταβλητή !$link θα γίνει ίση με true και θα εκτελεσθούν οι εντολές που βρίσκονται μέσα στο σώμα της εντολής if. Αντίθετα, αν γίνει η σύνδεση, ο connection identifier που είναι αποθηκευμένος στη μεταβλητή $link θα γίνει ίσος με true, καθώς κάθε αριθμός που είναι διαφορετικός από το 0 θεωρείται ότι είναι true στην PHP, και έτσι η !$link θα αποτιμηθεί σε false και δεν εκτελεσθούν οι εντολές που βρίσκονται μέσα στο σώμα της συνάρτησης if. H συνάρτηση exit(), η οποία δεν δέχεται παραμέτρους και αναγκάζει την PHP να σταματήσει να διαβάζει τη σελίδα σ’ αυτό το σημείο. Εναλλακτικά υπάρχει και η συνάρτηση die: $link=mysqli_connect($HOSTER,$XRHSTHS,$KODIX, [$DB]) or die ("Could not connect"); Σε περίπτωση που θέλουμε να επιλέξουμε Β.Δ. ξεχωριστά από τη σύνδεση στον εξυπηρετητή της Β.Δ. εκτελούμε: mysqli_select_db($link,$BASH) or die ("Could not select database"); H συνάρτηση mysqli_select_db επιστρέφει true εάν επιτύχει και false εάν αποτύχει.

7 Εναλλακτικός τρόπος Σύνδεσης – Εμφάνισης του σφάλματος σύνδεσης
$con=mysqli_connect("localhost","my_user","my_password","my_db"); // Check connection if (mysqli_connect_errno()) { die "Failed to connect to MySQL: " . mysqli_connect_error(); } // ...some PHP code for database "my_db"... // Change database to "test" mysqli_select_db($con,"test"); H συνάρτηση mysqli_errno($link) επιστρέφει τον κωδικό σφάλματος (αριθμό) της mysqli_connect (mysql_connect_errno(void)) και γενικότερα οποιασδήποτε mysqli εντολής!! Εάν δεν υπάρχει σφάλμα ο αριθμός επιστροφής είναι μηδέν! Η συνάρτηση mysqli_error($link) επιστρέφει το μήνυμα (string) σφάλματος οποιασδήποτε εντολής

8 Αντικειμενοστρεφής τρόπος Σύνδεσης
mysqli_report(MYSQLI_REPORT_STRICT); try { $mysqli = new mysqli("localhost", “user", "pass", "db"); if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } } catch (Exception $e ) { echo "Service unavailable"; echo "<br>message: " . $e->getMessage(); // not in live code obviously... exit;

9 Επιλογή Β.Δ. Συναρτησιακός τρόπος
Το επόμενο βήμα αφότου έχουμε καθιερώσει μια σύνδεση είναι να επιλέξουμε τη βάση δεδομένων με την οποία θέλουμε να δουλέψουμε. Προς τον σκοπό αυτό χρησιμοποιούμε μια άλλη συνάρτηση, ως εξής : mysqli_select_db($link, “database”); Χρησιμοποιούμε τη μεταβλητή $link που περιέχει το αναγνωριστικό σύνδεσης της βάσης δεδομένων (database connection identifier) για να ενημερώσουμε τη συνάρτηση ποια σύνδεση βάσης δεδομένων να χρησιμοποιήσει. Αυτή η συνάρτηση επιστρέφει true όταν είναι επιτυχής και false αν συμβεί κάποιο λάθος. Και πάλι, είναι σωστή τακτική η χρήση μιας εντολής if για τον χειρισμό των λαθών : if "mydb") ) { echo( "<P>Αδύνατος ο εντοπισμός της " ."database mydb</P>" ); exit(); }

10 Επιλογή Β.Δ. Αντικειμενοστρεφής τρόπος
if "mydb") ) { echo( $mysqli->errno.":<P>Αδύνατος ο εντοπισμός της " ."database mydb</P>".$mysqli->error ); exit(); } Tα error και errno είναι PROPERTIES !!!!

11 Εκτέλεση SQL Ερωτημάτων (Queries) (1)
Στα προηγούμενα, είδαμε πώς μπορούμε να συνδεθούμε σ’ έναν database server της MySQL-MariaDB με το πρόγραμμα mysql για να μπορέσουμε να γράψουμε ερωτήματα (queries) ή εντολές (commands) της SQL και να δούμε αμέσως τα αποτελέσματα των ερωτημάτων. Στην PHP υπάρχει ένας παρόμοιος μηχανισμός, η συνάρτηση mysqli_query(). mysqli_query($link, <query>); Όπου το <query> είναι ένα string που περιέχει τις εντολές της SQL που θα εκτελεσθούν. Όπως και με τη συνάρτηση mysqli_select_db(), η παράμετρος connection identifier (αναγνωριστικό σύνδεσης) $link είναι υποχρεωτική. Η τιμή επιστροφής αυτής της συνάρτησης εξαρτάται από το είδος του ερωτήματος που στέλνεται. Σε περίπτωση επιτυχίας Έαν είναι INSERT/CREATE/DELETE/UPDATE/.. επιστρέφει 0 ή 1 ενώ εάν είναι SELECT επιστρέφει το αποτέλεσμα σε μορφή resource πίνακα. Για τις περισσότερες εντολές της SQL, η συνάρτηση mysqli_query() επιστρέφει true(1) ή false(0) για να δείξει την επιτυχία ή την αποτυχία της αντίστοιχα.

12 Εκτέλεση SQL Ερωτημάτων (Queries) (2)
Το επόμενο παράδειγμα προσπαθεί να δημιουργήσει ένα πίνακα που περιέχει παραγματικές τιμές κόστους (τριψήφιους με δύο δεκαδικά ψηφία ακρίβεια) : <?php // Check connection if (mysqli_connect_errno($link)) { echo 'Failed to connect to MySQL:'.mysqli_connect_error($link); } $query = "CREATE TABLE TBL_cost ( " . "ID INT NOT NULL AUTO_INCREMENT, " . "mcost FLOAT(5,2), " . "PRIMARY KEY(ID)". ")"; if ) { echo("<P> Ο πίνακας δημιουργήθηκε επιτυχώς </P>"); } else { echo("<P> Λάθος στη δημιουργία του πίνακα: " . mysqli_error($link) . "</P>"); mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?>

13 Εκτέλεση SQL Ερωτημάτων (Multi - Queries)
Σε κάθε mysqli_query εκτελείται ένα και μόνο ένα SQL ερώτημα. Εάν επιθυμώ να εκτελέσω περισσότερα από ένα queries τότε κάνω mysqli_multi_query και διαχωρίζω τα SQL queries με ερωτηματικό <?php $query = "DROP TABLE IF EXISTS `TBL_cost`;". "CREATE TABLE TBL_cost ( " . "ID INT NOT NULL AUTO_INCREMENT, " . "mcost FLOAT(5,2), " . "PRIMARY KEY(ID)". ")"; if ) { echo("<P> Ο πίνακας δημιουργήθηκε επιτυχώς </P>"); } else { echo("<P> Λάθος στη δημιουργία του πίνακα: " . mysqli_error($link) . "</P>"); } mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?>

14 Εκτέλεση SQL Ερωτημάτων – Αντικεμενοστρεφής Γραφή (1 από 2)
<?php mysqli_report(MYSQLI_REPORT_STRICT); try { $link = new mysqli("localhost", “skontog", "pass", "skontog"); if ($link->connect_errno) { printf("Connect failed: %s\n", $link->connect_error); exit(); } if (! $link->select_db("skontog") ) { echo( $link->errno.":<P>Αδύνατος ο εντοπισμός της " ."database skontog</P>".$link->error ); Σύνδεση στον εξυπηρετητή και επιλογή Β.Δ.!

15 Εκτέλεση SQL Ερωτημάτων – Αντικεμενοστρεφής Γραφή (2)
$query = "DROP TABLE IF EXISTS `TBL_cost`;". "CREATE TABLE TBL_cost ( " . "ID INT NOT NULL AUTO_INCREMENT, " . "mcost FLOAT(5,2), " . "PRIMARY KEY(ID)". ")"; if ( $link->multi_query($query) ) { echo("<P> Ο πίνακας δημιουργήθηκε επιτυχώς </P>"); } else { echo("<P> Λάθος στη δημιουργία του πίνακα: " . $link->error . "</P>"); } $link->close(); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. } catch (Exception $e ) { echo "Service unavailable"; echo "<br>message: " . $e->getMessage(); // not in live code obviously... exit; ?>

16 Προστασία username-password της Β.Δ.
Για να προστατεύσουμε τα username και password και να μην τα αναγράφουμε σε plaintext μορφή σε κάθε σελίδα του κώδικά μας που θέλουμε να συνδεθούμε στη Β.Δ., εφαρμόζουμε την εξής τεχνική: 1. Δημιουργουμε ένα αρχείο με όνομα config.inc. Στο αρχείο αυτό τοποθετούμε όλες τις global μεταβλητές που χρησιμοποιούν τα php αρχεία μας όπως η Β.Δ και τα username-passwd σύνδεσης στον εξυπηρετητή της Β.Δ.: <?php $HOSTER="localhost"; $BASH="ma10203"; $XRHSTHS="ma10203"; $KODIX="*******"; //Μπορούμε αντί μεταβλητών να χρησιμοποιήσουμε define define('HOSTER',”localhost'); ..... ?> 2. To εν λόγω αρχείο το κάνουμε include_once('config.inc') ή require_once('config.inc') σε κάθε PHP αρχείο που συνδέεται στον εξυπηρετητή της B.Δ. 3. Χρησιμοποιούμε τις μεταβλητές του config.inc. Υπόψην τα αρχεία με επέκταση .inc δεν μπορούν να κατέβουν με HTTP GET (Ρύθμιση στον εξυπηρετητή)

17 Εισαγωγή Δεδομένων στη Βάση Δεδομένων (1)
Για να μπορέσει να γίνει εισαγωγή δεδομένων σε ένα πίνακα στη Β.Δ είναι είναι απαραίτητη η χρήση μιας φόρμας (form), με όνομα input.php ως εξής : <!doctype html> <html><head></head><body> <FORM ACTION="<?php=$_SERVER['PHP_SELF']; ?>" METHOD=POST> <P> Εισαγωγή τριψήφιων πραγματικών τιμών : <INPUT TYPE=”text” NAME="cost"> <BR> <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"> </FORM> </body></html> Όταν υποβληθεί αυτή η φόρμα, θα φορτώσει την ίδια ακριβώς σελίδα, λόγω της χρήσης της μεταβλητής $_SERVER['PHP_SELF'] στην ιδιότητα ACTION της φόρμας, αλλά με δύο μεταβλητές συνδεδεμένες με την αίτηση (request). Mε αυτό τον τρόπο μπορούμε στην ίδια σελίδα εφόσον έχουμε τιμή για την μεταβλητή $_POST['cost'] να εισάγουμε τιμές στη βάση και να εμφανίζουμε τη φόρμα. Εάν δε δεν έχω $_POST['cost'] εμφανίζω μόνο τη φόρμα.

18 Εισαγωγή Δεδομένων στη Βάση Δεδομένων (2)
<!doctype html> <!– Αρχείο input.php--> <html><head></head><body> <FORM ACTION="<?=$_SERVER['PHP_SELF']?>" METHOD=POST> <P> Εισαγωγή τριψήφιων πραγματικών τιμών : <INPUT TYPE="text" NAME="cost"> <BR> <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"> </FORM> </body></html> <?php include_once('func.php'); if (isset($_POST['cost']) && !empty($_POST['cost'])) { // Έλενξε εάν είναι float if (is_float(floatval($_POST['cost']))) { //Κλήση συνάρτησης εισαγωγής τιμών στη Β.Δ. insert_cost(floatval($_POST['cost'])); } else { echo "Δεν είναι πραγματικός<br />"; } ?>To αρχείο func.php περιέχει τη συνάρτηση insert_cost.!!

19 Εισαγωγή Δεδομένων στη Βάση Δεδομένων (3)
<?php //Αρχείο func.php include_once('config.inc'); //Αρχείο κωδικών function insert_cost(float $cost) { // Check connection if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query = "INSERT INTO TBL_cost values(' ', '$cost')"; if ) { echo "<P> H τιμή εισήχθει επιτυχώς </P>"; } else { echo "<P> Λάθος στη εισαγωγή τιμής: " . mysqli_error($link) . "</P>"; mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. }?> Όταν έχω μονά αυτάκια μέσα σε διπλά εισαγωγικά τα αυτάκια εμφανίζονται κανονικά (χωρίς backslash). Οι ακέραιοι, πραγματικοί εισάγονται με ή χωρίς μονά αυτάκια

20 INSERT/DELETE/UPDATE
Για τα ερωτήματα DELETE, INSERT και UPDATE, με τα οποία μπορούμε να τροποποιήσουμε τα αποθηκευμένα δεδομένα, η MySQL κατάγράφει επίσης τον αριθμό των γραμμών του πίνακα (καταχωρήσεων) που επηρεάστηκαν από το ερώτημα (query). Η επόμενη εντολή της SQL αλλάζει τις τιμές κόστους όπου είναι μικρότερες του 50 $query = "UPDATE TBL_cost SET cost=100 WHERE cost <50"; Όταν εκτελεσθεί αυτό το ερώτημα, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση mysqli_affected_rows($link) για να δούμε τον αριθμό των γραμμών (rows) που επηρεάστηκαν απ’ αυτήν την ενημέρωση (update) : if ( mysqli_query($link,$query) ) { echo("<P> Η ενημέρωση (update) επηρέασε " . mysqli_affected_rows($link) . " γραμμές (rows).</P>"); } else { echo("<P> Λάθος κατά την ενημέρωση (update) : " . mysqli_error() . "</P>"); }

21 Χειρισμός Αποτελεσμάτων - Εντολή SELECT (1)
Για τα περισσότερα ερωτήματα της SQL, η συνάρτηση mysqli_query() επιστρέφει είτε true για επιτυχία ή false για αποτυχία. Για τα ερωτήματα SELECT αυτό δεν είναι αρκετό. Και αυτό γιατί εκτός από την ένδειξη αν το ερώτημα πέτυχε ή απέτυχε, η PHP πρέπει επίσης να λάβει υπόψη και τα αποτελέσματα του ερωτήματος. Έτσι, όταν επεξεργαζόμαστε ένα ερώτημα SELECT, η συνάρτηση mysqli_query() επιστρέφει έναν αριθμό που δείχνει ένα σύνολο αποτελεσμάτων (result set), που περιέχει μια λίστα όλων των γραμμών (rows) ή καταχωρήσεων (entries) που επιστρέφονται από το ερώτημα. Αυτό είναι ένα ειδικό resource το $result: $result = mysqli_query($link, "SELECT * FROM TBL_cost"); if (!$result) { echo("<P> Λάθος στην εκτέλεση του ερωτήματος (query) : " . mysqli_error() . "</P>"); exit(); } Αν δεν συμβεί κάποιο λάθος στην επεξεργασία του ερωτήματος, ο παραπάνω κώδικας θα τοποθετήσει στη μεταβλητή $result ένα σύνολο αποτελεσμάτων (result set) που θα περιέχει το κείμενο-πίνακα όλων των εγγραφών που είναι αποθηκευμένα στον πίνακα TBL_cost.

22 Χειρισμός Αποτελεσμάτων - Εντολή SELECT (2)
Για να επεξεργαστούμε τις γραμμές (rows) του συνόλου αυτού μία κάθε φορά, μπορούμε να χρησιμοποιήσουμε τον βρόχο while, ως εξής : while ( $row = mysqli_fetch_array($result)) ) { // επεξεργασία της γραμμής (row) } Θα μελετήσουμε την παρακάτω εντολή που περιέχει η συνθήκη : $row_array = mysql_fetch_array($result,[MYSQLI_ASSOC|MYSQLI_NUM)); Η συνάρτηση mysql_fetch_array() δέχεται ένα σύνολο αποτελεσμάτων (result set) σαν παράμετρο, που είναι αποθηκευμένο στη μεταβλητή $result στη συγκεκριμένη περίπτωση, και επιστρέφει την επόμενη γραμμή του result set σαν έναν πίνακα (array). Όταν δεν υπάρχουν άλλες γραμμές στο result set, η συνάρτηση mysql_fetch_array() επιστρέφει την τιμή false. Η παραπάνω εντολή εκχωρεί μια τιμή στη μεταβλητή $row, αλλά ταυτόχρονα η ίδια η εντολή αποκτά την ίδια τιμή. Αυτός είναι ο λόγος που μπορούμε να χρησιμοποιήσουμε την εντολή για τη συνθήκη του βρόχου while.

23 Χειρισμός Αποτελεσμάτων - Εντολή SELECT (3)
$row_array = mysql_fetch_array($result,[MYSQLI_ASSOC|MYSQLI_NUM)); Η mysql_fetch_array μπορεί να μας επιστρέψει τα αποτελέσματα σε μοφρή πίνακας σε μορφή λίστας ή και τα δύο μαζί (MYSQLI_BOTH). Εξ' ορισμού επιστρέφει και τα δύο αλλά εάν επιθυμούμε μπορούμε να διαλέξουμε τη μορφή πίνακα. Η μορφή πίνακα έχει αντίστοιχη εντολή τη $row_array=mysqli_fetch_row($result) Ομοίως σε μορφή λίστας υπάρχει η mysqli_fetch_assoc($result) που επιστρέφει τα αποτελέσματα ώς συσχετιζόμενο πίνακα Οι παραπάνω συναρτήσεις επιστρέφουν μόνο μία εγγραφή σε κάθε κλήση τους. Εάν το αποτέλεσμα περιέχει παραπάνω από μία εγγραφές και θέλω να τις εμφανίσω όλες τότε θα το κλείσω μέσα σε while. Εάν θέλω ορισμένες μέσα σε for. NUM: for ($i=0;$i<count($row);$i++) { echo $row[$i].”<br>”;} ASSOC: foreach ( $row as $val) { echo $val.”<br>”;}

24 SELECT συναρτησιακό στύλ
<?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3"; $result = mysqli_query($link, $query); /* numeric array */ $row = mysqli_fetch_array($result, MYSQLI_NUM); printf ("%s (%s)\n", $row[0], $row[1]); /* associative array */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]); /* associative and numeric array */ $row = mysqli_fetch_array($result, MYSQLI_BOTH); printf ("%s (%s)\n", $row[0], $row["CountryCode"]); /* free result set */ mysqli_free_result($result); /* close connection */ mysqli_close($link);?>

25 SELECT Αντικειμενοστρεφές στύλ
<?php $linki = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if ($linki->connect_errno) { printf("Connect failed: %s\n", $link->connect_error); exit(); } $query = "SELECT Name, CountryCode FROM TBL_City ORDER by ID LIMIT 3"; $result = $link->query($query); /* numeric array */ $row = $result->fetch_array(MYSQLI_NUM); printf ("%s (%s)\n", $row[0], $row[1]); /* associative array */ $row = $result->fetch_array(MYSQLI_ASSOC); printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]); /* associative and numeric array */ $row = $result->fetch_array(MYSQLI_BOTH); printf ("%s (%s)\n", $row[0], $row["CountryCode"]); /* free result set */ $result->free(); /* close connection */ $mysqli->close();?>

26 H Επιλογή DELETE Για την υλοποίηση της διαγραφής εγγραφών χρησιμοποιούνται συνήθως σύνδεσμοί (Μή χρήση JavaScript) και η HTTP μέθοδος GET: Η επιλογή της διαγραφής συνδιάζεται με την εμφάνιση των τιμών ενός πίνακα (BROWSE) ώς σύνδεσμος στο αριστερό άκρο μίας εγγραφής με το όνομα συνδέσμου Delete και χρήση της μεθόδου GET. H δημιουργία του κάθε συνδέσμου γίνεται δυναμικά κατά την εμφάνιση των εγγραφών (SQL select) με χρήση του πρωτεύοντος κλειδιού ID.

27 Παράδειγμα – 1: Πίνακα με εγγραφές - SELECT
Έστω ότι έχουμε ένα πίνακα με όντομα TBL_City και πεδία: 1. ID : autoincrement int not null -Πρωτεύων κλειδί 2. Name: Όνομα πόλης VARCHAR(80) NOT NULL 3. CountryCode: Κωδικός διψήφιος ή τριψήφιος χώρας CHAR(3) DEFAULT “NO” Σε αυτό το παράδειγμα θα δημιουργήσουμε τον πίνακα από την PHP και θα εισάγουμε τρείς εγγραφές σε αυτόν. Στην περίπτωση αυτή δεν έχουμε μία γραμμή με πολλά queries αλλά ριπή από queries.

28 Ριπές από Queries (1) To mysqli API χειρίζεται μόνο ένα query ανά σύνδεση. Για πολλαπλά queries (ριπές) απαιτείται σύνδεση και επανασύνδεση ή ειδικός χειρισμός: Βήμα 1: Εκτέλεση Query Βήμα 2: Επαναληπτική διαδικασία μέχει το νέο query με χρήση της συνάρτησης mysqli_next_result($link) do { Βήμα 3: Μέσα στην επαναληψη απορόφηση του αποτελέσματος του query: if ($result = mysqli_store_result($link)) { mysqli_free_result($result); } while (mysqli_next_result($link)); Ριπές από queries χειρίζονται από νέους μηχανισμούς που δεν απαιτούν ειδικούς χειρισμούς

29 Ριπές από Queries (2) Ριπές από queries χειρίζονται από νέους μηχανισμούς που δεν απαιτούν ειδικούς χειρισμούς O νέος μηχανισμός αναφέρεται σε ρήσεις (statements) τα οποία δεν εκτελούνται αμέσως στη Β.Δ. αλλά προετοιμάζονται Η εκτέλεση των ρήσεων αυτών γίνεται μετά την προετοιμασία όλων των ρήσεων (prepared statements) To σύνολο των prepared statements αποτελούν ένα DB transanction Τα prepared statements μας προστατεύουν σημαντικά από SQL injections αφού ορίζουν ακριβώς και προελέγχουν τα δεδομένα (πρίν εκτελεστούν-execute) Τα transactions έχουν την δυνατότητα rollback

30 Δημιουργία TBL_City και εγγραφών ριπή (1 από 3)
<?php if (mysqli_connect_errno($link)) { echo 'Failed to connect to MySQL:'.mysqli_connect_error($link); } $query = "DROP TABLE IF EXISTS `TBL_City`;". "CREATE TABLE TBL_City ( " . "ID INT NOT NULL AUTO_INCREMENT, " . "Name VARCHAR(80) NOT NULL, " . "CountryCode CHAR(3) NOT NULL DEFAULT 'NO', " . "PRIMARY KEY(ID)". ")"; if ) { echo("<P> Ο πίνακας δημιουργήθηκε επιτυχώς </P>");}

31 Δημιουργία TBL_City και εγγραφών ριπή (2 από 3)
do { /* Εάν υπήρξε αποτέλεσμα από το query */ if ($result = mysqli_store_result($link)) { mysqli_free_result($result); //Ελευθέρωσε το αποτέλεσμα του result } } while (mysqli_next_result($link)); } else { echo("<P> Λάθος στη δημιουργία του πίνακα: " .mysqli_error($link) . "</P>");} Συνεχίζεται…….

32 Δημιουργία TBL_City εγγραφών κατά ριπάς (3 από 3)
$fill_array=array ( "0"=>array("ID"=>" ","Name"=>"Athens", "CityCode"=>"GR"), "1"=>array("ID"=>" ","Name"=>"Ioannina", "CityCode"=>"GR"), "2"=>array("ID"=>" ","Name"=>"Tirana", "CityCode"=>"AL") ); foreach ($fill_array as $key=>$mrow) { $query = "INSERT INTO TBL_City values('$mrow[ID]','$mrow[Name]','$mrow[CityCode]')"; if { do{ if ($result=mysqli_store_result($link)) { mysqli_free_result($result); } } while (mysqli_next_result($link)); } else { echo("<P> Λάθος στη εγγραφή: " . mysqli_error($link) . "</P>"); ?>

33 Εμφάνιση εγγραφών TBL_City (1 από 3)
<!doctype html> <html><head></head><body> <h1> Εμφάνιση Τιμών</h1> <table><thead><tr><th>ID</th><th>City</th>Code<th></th></tr></thead><tbody> <?php include_once('config.inc'); // Check connection if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query = "SELECT * FROM TBL_City"; $result = mysqli_query($link,$query) or die(mysqli_error()); while ($row=mysqli_fetch_array($result)) { print "<tr>"; print "<td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>"; mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?></tbody></body></html>

34 Εμφάνιση εγγραφών TBL_City (2 από 3)
<?php include_once('config.inc'); ?> <html><head></head><body><h1> Εμφάνιση_Τιμών</h1><table> <thead><tr><th>ID</th><th>City</th><th>Code</th></tr></thead> <tbody> if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); }

35 Εμφάνιση εγγραφών TBL_City (3 από 3)
$query = "SELECT * FROM TBL_City"; $result = mysqli_query($link,$query) or die(mysqli_error()); while ($row=mysqli_fetch_array($result,MYSQLI_ASSOC )) { print "<tr>"; foreach ($row as $value) print "<td>$value</td>"; print "</tr>"; } mysqli_free_result($result); mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?></tbody></body></html>

36 Εμφάνιση εγγραφών TBL_City με delete
ΑΡΧΕΙΟ browse.php while ($row=mysqli_fetch_array($result,MYSQLI_ASSOC )) { print "<tr>"; foreach ($row as $value) print "<td>$value</td>"; print "<td><a href=\"delete.php?id=$row[ID]>Delete</a>\"</tr>"; } mysqli_free_result($result); Η εμφάνιση εγγραφών με delete γίνεται με τροποποίηση του προηγούμενου αρχείου εμφάνισης τιμών browse.php με τον παρακάτω κώδικα και προσθήκη ενός νέου αρχείου με όνομα delete.php

37 Υλοποίηση του delete.php
<?php include_once('config.inc'); if (isset($_GET['id'])) { // Check connection if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query = "DELETE FROM TBL_City where ID=$_GET[id]"; if ) { header( "Refresh:5; url=browse_delete.php"); echo "H τιμή διαγράφει επιτυχώς !"; } else { echo "<P> Λάθος διαγραφής τιμής: " . mysqli_error($link) . "</P>"; echo ”<a href=”browse_delete.php”>GO BACK</a>”; mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. \ ?> Χρήση: <a href=”browse.php”>GO BACK</a> ή ενναλακτικα το : header('location:browse.php?deleted=$_GET[id]');

38 Αναζήτηση εγγραφών TBL_City 1 από 3
ΑΡΧΕΙΟ search.php <!doctype html> <html><head></head><body> <FORM ACTION="<?=$_SERVER['PHP_SELF']?>" METHOD=POST> <P> Αναζήτηση TBL_city: <INPUT TYPE="text" NAME="search"> <BR> <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"> </FORM> </body></html> <?php include_once('func.php'); if (isset($_POST['search']) && !empty($_POST['search'])) { // Check connection if (mysqli_connect_errno($link)) echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); }

39 Αναζήτηση εγγραφών TBL_City 2 από 3
$query = "select * from TBL_City where Name like '".$_POST['search']."%'"; $result=NULL; if ( $result=mysqli_query($link,$query) ) { echo "<P> Βρέθηκαν επιτυχώς:".mysqli_affected_rows($link)." </P>"; echo "<table><thead><tr><th>ID</th><th>City</th><th>Code</th></tr></thead><tbody>"; /*Εδώ θα πρέπει να εμφανίζουμε όπως στο browse_delete.php όλες τις εγγραφές με δυνατότητα delete */ echo "</tbody></table>"; } else { echo "<P> Λάθος στη εισαγωγή τιμής: " . mysqli_error($link) . "</P>"; } mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?> Select * from TBL_City where Name like 'Ath%'; H mysqli_affected_rows εμφανίζει την 1 εγγραφή (Εάν δύο θα εμφανίσει δύο εγγραφές). Με τον τρόπο αυτό γλυτώνω ένα query ακόμα για το πλήθος των εγγραφών (select count(*) from TBL_City where Name like 'Ath%')

40 Αναζήτηση εγγραφών TBL_City 3 από 3
/*Εδώ θα πρέπει να εμφανίζουμε όπως στο browse_delete.php όλες τις εγγραφές με δυνατότητα delete */ if ( $result=mysqli_query($link,$query) ) { echo "<P> Βρέθηκαν επιτυχώς:".mysqli_affected_rows($link)." </P>"; while ($row=mysqli_fetch_array($result,MYSQLI_ASSOC )) { print "<tr>"; foreach ($row as $value) print "<td>$value</td>"; print "<td><a href=\"delete.php?id=$row[ID]\">Delete</a></tr>"; }

41 SQL Injection O κώδικας αναζήτησης είναι ευάλωτος σε SQL injections.!!. SQL injection είναι η δυνατότητα του χρήστη που κατα-λάθος αφήνει ο προγραμματιστής να εκτελεί σε ένα SQL query περισσότερα από ένα Queries. Συνήθως τα επιπλέον queries δημιουργούν πρόβλημα ή στη βάση ή αποκαλύπτουν πληφορία κρυφή ή παρακάμπτουν SQL ελέγχους ασφαλείας (username, password) Παράδειγμα: Δώστε την εντολή αναζήτησης: Ath' or '1=1 Θα σας δείξει όλες τις εγγραφές του πίνακα Αντιμετώπιση: 1. Prepared Statements 2. $search_value = mysqli_real_escape_string($link, $_POST['search']); H συνάρτηση αυτή προσθέτει \ σε κάθε “ 'η ' στον κώδικά σας. $search_value=mysqli_real_escape_string($link,$_POST['search']); echo $search_value; $query = "select * from TBL_City where Name like '".$search_value."%'";

42 Ανανέωση Εγγραφών TBL_City 1 από 4
Η δυνατότητα ανανέωσης εγγραφών τοποθετείται δίπλα από την δυνατότητα delete σε κάθε εγγραφή στην περιήγηση και στην αναζήτηση όπως ακριβώς τοποθετούνται και οι delete σύνδεσμοι: <a href=”update.php?id=3”>Update</a> Χρησιμοποιεί δέ διαφορετική φόρμα και μέθοδο GET (update.php) που περιλαμβάνει όλες τις τιμές-πεδία του πίνακα που μπορούν να αλαχτούν (στην συγκεκριμένη περίπωση τα Name και CountryCode) όπου εν συνεχεία ο χρήστης τα τροποποιεί την ίδια σελίδα και τη μέθοδο POST για να αποστείλλει τις αλλαγές στη Βάση και να εμφανίσει (χρήση header την σελίδα αναζήτησης ή εμφάνισης αντίστοιχα). while ($row=mysqli_fetch_array($result,MYSQLI_ASSOC )) { print "<tr>"; foreach ($row as $value) print "<td>$value</td>"; print "<td><a href=\"delete.php?id=$row[ID]\">Delete</a>"; print " <a href=\"update.php?id=$row[ID]\">Update</a></td>"; }

43 Ανανέωση Εγγραφών TBL_City 2 από 4
UPDATE.php <?php include_once('config.inc'); if (isset($_GET['id'])) { // Φόρμα Αλλαγής στοιχείων if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query = "select Name,CountryCode FROM TBL_City where ID=$_GET[id]"; $result=NULL; if ( $result=mysqli_query($link,$query) ) { $row=mysqli_fetch_array($result,MYSQLI_ASSOC ); ?> <html><head></head><body> <FORM ACTION="<?=$_SERVER['PHP_SELF']?>" METHOD=POST>

44 Ανανέωση Εγγραφών TBL_City 3 από 4
UPDATE.php συνέχ <h1> Aνανέωση Εγγραφής <?=$_GET['id']?> TBL_city: </h1> <INPUT TYPE="text" NAME="name" value="<?=$row['Name']?>"> <BR> <INPUT TYPE="text" NAME="cc" value="<?=$row['CountryCode']?>"> <INPUT TYPE="hidden" NAME="id" value="<?=$_GET['id']?>"> <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"> </FORM> </body></html> <?php mysqli_free_result($result); } else { echo "<P> Λάθος Εύρεση Εγγραφής: " . mysqli_error($link) . "</P>"; } mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. \

45 Ανανέωση Εγγραφών TBL_City 4 από 4
UPDATE.php συνέχ if (isset($_POST['id'])) { //Απόδοση στοιχείων στη βάση // Check connection if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query="UPDATE TBL_City set Name='$_POST[name]', CountryCode='$_POST[cc]' where ID='$_POST[id]'"; if ) { header( "Refresh:5; url=search.php"); echo "<P> H τιμή $_POST[id] ανανεώθηκε επιτυχώς </P>"; } else { echo "<P> Λάθος στη ανανέωση τιμής: " . mysqli_error($link) . "</P>"; mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?>

46 Browse Pagination (1) Σε περίπτωση που οι εγγραφές είναι πάρα πολλές είναι απαραίτητη η χρήση paginator. O paginator έχει στύλ το οποίο θα μπορούσε να είναι: <style> ul.pagination { display: inline-block; padding: 0; margin: 0; } ul.pagination li {display: inline;} ul.pagination li a { color: black; float: left; padding: 8px 16px; text-decoration: none; ul.pagination li a.active { background-color: #4CAF50; color: white; ul.pagination li a:hover:not(.active) {background-color: #ddd;} </style>

47 Browse Pagination (2) Δημιουργούμε με αυτό τον τρόπο ένα browse με pagination capabilities και με χρήση της SQL δυνατότητας LIMIT για εμφάνιση περιορισμένων εγγραφών: SELECT * FROM Orders LIMIT 15, 10 Επέστρεψε μόνο 10 εγγραφές (LIMIT 10) ξεκινώντας από τη 16η εγγραφή (OFFSET 15) To browse_paginate.php χρησιμοποιεί την μέθοδο GET δύνοντας limit και offset καλώντας τον εαυτό του ώστε να εμφανίζει τις εγγραφές ανά σελίδα ΣΗΜΑΝΤΙΚΟ: ΑΠΟ ΟΛΑ ΤΑ QUERIES το SELECT QUERY ΔΕΝ απαιτεί ανάγνωση του αποτελέσματος (mysqli_store_result) και ελευθέρωση αυτού mysqli_free_result. Ούτε ειδικο χειρισμό. Οι SELECT ριπές είναι άνευ ειδικού χειρισμού!!!!

48 Browse Pagination TBL_City 1 από 3
<?php include_once('config.inc'); ?> <html><head> <link rel="stylesheet" type="text/css" href="style.css"> </head><body> <h1> Εμφάνιση Τιμών</h1> <table><thead><tr><th>ID</th><th>City</th><th>Code</th></tr></thead> <tbody> $limit=2; //Όριο Εγγραφών if (isset($_GET['offset'])) $off=$_GET['offset']; else $off=0; // Check connection if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); }

49 Browse Pagination TBL_City 2 από 3
/*Μετρηση πλήθους Εγγραφών πίνακα*/ $query = "SELECT * FROM TBL_City"; $result = mysqli_query($link,$query) or die(mysqli_error()); $count=mysqli_num_rows($result); /*Δημιουργία paginator*/ $page_number=ceil($count/$limit); if ($count>$page_number*$limit) $page_number++; echo "<ul class=\"pagination\">"; echo "<li> <a href=\"#\"> | </a></li>"; for ($i=0;$i<$page_number;$i++) { $mf=$i*$limit; $num=$i+1; if ($off>=$i*$limit && $off<($i+1)*$limit) echo "<li><a href=\"browse_page.php?offset=$mf\" class=\"active\">[$num]</a></li>"; else echo "<li><a href=\"browse_page.php?offset=$mf\">[$num]</a></li>"; } echo "<li> <a href=\"#\"> | </a></li>";echo "</ul>";

50 Browse Pagination TBL_City 3 από 3
$query = "SELECT * FROM TBL_City limit $off, $limit"; $result = mysqli_query($link,$query) or die(mysqli_error()); while ($row=mysqli_fetch_array($result,MYSQLI_ASSOC )) { print "<tr>"; foreach ($row as $value) print "<td>$value</td>"; print "<td><a href=\"delete.php?id=$row[ID]>Delete</a>\"</tr>"; } mysqli_free_result($result); mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?> </tbody> </body></html>

51 Prepared statements (1)
Τα προετοιμασμένα ερωτήματα λειτουργούν ώς εξής: 1. Προετοιμασία: Μία SQL εντολή εισαγωγής δημιουργείται και αποστέλεται στη Β.Δ. Οι τιμές (values) της εντολής μένουν απροσδιόριστες και καλούνται παράμετροι. Απεικονίζονται δέ με "?". Παράδειγμα: $query="insert into TBL_City values('',?,?); 2. Η Β.Δ. ελέγχει για την ορθότητα τη δήλωση και την αποθηκεύει για αργότερη εκτέλεση 3. Σε αργότερο χρόνο το PHP script συνδέει (bind) τα ερωτηματικά με τιμές (παραμέτρους) και εκτελεί τη δήλωση. Το PHP script μπορεί να εκτελέσει τη δήλωση όσες φορές επιθυμεί (ριπές) με διαφορετικές συνδεδεμένες (binded) τιμές. Οι binded τιμές δύναται να έχουν μορφή (format) : i - integer d - double s - string b – BLOB Η συνάρτηση που χρησιμοποιείται για προετοιμασία είναι η: $stmt=mysqli_prepare($link,$query); ή $stmt->prepare($query) Η συνάρτηση που χρησιμοποιείται για bind παραμέτρων είναι η: mysqli_stmt_bind_param($stmt,”format”, $param_1,….,$param_N) ή $stmt->bind_param(“format”, $param_1,…,$param_N

52 Prepared statements (2)
/* execute prepared statement */ mysqli_stmt_execute($stmt); Ελέγχονται οι εγγραφές που έχουν προστεθεί ή τροποποιηθεί echo "Row inserted:".mysqli_stmt_affected_rows($stmt); Και κλείνει το statement /* close statement and connection */ mysqli_stmt_close($stmt); Τα πλεονεκτήματα αυτής της διαδικασίας: 1. Τα προετοιμασμένα ερωτήματα μειώνουν τον χρόνο εκτέλεσης αφού ο έλεγχος ορθότητας για πολλαπλά queriew γίνεται μόνο μία φορά στην αρχή 2. Περιορίζεται η μεταφορά πληροφορίας μεταξύ πελάτη και εξυπηρετητή (αφού το ερώτημα αποστέλλεται μόνο μία φορά και εν συνεχεία αποστέλλονται μόνο οι binded τιμές) 3. Προσφέρει επιπρόσθετη ασφάλεια από λαθεσμένη είσοδο ή SQL injections

53 Eισαγωγή στον TBL_Cost με prepared statements 1 από 2
Δημιουργώ μία φόρμα εισαγωγής (form_insert.php) όπου ο χρήστης τοποθετεί τις τιμές εισόδου: H φόρμα με την χρήση του submit καλεί ένα script με όνομα insert.php χρησιμοποιώντας την μέθοδο POST και αφού εκτελέσει έλεγχο τιμών, προετoιμάζει την εισαγωγή και εν συνεχεία την εκτελεί: form_insert.php <html><head></head><body> <FORM ACTION=“insert.php" METHOD=POST> <h1> Εισαγωγή Εγγραφής στο TBL_city: </h1> <table> <tr> <td><label for="name">Όνομα Πόλης:</label></td> <td><INPUT TYPE="text" NAME="name" id="name" value=""></td> </tr><tr> <td><label for="name">Κωδικός Πόλης:</label></td> <td><INPUT TYPE="text" NAME="cc" id="cc" value=""></td> </tr><tr><td></td><td align='right'> <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"> </td></tr></table></FORM></body></html>

54 Eισαγωγή στον TBL_Cost με prepared statements 2 από 2
<?php include_once('config.inc'); if (isset($_POST['name']) && isset($_POST['cc'])) { // Φόρμα Αλλαγής στοιχείων if (mysqli_connect_errno($link)) { echo "Failed to connect to MySQL:".mysqli_connect_error($link); exit(); } $query="insert into TBL_City values('',?,?)"; $stmt=mysqli_prepare($link,$query); mysqli_stmt_bind_param($stmt,"ss",$_POST['name'],$_POST['cc']); mysqli_stmt_execute($stmt); echo "Row inserted:".mysqli_stmt_affected_rows($stmt); mysqli_stmt_close($stmt); mysqli_close($link); // Κλείσιμο της σύνδεσης με τον εξυπηρετητή. ?>

55 Έλεγχοι τιμών Int: is_int($value)
Float: is_float($value) ή preg_match(‘/^\d+\.\d+$/’,$value) Empty: empty($value) Int with 4 digits: preg_match(‘/^\d{1,3}$/’,$value) Float with two digits: preg_match(‘/^\d+\.\d{1,2}’,$value) Name: !preg_match("/^[a-zA-Z ]*$/",$name) Date YYYY-MM-DD: preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)


Κατέβασμα ppt "Βάσεις Δεδομένων Κωδικός Μαθήματος: MK741"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google