christomar Δημοσ. 25 Νοεμβρίου 2009 Δημοσ. 25 Νοεμβρίου 2009 Γεια, φτιάχνω μία εφαρμογή όπου έχω μία σελίδα php στην οποία έχω 3 drop down lists που είναι ιεραρχικά μεταξύ τους, είναι γενική κατηγορία, κατηγορία και υπο-κατηγορία. Επιλέγω πρώτα απ'το πρώτο drop down και ανάλογα τι επιλέγω μετά εμφανίζονται οι δυνατές επιλογές του δεύτερου drop down και ανάλογα την επιλογή μου στο δεύτερο drop down εμφανίζονται οι επιλογές του τρίτου drop down. Στη σελίδα αυτή, μόλις επιλέξω αυτά που θέλω απ'τα 3 drop down lists μου, έχω ένα submit κουμπί μέσα απ'το οποίο γράφω τις επιλογές μου σ'ένα table στη βάση δεδομένων μου.. ο κώδικας είναι: ><?php echo "<form method=post name=roadForm action=record_added.php>"; ?> <tr> <td valign="top"> <?php echo "Επιλέξτε Γενική Κατηγορία: <br>"; ?> <select name="country" onChange="getState(this.value)"><option value=''>Όλες οι γεν. κατηγορίες...</option> <?php while($row_state = mysql_fetch_array($result_state)) { echo "<option value='$row_state[gencatid]'>$row_state[gname]</option>"; } ?> </select> <?php echo "</p>"; echo "<p>"; echo "Επιλέξτε Κατηγορία: <br>"; ?> <div id="statediv"><select name="state"> <option>Πρώτα επιλέξτε γενικότερη κατηγορία</option> </select></div> <?php echo "</p>"; echo "<p>"; echo "Επιλέξτε Υποκατηγορία: <br>"; ?> <div id="citydiv"><select name="city"> <option>Πρώτα επιλέξτε κατηγορία</option> </select></div> για να μπορέσω τα drop down lists να τα φτιάξω χωρίς refresh, έφτιαξα κάποια functions και 2 αντίστοιχες php σελίδες.. Τα functions είναι: >function getXMLHTTP() { //fuction to return the xml http object var xmlhttp=false; try{ xmlhttp=new XMLHttpRequest(); } catch(e) { try{ xmlhttp= new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e1){ xmlhttp=false; } } } return xmlhttp; } function getState(countryId) { var strURL="findState2.php?country="+countryId; var req = getXMLHTTP(); if (req) { req.onreadystatechange = function() { if (req.readyState == 4) { // only if "OK" if (req.status == 200) { document.getElementById('statediv').innerHTML=req.responseText; } else { alert("There was a problem while using XMLHTTP:\n" + req.statusText); } } } req.open("GET", strURL, true); req.send(null); } } function getCity(countryId,stateId) { var strURL="findCity2.php?country="+countryId+"&state="+stateId; var req = getXMLHTTP(); if (req) { req.onreadystatechange = function() { if (req.readyState == 4) { // only if "OK" if (req.status == 200) { document.getElementById('citydiv').innerHTML=req.responseText; } else { alert("There was a problem while using XMLHTTP:\n" + req.statusText); } } } req.open("GET", strURL, true); req.send(null); } } και οι δύο Php σελίδες: 1. findState2.php ><?php include 'connect.php'; $country=intval($_GET['country']); $query="SELECT catid,catname FROM categ WHERE gencatid='$country'"; $result=mysql_query($query) or die (mysql_error()); echo $country; ?> <select name="state" onchange="getCity(<?=$country?>,this.value)"> <option>Επιλέξτε κατηγορία</option> <?php while($row=mysql_fetch_array($result)) { ?> <option value=<?=$row['catid']?>><?=$row['catname']?></option> <?php } ?> </select> 2. findCity2.php ><?php include 'connect.php'; include("login/include/session.php"); $countryId=intval($_GET['country']); $stateId=intval($_GET['state']); echo $stateId; $query = "SELECT DISTINCT subkatid,catid,scname FROM subcat where catid='$stateId'"; $result=mysql_query($query); ?> <select name="city"> <option>Επιλέξτε υπο κατηγορία..</option> <? while($row=mysql_fetch_array($result)) { ?> <option value=<?=$row['subkatid']?>><?=$row['scname']?></option> <?php } ?> </select> Τα drop down τα έχω κάνει να εμφανίζονται χωρίς να γίνεται refresh η σελίδα ώστε να μη χάνονται τα άλλα δεδομένα που υπάρχουν στη σελίδα. Η εμφάνιση των δεδομένων γίνεται μια χαρά χωρίς refresh χωρίς κανένα πρόβλημα. Όμως επειδή δε γίνεται refresh η σελίδα, τα ids του δεύτερου και του τρίτου drop down βρίσκονται σωσμένα στις σελίδες findState2.php και findCity2.php αντίστοιχα και δεν μπορώ να τα περάσω στην κεντρική μου σελίδα php όπου θέλω να κάνω το INSERT query μου στη βάση.. Μήπως ξέρει κανείς πώς μπορεί να γίνει κάτι τέτοιο? Ευχαριστώ προκαταβολικά
Uberalles_gr Δημοσ. 25 Νοεμβρίου 2009 Δημοσ. 25 Νοεμβρίου 2009 Αυτό γίνεται με χρήση AJAX , όπως δηλαδή το κάνεις αλλά σε ένα ακόμα επίπεδο. Δηλαδή στις 2 php που έχεις φτιάξει (findState2.php , findCity2.php) ότι κάνεις echo τότε στην σελίδα που έχει τα functions και πιο συγκεκριμένα στην μεταβλητή req.responseText θα αποθηκευτούν. Κάνε ένα alert για να δεις τι περνάς http://www.w3schools.com/ajax/ajax_database.asp
christomar Δημοσ. 25 Νοεμβρίου 2009 Μέλος Δημοσ. 25 Νοεμβρίου 2009 Σ'ευχαριστώ πολύ για την απάντηση! Η αλήθεια είναι οτι δεν έχω δουλέψει καθόλου με Ajax και δεν καταλαβαίνω ακριβώς πώς ο κώδικας που υπάρχει στο λινκ που έδωσες μπορεί να προσαρμοστεί στο δικό μου παράδειγμα..θα το κοιτάξω όμως! Έκανα ένα alert για να δω τι κρατάει το responseText έτσι: >alert("This is what I get:\n" + req.responseText); και βγαίνει αυτό: >This is what I get: <select id="state" name="state" onchange="getCity(3,this.value)"> <option>Επιλέξτε κατηγορία...</option> <option value=28>ΑΘΛΗΤΙΚΕΣ ΕΓΚΑΤΑΣΤΑΣΕΙΣ</option> <option value=29>ΑΘΛ. ΟΜΟΣΠΟΝΔΙΕΣ</option> </select> Τώρα ουσιαστικά απ'το παραπάνω εγώ θέλω να αποθηκεύω κάπως στη σελίδα που έχω τα functions το selected value απ'το παραπάνω drop down list..
Uberalles_gr Δημοσ. 25 Νοεμβρίου 2009 Δημοσ. 25 Νοεμβρίου 2009 Είναι φυσιολογικό αυτό που σου βγάζει, αφού ουσιαστικά περνάει στην μεταβλητή που σου είπα ότι "ΘΑ" εμφανιζότανε στην σελίδα σου. Τι ακριβώς θες γιατί τώρα με μπέρδεψες.. Αυτό που βρήκες θα το κάνεις document.getElementById('statediv').innerHTML = req.responseText; και στο element που έχεις με αυτό το id θα σου βάλει τo drop down menu και με post θα πάρεις ότι δεδομένα θες
christomar Δημοσ. 25 Νοεμβρίου 2009 Μέλος Δημοσ. 25 Νοεμβρίου 2009 Ωραία αυτό που έγραψες τώρα ήθελα να καταλάβω κι εγώ, νομίζω μ'έκανες να καταλάβω, θα το δοκιμάσω αύριο το πρωί! Εγώ αυτό που θέλω είναι να μπορώ να έχω στη σελίδα την κύρια, εκεί που έχω τα functions, την τιμή της επιλεγμένης id απ'το drop down menu που βγάζει το alert το παραπάνω. Θέλω το id αυτό ώστε να μπορώ να γράψω την επιλεγμένη μεταβλητή σ'ένα table της βάσης μου.
Uberalles_gr Δημοσ. 26 Νοεμβρίου 2009 Δημοσ. 26 Νοεμβρίου 2009 Σκέψου το εξής : Εάν έχεις μία σελίδα με ένα drop down το οποίο το δημιουργείς δυναμικά από την βάση, μπορείς ανάλογα τι επέλεξε ο άλλος με βάση το "<option value=<?=$row['subkatid']?>>" να ξέρεις και την τιμή του id. Τώρα με AJAX κάνεις ακριβώς το ίδιο, δλδ δημιουργείς ένα drop down στην findCity2.php και με την βοήθεια της functions εμφανίζεις το drop down στην κύρια σελίδα σου με το innerHTML Μία συμβουλή : Να σταματήσεις να χρησιμοποιείς το <?= γιατί είναι PHP 4 . Το "σωστό" είναι <?php echo
christomar Δημοσ. 26 Νοεμβρίου 2009 Μέλος Δημοσ. 26 Νοεμβρίου 2009 Το να εμφανίζω το drop down list στην κύρια σελίδα δεν έχω πρόβλημα, εμφανίζεται κανονικά, αυτό συγκεκριμένα που θέλω είναι να μπορώ στην κύρια σελίδα να κρατήσω σε μία ξεχωριστή μεταβλητή την id της επιλεγμένης τιμής απ'το drop down list, ώστε να μπορώ να την γράψω στη βάση δεδομένων μου. Προς το παρόν η τιμή της id αυτής αποθηκεύεται μόνο στην findState2.php και στην findCity2.php αντίστοιχα, και δεν μπορώ να την τραβήξω ώστε να την έχω και στην κύρια σελίδα (main.php) όπου έχω τις δύο συναρτήσεις που έγραψα πάνω..απλά δεν καταλαβαίνω το POST πώς θα το κάνω, έχω παντελώς άγνοια από ajax συγγνώμη! Θα αλλάξω δηλαδή τα functions που έχω ήδη με κάποιον τρόπο ή θα πρέπει να προσθέσω κάποιες συγκεκριμένες εντολές ώστε να μπορέσω να πάρω την τιμή της μεταβλητής?
Uberalles_gr Δημοσ. 26 Νοεμβρίου 2009 Δημοσ. 26 Νοεμβρίου 2009 Την τιμή την έχεις πάρει ήδη απλώς δεν το έχεις καταλάβει.. Ας το πάρουμε αλλιώς, έστω ότι κάνεις τα drop down παίζουν μια χαρά. Μετά τι θες να κάνεις?? Θα πατάς κάποιο sumbit?
christomar Δημοσ. 26 Νοεμβρίου 2009 Μέλος Δημοσ. 26 Νοεμβρίου 2009 Ναι πατάω ένα κουμπί που είναι type submit. Τις τιμές όλες που θέλω να τις αποθηκεύσω στη βάση τις έχω στην main.php σε μία form με method=post και action="add_record.php", οπότε μετά το submit button παίρνω όλες τις τιμές με $_POST στο add_record.php αρχείο και εκτελώ μία INSERT sql query για να τις περάσω στη βάση.
Uberalles_gr Δημοσ. 26 Νοεμβρίου 2009 Δημοσ. 26 Νοεμβρίου 2009 Το πρόβλημα που είναι δεν καταλαβαίνω?
christomar Δημοσ. 26 Νοεμβρίου 2009 Μέλος Δημοσ. 26 Νοεμβρίου 2009 Αυτό που δεν καταλαβαίνω είναι με ποιον τρόπο θα πάρω τη συγκεκριμένη μεταβλητή απ'το drop down list. Δοκίμασα στην main.php να γράψω $new_var=$_POST['state']; αλλά μου λέει ότι δε βρίσκει τη μεταβλητή state, όπου state είναι το id του <select> στην findState2.php..εκεί έχω κολλήσει, πρέπει να είναι χαζό το ξέρω αλλά δεν μπορώ να ξεκολλήσω για να το καταλάβω!
Uberalles_gr Δημοσ. 26 Νοεμβρίου 2009 Δημοσ. 26 Νοεμβρίου 2009 Είσαι στην κύρια σελίδα σου. Μετά δηιμουργείς τα drop down και μετά πατάς submit και πας σε μία άλλη php σελίδα όπου θες να κάνεις POST τα δεδομέα της κύριας σελίδας. Ουσιαστικά να τραβήξεις τις τιμές των drop down. Το κάθε drop down έχει και ένα όνομα στο παράδειγμα σου <select name="city"> , άρα θα κάνεις $a = $_POST['city'] ή $b=$_POST['state']; To post δεν το κάνεις στην σελίδα που είσαι αλλά δεν πας σε μία άλλη? Έτσι δεν είπες?
christomar Δημοσ. 26 Νοεμβρίου 2009 Μέλος Δημοσ. 26 Νοεμβρίου 2009 Ναι αυτό ακριβώς είπα, τα post τα κάνω στην add_record.php. Στην add_record.php δοκίμασα να κάνω $new_rec=$_POST['state']; και μετά στην insert query έβαλα τη μεταβλητή $new_rec αλλά όταν είδα στη βάση είχε την τιμή μηδέν, δεν την είχε πάρει δηλαδή.
Uberalles_gr Δημοσ. 26 Νοεμβρίου 2009 Δημοσ. 26 Νοεμβρίου 2009 Δεν χρειάζεται να βλέπεις στην βάση εάν έχει πάρει την τιμή. Αρχική κάνε ένα echo to $_POST['state']; Να δεις ότι έχει τιμή . Εάν έχει τιμή τότε κάνεις λάθος το query για το insert στην βάση. Εάν δεν έχει τιμή τότε τα δεδομένα σου δεν γίνονται post
christomar Δημοσ. 26 Νοεμβρίου 2009 Μέλος Δημοσ. 26 Νοεμβρίου 2009 Το έκανα echo και δεν μου βγαίνει τίποτα..άρα δεν παίρνονται μέσα απ'το post τα δεδομένα..αυτό ήταν το πρόβλημά μου εξαρχής, άρα κάτι γίνεται λάθος στα αρχικά..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.