Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

Έχω μία αρκετά απλή απορία σε php.

Φτιάχνω μία πολύ απλή εργασία σε php απλά για να κατανοήσω την έννοια του $_GET.

Έχω λοιπόν φτιάξει 1 form σε html που περιέχει 3 input

><form name="operations" method="get" action=""> // o kwdikas php vrisketai sto idio arxeio.
a <input type="text" name="a" value="0" />
oper <input type="text" name="oper" value="operator" />
b <input type="text" name="b" value="0" />
<input type="submit" name="button" value="button" />
</form>

και έχω αντίστοιχα και 3 μεταβλητές, την $oper , την $a και $β στις οποίες εκχωρώ αυτό που πληκτρολογείται σε κάθε input αντίστοιχα.

Η λογική είναι να δίνω τιμές πχ στο α και στο β και μία εντολή στο oper (πχ add) και να μου εμφανίζεται το αποτέλεσμα.

Πριν λοιπόν φτιάξω πχ την function add($a,$B) ορίζω αυτές τις τρεις μεταβλητές στον κώδικα php που έχω κάνει με εξής τρόπο.

>$a = $_GET['a'];
$b = $_GET['b'];
$oper = $_GET['oper'];

Θέλω λοιπόν, να μου πείτε τι ακριβώς είναι η $_GET και τι κάνει στις μεταβλητές μου...(το google δεν με βοήθησε και πολύ ...)

 

Το ρωτάω αυτό γιατί όλα μου λειτουργούν καλά με αυτές τις απλές λειτουργίες όπως η add() κλπ...

αλλά άμα θελω πχ να κάνω μία εντολή στην οποία η input a να δέχεται τα στοιχεία ενός πίνακα και να εμφανίζει το άθροισμά τους το χάνω :(

φτιάχνω πχ μία function

>function sum($a)
{
$m = str_split($a);
return array_sum($m);
}

και λειτουργεί αυτό που θέλω αλλά μου βγάζει κάποια WARNINGs για τις συναρτήσεις και επίσης για τις μεταβλητές που έχω ορίσει παραπάνω (του τύπου: Undefined index)...

Πιστεύω λοιπόν ότι κάτι δεν έχω κάνει καλά με την $_GET έτσι όπως την χρησιμοποίησα..

Μπορείτε να μου δώσετε να καταλάβω? :/

Ευχαριστώ.

Δημοσ.

Η $_GET δεν κάνει τιποτα παραπάνω από το να διαβάζει τα query string που έχει το URL δηλαδή

αν έχουμε αυτο:

 

www.insomnia.gr/index.php?a=2&b=12&c=5

 

με την get

 

$a = $_GET['a'];

$b = $_GET['b'];

$c = $_GET['c'];

 

'Αρα

$a = 2

$b = 12

και

$c = 5

 

Αυτό νομίζω οτι κάνει η get........

Δημοσ.

Ο πίνακας $_GET περιέχει κάθε φορά τις τιμές των μεταβλητών που προκύπτουν από του query string του URL με το οποίο κλήθηκε το script σου.

 

Π.χ. αν το URL ήταν example.php?foo=bar&answer=42&blank= φαντάσου ότι πριν από το δικό σου κώδικα κάποιος έχει γράψει

 

>$_GET = array(
   'foo'    => 'bar',
   'answer' => '42',
   'blank'  => '',
);

 

Προσοχή στο ότι όλα τα στοιχεία του $_GET θα είναι strings (συνήθως δεν παίζει ρόλο αλλά το αναφέρω). Απο κει και πέρα o $_GET είναι σαν οποιοδήποτε άλλο πίνακα, με μόνη διαφορά ότι είναι superglobal και άρα διαθέσιμος παντού χωρίς να χρειάζεται να γράψεις global $_GET;.

 

Τα διάφορα notices που λες οφείλονται στο ότι πιθανότατα πας να διαβάσεις από στοιχεία του $_GET που δεν υπάρχουν. Π.χ. με το παραπάνω URL που έδωσα, αν έγραφες

 

>$invalid = $_GET['invalid'];

 

θα έπαιρνες notice γιατί δεν υπάρχει στον πίνακα στοιχείο με key "invalid". Αυτό ισχύει ακριβώς το ίδιο για όλους τους πίνακες και όχι ειδικά για τον $_GET.

 

Το κλειδί εδώ είναι ότι έχεις τον κώδικα που εμφανίζει τη φόρμα και αυτόν που δέχεται είσοδο από τη φόρμα στο ίδιο αρχείο. Αυτό σημαίνει ότι θα τρέξει ο ίδιος κώδικας για καθένα από τα 2 παρακάτω URL:

 

example.php

example.php?a=1&oper=+&b=1

 

(το δεύτερο URL δεν θα είναι έτσι ποτέ για τεχνικούς λόγους αλλά το έγραψα λάθος για ευκολία -- αντιπροσωπεύει την πράξη 1+1).

 

Αν λοιπόν γράψεις

 

>$a = $_GET['a'];

 

τότε στη δεύτερη περίπτωση (μετά την υποβολή της φόρμας) όλα καλά, ενώ στην πρώτη θα φας notice (αφού δεν υπαρχει τέτοιο στοιχείο στον $_GET).

 

Αυτό είναι εντελώς συνηθισμένη περίπτωση, και για να αποφύγεις το notice πρέπει να κάνεις ένα τεστ πρώτα με empty() ή isset() -- οι διαφορές είναι εκτός του scope της απάντησής μου αλλά εδώ επειδή μπορεί να έχεις σαν είσοδο τον αριθμό μηδέν το σωστό είναι με isset. Π.χ.:

 

>if(isset($_GET['a'])) {
   $a = $_GET['a'];
}
else {
   $a = null; // θα μπορούσες να μην δώσεις καν τιμή, αλλά τότε θα έτρωγες notice αν πήγαινες παρακάτω να χρησιμοποιήσεις την $a, οπότε δώρον άδωρον
}

 

Αυτό λοιπόν επειδή είναι δύσχρηστο το γράφεις συντομότερα έτσι:

 

>$a = isset($_GET['a']) ? $_GET['a'] : null;

 

Και για να μην πρήζεσαι, το βάζεις σε function:

 

>
function getvar($name, $default = null) {
   return isset($_GET[$name]) ? $_GET[$name] : $default;
}

$a = getvar('a'); // δεν πρόκειται ποτέ να δώσει notice πλέον

 

Κάτι παρόμοιο (αν και φυσικά όχι τόσο απλοϊκό) θα βρεις σε οποιοδήποτε πρόγραμμα PHP έγραψε κάποιος που ξέρει 5 πράγματα για τη γλώσσα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...