Εργαστήριο 7 Προγραμματιστικές Εφαρμογές στο Διαδίκτυο Στόχος Στόχος του εργαστηρίου είναι η εκμάθηση των βασικών προγραμματιστικών δομών της γλώσσας PHP και η δημιουργία φορμών για την επεξεργασία υποβαλλόμενων στοιχείων με έλεγχο εγκυρότητας. Προετοιμασία περιβάλλοντος εργασίας Ξεκινήστε τον Apache Server από το XAMPP. Θυμηθείτε ότι θα σώζετε όλα τα αρχεία των ασκήσεων στον φάκελο C:\xampp\htdocs. Και ότι θα εμφανίζετε τις σελίδες στον browser σας μέσω της διεύθυνσης http://localhost/<όνομα αρχείου>. Κα 1 Δρ.
Άσκηση 7a Δημιουργήστε το αρχείο page7a.php με το παρακάτω περιεχόμενο: a 2 +b $a = 12; $b = 25; $c = $a**2 + $b; <h1>βασικές δομές στην PHP : Μεταβλητές</h1> Σε αυτή την άσκηση θα γίνει επίδειξη των μεταβλητών (<i>variables</i>) στην <b>php</b>. Θα εμφανίσουμε τις μεταβλητές <b>$a</b>, <b>$b</b> και <b>$c</b> με 2 τρόπους. <ul> <li> με την εντολή <b>echo</b>: <br/> a = echo $a; <br/> b = echo $b; <br/> c = echo $c; <br/> </li> <li> με την <i>γρήγορη echo</i>: <br/> a = <?= $a <br/> b = <?= $b <br/> c = <?= $c <br/> </li> </ul> Σε αυτή τη σελίδα, αρχικά εκτελούμε κάποιες βασικές πράξεις μεταξύ των μεταβλητών $a και $b. Σημειώστε ότι η πράξη ** στην PHP σημαίνει ύψωση σε δύναμη, δηλαδή η πράξη $a**2 + $b σημαίνει a 2 +b. Στη συνέχεια τυπώνουμε με τη βοήθεια της εντολής echo τις μεταβλητές $a, $b και $c. Τέλος, δείχνουμε έναν πιο γρήγορο τρόπο για να τυπώνουμε μεταβλητές, τη δομή <?= $a. 2 Δρ.
Άσκηση 7b Δημιουργήστε το αρχείο page7b.php με το παρακάτω περιεχόμενο: function get_result($x){ $y = 2 * $x**2-5 * $x - 3; return $y; <h1>βασικές δομές στην PHP : Συναρτήσεις</h1> Σε αυτή την άσκηση θα γίνει επίδειξη των συναρτήσεων (<i>functions</i>) στην <b>php</b>. Θα υπολογίσουμε το αποτέλεσμα της παράστασης <b><i>y = 2x<sup>2</sup> - 5x - 3</i></b> για διάφορες τιμές του <b><i>x</i></b>. <table border="1" width="200"> <th>x</th> <th>y</th> <td align="right">-2</td> <td align="right"><?= get_result(-2) </td> <td align="right">0</td> <td align="right"><?= get_result(0) </td> <td align="right">2</td> <td align="right"><?= get_result(2) </td> <td align="right">4</td> <td align="right"><?= get_result(4) </td> Σε αυτή τη σελίδα ορίζουμε μία συνάρτηση get_result η οποία παίρνει σαν παράμετρο το $x και υπολογίζει την παράσταση y=2 x 2 5 x 3 και επιστρέφει ως αποτέλεσμα το $y. Στη συνέχεια καλούμε 4 φορές αυτή τη συνάρτηση, για τιμές -2, 0, 2 και 4 και εμφανίζουμε το αποτέλεσμα της συνάρτησης. Για παράδειγμα η εντολή <?= get_result(-2) καλεί την συνάρτηση get_result με x= 2 και τυπώνει το αποτέλεσμα. 3 Δρ.
Άσκηση 7b2 Τροποποιήστε κατάλληλα την σελίδα page7b.php ώστε η συνάρτηση να υπολογίζει την παράσταση y=5 x 3 4 x 2 +3 x 8 και τυπώστε το αποτέλεσμα για τιμές του x -3, -1, 0, 1 και 3. Άσκηση 7c Δημιουργήστε το αρχείο page7c.php με το παρακάτω περιεχόμενο: function get_result($x){ $y = 2 * $x**2-5 * $x - 3; return $y; $x_start = -10; $x_end = 15; $x_step = 0.5; <h1>βασικές δομές στην PHP : Βρόχοι 'for'</h1> Σε αυτή την άσκηση θα γίνει επίδειξη των βρόχων (<i>for loops</i>) στην <b>php</b>. Θα υπολογίσουμε το αποτέλεσμα της παράστασης <b><i>y = 2x<sup>2</sup> - 5x - 3</i></b> για διάφορες τιμές του <b><i>x</i></b> από <b><i><?= $x_start </i></b> έως <b><i><?= $x_end </i></b> με βήμα <b><i><?= $x_step </i></b>. <table border="1" width="200"> <th>x</th> <th>y</th> for ($x = $x_start; $x <= $x_end; $x += $x_step){ <td align="right"> <?= $x </td> <td align="right"> <?= get_result($x) </td> Σε αυτή τη σελίδα έχουμε πάλι την συνάρτηση get_result με παράμετρο $x, αλλά αντί να καλούμε 4 Δρ.
την συνάρτηση για όλες τις τιμές του x που μας ενδιαφέρουν μία-προς-μία, δημιουργούμε έναν βρόχο for-loop, ο οποίος καλεί την συνάρτηση για μία σειρά από τιμές του $x. Συγκεκριμένα, ξεκινάμε από την αρχική τιμή $x_start, και φτάνουμε μέχρι την τελική τιμή $x_end με βήμα $x_step. Αυτό ακριβώς κάνει η γραμμή εντολής: for ($x = $x_start; $x <= $x_end; $x += $x_step){ Μέσα στην παρένθεση υπάρχουν 3 τμήματα. Στο πρώτο τμήμα $x = $x_start δίνεται η αρχική τιμή. Στο δεύτερο τμήμα $x <= $x_end γίνεται ο έλεγχος έως πότε θα τρέχει το loop. Στο τρίτο τμήμα $x += $x_step γίνεται η αύξηση του $x κατά $x_step. Σημειώστε ότι το for-loop κλείνει 7 γραμμές πιο κάτω, εκεί που κλείνει το. Μέσα στο for-loop κλείνουμε την PHP και την ξανανοίγουμε στο τέλος για να παρεμβάλουμε κώδικα HTML που τυπώνει μία γραμμή... του πίνακα. Με αυτό τον τρόπο, όσες επαναλήψεις κάνει το for-loop, τόσες φορές θα τυπωθεί το τμήμα αυτό της HTML, δηλαδή τόσες γραμμές του πίνακα θα εμφανιστούν. Μέσα σε κάθε γραμμή τώρα, στα κατάλληλα σημεία, χρησιμοποιούμε τη δομή <?=... για να τυπώσουμε τις τιμές του $x και του αριθμητικού αποτελέσματος της συνάρτησης get_result($x). Άσκηση 7c2 Τροποποιήστε κατάλληλα την σελίδα page7c.php ώστε η συνάρτηση να υπολογίζει την παράσταση y=5 x 3 4 x 2 +3 x 8 και τυπώστε το αποτέλεσμα για τιμές του x από -30 έως +30 με βήμα 0.2. 5 Δρ.
Άσκηση 7d Δημιουργήστε το αρχείο page7d.html με το παρακάτω περιεχόμενο: <h1>υπολογισμός της δευτεροβάθμιας εξίσωσης</h1> Αυτή η σελίδα υπολογίζει την παράσταση <b><i>y = ax<sup>2</sup> + bx + c</i></b> για τιμές του <b><i>x</i></b> από -5 έως +15 με βήμα 0.5. <form action="page7d_compute.php" method="post"> <b>παράμετροι Εξίσωσης:</b> <table border="1"> <th width="80"> <i>a</i> </th> <td> <input type="text" name="a" value="2" /> </td> <th width="80"> <i>b</i> </th> <td> <input type="text" name="b" value="-5" /> </td> <th width="80"> <i>c</i> </th> <td> <input type="text" name="c" value="-3" /> </td> <input type="submit" value="υπολόγισε" /> </form> Σε αυτή τη σελίδα δίνουμε τη δυνατότητα στο χρήστη να εισάγει τις παραμέτρους a, b και c της δευτεροβάθμιας εξίσωσης ax 2 +bx+c ώστε να υπολογίσουμε το αποτέλεσμα για όποιες τιμές επιθυμεί ο χρήστης, και όχι μόνο για τις τιμές που έχουμε βάλει χειροκίνητα στο πρόγραμμά μας. Η σελίδα είναι απλή HTML, χωρίς κώδικα PHP, και απλώς παρουσιάζει μία φόρμα <form> στον χρήστη ώστε να εισάγει τις 3 παραμέτρους. Μόλις πατήσει στο πλήκτρο [Υπολόγισε] τα δεδομένα θα υποβληθούν στην σελίδα page7d_compute.php. 6 Δρ.
Δημιουργήστε τη σελίδα page7d_compute.php με το παρακάτω περιεχόμενο: $a = $_POST["a"]; $b = $_POST["b"]; $c = $_POST["c"]; $x_start = -10; $x_end = 15; $x_step = 0.5; function get_result($x){ global $a, $b, $c; $y = $a * $x**2 + $b * $x + $c; return $y; <h1>αποτέλεσμα υπολογισμού της δευτεροβάθμιας εξίσωσης</h1> <a href="page7d.html">επιστροφή</a> Παράμετροι χρήστη: <br /> a = <?=$a, b = <?=$b, c = <?=$c <table border="1" width="200"> <th>x</th> <th>y</th> for ($x = $x_start; $x <= $x_end; $x += $x_step){ <td align="right"> <?= $x </td> <td align="right"> <?= get_result($x) </td> Σε αυτή τη σελίδα αρχικά παίρνουμε από τη μεταβλητή-πίνακα $_POST τις τιμές a, b και c που υπέβαλε ο χρήστης. Στη συνέχεια ορίζουμε την αρχική και τελική τιμή του x όπως και το βήμα. Στη συνέχεια ορίζουμε με πιο γενικό τρόπο την συνάρτηση get_result ώστε να υπολογίζει την γενική παράσταση y=ax 2 +bx+c. Σημειώστε ότι για να έχει πρόσβαση η συνάρτηση get_result στις παραμέτρους $a, $b και $c, γράφουμε την ειδική εντολή global μέσα στην συνάρτηση 7 Δρ.
global $a, $b, $c; Με την εντολή λοιπόν global δίνουμε τη δυνατότητα μέσα σε μία συνάρτηση να έχουμε πρόσβαση σε μεταβλητές που δημιουργήθηκαν έξω από την συνάρτηση (global μεταβλητές). Τώρα είστε έτοιμοι να εκτελέσετε την σελίδα page7d.html. Εισάγετε τις δικές σας παραμέτρους a, b και c και πιέστε το πλήκτρο [Υπολόγισε]. Θα πρέπει να εμφανιστεί η σελίδα page7d_compute.php και τα αποτελέσματα των υπολογισμών. Κάνοντας click στη λέξη Επιστροφή θα πρέπει να σας επιστρέφει πίσω στη φόρμα για να εισάγετε νέες τιμές. Το παραπάνω PHP script λειτουργεί ορθά, αλλά έχει το εξής σημαντικό πρόβλημα. Εάν ο χρήστης αντί για αριθμούς εισάγει μη-αριθμητικά δεδομένα (πχ τυχαίες πληκτρολογήσεις) τότε θα εμφανιστούν διάφορα σφάλματα από τον κώδικα. Για τον λόγο αυτό είναι πολύ σημαντικό όταν έχουμε εισαγωγή δεδομένων από το χρήστη να κάνουμε διάφορους ελέγχους εγκυρότητας των δεδομένων (Data Validation). Άσκηση 7d2 Τροποποιήστε το script page7d_compute.php προσθέτοντας τις παρακάτω γραμμές κώδικα ακριβώς μετά από την γραμμή $x_step = 0.5; και πριν τη γραμμή function get_result($x){: if (!is_numeric($a)){ echo "Σφάλμα: Το a δεν είναι αριθμός!"; exit; Αυτές οι γραμμές κώδικα ελέγχουν (με την συνάρτηση is_numeric) εάν η παράμετρος $a είναι αριθμητική τιμή ή όχι. Εάν δεν είναι τότε εκτυπώνει ένα μήνυμα σφάλματος και με την εντολή exit προκαλεί άμεση λήψη του script για να μη συνεχίσει στους υπόλοιπους υπολογισμούς. Άσκηση 7d3 Τροποποιήστε το script page7d_compute.php προσθέτοντας επιπλέον ελέγχους για τις παραμέτρους $b και $c. Δοκιμάστε να βάλετε μη-αριθμητικές τιμές στις παραμέτρους αυτές στην φόρμα εισαγωγής και ελέγξτε ότι η σελίδας σας τις αντιμετωπίζει σωστά. 8 Δρ.
Άσκηση 7e Δημιουργήστε το αρχείο page7e.html με το παρακάτω περιεχόμενο: <h1>υπολογισμός της δευτεροβάθμιας εξίσωσης</h1> Αυτή η σελίδα υπολογίζει την παράσταση <b><i>y = ax<sup>2</sup> + bx + c</i></b> για διάφορες τιμές του <b><i>x</i></b>. <form action="page7e_compute.php" method="post"> <b>παράμετροι Εξίσωσης:</b> <table border="1"> <th width="80"> <i>a</i> </th> <td> <input type="text" name="a" value="2" /> </td> <th width="80"> <i>b</i> </th> <td> <input type="text" name="b" value="-5" /> </td> <th width="80"> <i>c</i> </th> <td> <input type="text" name="c" value="-3" /> </td> <br/> <b>διάστημα υπολογισμού:</b> <table border="1"> <th width="80"> από <i>x</i> </th> <td> <input type="text" name="x_start" value="-5" /> </td> <th width="80"> έως <i>x</i> </th> <td> <input type="text" name="x_end" value="15" /> </td> <th width="80"> βήμα <i>x</i> </th> <td> <input type="text" name="x_step" value="0.5" /> </td> <input type="submit" value="υπολόγισε" /> </form> Αυτή τη σελίδα είναι μία βελτίωση της σελίδας page7d.html όπου δίνουμε στον χρήστη τη δυνατότητα να επιλέξει και το διάστημα τιμών υπολογισμού για το x. 9 Δρ.
Δημιουργήστε και την αντίστοιχη σελίδα page7e_compute.php που θα υποδέχεται τα δεδομένα: $a = $_POST["a"]; $b = $_POST["b"]; $c = $_POST["c"]; $x_start = $_POST["x_start"]; $x_end = $_POST["x_end"]; $x_step = $_POST["x_step"]; if (!is_numeric($a)){ echo "Σφάλμα: Το a δεν είναι αριθμός!"; exit; if (!is_numeric($b)){ echo "Σφάλμα: Το b δεν είναι αριθμός!"; exit; if (!is_numeric($c)){ echo "Σφάλμα: Το c δεν είναι αριθμός!"; exit; if (!is_numeric($x_start)){echo "Σφάλμα: Το x_start δεν είναι αριθμός!"; exit; if (!is_numeric($x_end)){echo "Σφάλμα: Το x_end δεν είναι αριθμός!"; exit; if (!is_numeric($x_step)){ echo "Σφάλμα: Το x_step δεν είναι αριθμός!"; exit; if ($x_step<=0){echo "Σφάλμα: Το x_step πρέπει να είναι θετικό!"; exit; function get_result($x){ global $a, $b, $c; $y = $a * $x**2 + $b * $x + $c; return $y; <h1>αποτέλεσμα υπολογισμού της δευτεροβάθμιας εξίσωσης</h1> <a href="page7e.html">επιστροφή</a> Παράμετροι χρήστη: <br/> a = <?=$a, b = <?=$b, c = <?=$c <br/> x_start = <?=$x_start, x_end = <?=$x_end, x_step = <?=$x_step <table border="1" width="200"> <th>x</th> <th>y</th> for ($x = $x_start; $x <= $x_end; $x += $x_step){ <td align="right"> <?= $x </td> <td align="right"> <?= get_result($x) </td> Η σελίδα αυτή είναι μία βελτίωση της σελίδας page7d_compute.php όπου έχουμε κάνει τις εξής προσθήκες: 10 Δρ.
Αντί να δίνουμε σταθερές τιμές στις παραμέτρους $x_start, $x_end και $x_step, παίρνουμε τις τιμές από την $_POST, δηλαδή από τις τιμές που υπέβαλε ο χρήστης στην φόρμα. Στη συνέχεια έχουμε εμπλουτίσει τους ελέγχους εγκυρότητας των δεδομένων του χρήστη. Ελέγχουμε εάν έχουν αριθμητική τιμή όλες οι παράμετροι (a, b, c, x_start, x_end, x_step), αλλιώς εκτυπώνουμε κατάλληλο μήνυμα λάθους και σταματάμε την περαιτέρω εκτέλεση του κώδικα. Τέλος, ελέγχουμε ότι το $x_step είναι θετικός αριθμός. Αυτό είναι πολύ σημαντικό εάν ο χρήστης εισάγει έναν αρνητικό αριθμό ή την τιμή 0. Σε αυτή την περίπτωση, το for-loop δεν θα σταματήσει ποτέ διότι η συνθήκη $x <= $x_end δεν θα ικανοποιηθεί ποτέ. Αυτό είναι ένα πολύ σοβαρό σφάλμα, διότι ο κώδικας PHP θα τρέχει συνεχώς και θα τυπώνει άπειρες γραμμές. Δοκιμάστε διάφορες τιμές στις παραμέτρους (έγκυρες και μη έγκυρες) για να ελέγξετε ότι οι έλεγχοι λειτουργούν σωστά. Άσκηση 7e2 Τροποποιήστε κατάλληλα τις παραπάνω σελίδες page7e.html και page7e_compute.php ώστε να υπολογίζουν την τριτοβάθμια εξίσωση ax 3 +bx 2 +cx+d. 11 Δρ.