Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 17 Δεκ 2009 16:01

Γεια σας,
φτιάχνω μια φόρμα η οποία θα φιλτράρει εγγραφές απο μια βάση δεδομένων και χρησιμοποιεί τέσσερα select boxes. Αφορά ταξίδια επομένως τα τέσσερα select boxes είναι τα εξής:
continent(ήπειρος), country(χώρα), type (τύπος=ομαδικό, γαμήλιο κλπ), duration(διάρκεια).

Αυτό που προσπαθώ να πετύχω είναι να καταφέρω αρχικά να κάνω τα select boxes να αλληλεπιδρούν το ένα με το άλλο. Υποτίθεται οτι ο χρήστης μπορεί να επιλέξει τιμές σε κανένα, σε ένα, σε δυο, σε τρία ή και στα τέσσερα select boxes. Αυτό με τη δική μου κοινή λογική μας δίνει 16 διαφορετικά sql ερωτήματα και 16 ελέγχους if για τους συνδυασμούς των επιλογών. Και δε φαίνεται και πολύ σωστό σαν λύση.

Είναι αυτός ο μοναδικός τρόπος να γίνει κάτι τέτοιο; Μπορείτε λιγάκι να με βοηθήσετε γιατί έχω πελαγώσει.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από dva_dev » 17 Δεκ 2009 21:48

Πέρα από την ήπειρο και τη χώρα (που προφανώς μπορούν να συσχετιστούν) τα υπόλοιπα συνδέονται κάπως μεταξύ τους (ή με αυτά τα δύο);
Εμένα μου φαίνεται ότι έχεις τρία ανεξάρτητα πεδία (χώρα, τύπος, διάρκεια) για να παράγεις συνδιασμούς, και μόνο το ήπειρος με το χώρα να έχουν κάποια αλληλεπίδραση μεταξύ τους.
Εχει νόημα (με εξαίρεση την αυστραλία) να πεις θέλω να βρώ γαμήλιο ταξίδι, 10-20 Δεκεμβρίου στην Ασία, και φέρε μου αποτελέσματα;

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 18 Δεκ 2009 09:59

αναφέρω οτι τα πεδία συνδέονται μεταξύ τους με την έννοια ότι αν πχ. αρχικά επιλέξω να δω μόνο ομαδικά ταξίδια, θέλω στο select boxes των χωρών να υπάρχουν μόνο χώρες για τις οποίες όντως υπάρχουν καταχωρημένα ομαδικά ταξίδια. Το ίδιο ισχύει και με όλα τα select boxes και τους συνδυασμούς τους.

Οι τιμές των πεδίων (εκτός απο ήπειρο-χώρα) δεν έχουν σχέση κατηγορίας - υποκατηγορίας. Απλά θέλω κάθε φορά που ο χρήστης αλλάζει επιλογή σε ένα select box, οι διαθέσιμες τιμές των υπόλοιπών 3 να αλλάζουν και αυτές, ανάλογα με την επιλογή που έκανε.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από fafos » 18 Δεκ 2009 16:25

H lysh einai me ligo ajax (ta kanei aorata :lol: ) kai 4 queries...

koita edo ena paradeigma: http://www.elastika-center.gr/products.php

pata to button ths analytikhs anazhthshs kai epelekse "epivatika" > "elastika" kai meta kataskeyasth kai times..

auto einai me 5 queries alla h filosofia einai h idia.. ta "eidos oxhmatos" kai "kathgoria" einai san kathgoria kai ypokathgoria.. ta ypoloipa (kataskeyasths kai times) vriskontai se 1 table ths vashs kai analoga ton kataskeyasth vgazei tis times:

Κώδικας: Επιλογή όλων

<?

     header &#40;"Expires&#58; Mon, 26 Jul 1997 05&#58;00&#58;00 GMT"&#41;;
     header &#40;"Last-Modified&#58; " . gmdate&#40;"D, d M Y H&#58;i&#58;s"&#41; . " GMT"&#41;;
     header &#40;"Cache-Control&#58; no-cache, must-revalidate"&#41;;
     header &#40;"Pragma&#58; no-cache"&#41;;
     
     header&#40;"content-type&#58; application/x-javascript; charset=UTF-8"&#41;;
     
     $data=$_GET&#91;'data'&#93;;
     $val=$_GET&#91;'val'&#93;;
     

require 'config.php';//stoixeia vashs
mysql_pconnect&#40;$dbhost,$dbuser,$dbpass&#41; or die &#40;"Unable to connect to MySQL server"&#41;;  
   mysql_real_escape_string&#40;$data&#41;;  
   mysql_real_escape_string&#40;$val&#41;; 
     if &#40;$data=='c'&#41; &#123; 
          echo "<select name='c' onChange=\"dochange&#40;'cb', this.value&#41;\">\n";
          echo "<option value=''>Όλα</option>\n";
          $result=mysql_db_query&#40;$dbname,"select id, name from categories order by BINARY name ASC"&#41;;
          while&#40;list&#40;$id, $name&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;
               echo "<option value=\"$id\" >$name</option> \n" ;
          &#125;
     &#125; else if &#40;$data=='cb'&#41; &#123;
          echo "<select name='cb' onChange=\"dochange&#40;'b', this.value&#41;\">\n";
          echo "<option value=''>Κατηγορία Προϊόντος</option>\n";
          $val2=$val;
          $val = substr&#40;$val,0,4&#41;;                                 
          $result=mysql_db_query&#40;$dbname,"SELECT id, name FROM categories_b WHERE  cat_id= '$val'   ORDER BY BINARY name ASC "&#41;;
          while&#40;list&#40;$id, $name&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;       
               echo "<option value=\"$id\" >$name</option> \n" ;
          &#125;
     &#125; else if &#40;$data=='b'&#41; &#123;
          echo "<select name='b' onChange=\"dochange&#40;'pf', this.value&#41;\">\n";
          echo "<option value=''>Κατασκευαστής</option>\n";
          $val2=$val;
          $val = substr&#40;$val,0,4&#41;;                                 
          $result=mysql_db_query&#40;$dbname,"SELECT DISTINCT&#40;brand&#41; FROM products WHERE  cat_b= '$val'   ORDER BY brand ASC "&#41;;
          while&#40;list&#40;$id&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123; 
		 	$querya = "SELECT * FROM brands WHERE id='$id'";
	$resulta = mysql_db_query&#40;$dbname, $querya, $conn&#41;;
	$d = mysql_fetch_array&#40;$resulta&#41;; 
               echo "<option value=\"$id\" >$d&#91;name&#93;</option> \n" ;
          &#125;
     &#125;  else if &#40;$data=='pf'&#41; &#123;
          echo "<select name='pf' onChange=\"dochange&#40;'pt', this.value&#41;\">\n";
          echo "<option value=''>Τιμή από</option>\n";
          $val2=$val;
          $val = substr&#40;$val,0,4&#41;;                                 
          $result=mysql_db_query&#40;$dbname,"SELECT DISTINCT&#40;price&#41; FROM products WHERE  brand='$val'   ORDER BY price ASC "&#41;;
          while&#40;list&#40;$id&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123; 
 
               echo "<option value=\"$id\" >$id</option> \n" ;
          &#125;
     &#125; else if &#40;$data=='pt'&#41; &#123;
          echo "<select name='pt'\">\n";
          echo "<option value=''>Τιμή έως</option>\n";
          $val2=$val;
          $val = substr&#40;$val,0,4&#41;;                                 
          $result=mysql_db_query&#40;$dbname,"SELECT DISTINCT&#40;price&#41; FROM products WHERE  price > '$val'   ORDER BY price ASC "&#41;;
          while&#40;list&#40;$id&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123; 
 
               echo "<option value=\"$id\" >$id</option> \n" ;
          &#125;
     &#125; 
     echo "</select>\n";  
?>
opos vlepeis, kalei to eidos oxhmatos apo thn forma (me to ajax trexei automata) sto table ths vashs "categories"... an epileksoume to eidos automata kalei thn kathgoria sto "categories_b"... an epileksoume thn kathgooria automata anoigei to select tou kataskeuasth kai kalei to table "products" to opoio otan epilegei trexei kai PALI to idio table(products) klp klp
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 21 Δεκ 2009 09:51

ευχαριστώ για την απάντηση. Θα μελετήσω σήμερα τον κώδικα που έδωσες και ελπίζω να τα καταφέρω

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από cherouvim » 21 Δεκ 2009 10:18

Αν οι συνολικές τιμές των select boxes είναι λίγες (ας πούμε κάτω από 200) μπορείς να έχεις τα πάντα μέσα στο HTML και απλά να τα δείχνεις/κρύβεις με javascript (χωρίς ajax και επιπλέον database queries).

http://temp.cherouvim.com/forums/cascading-dropdowns/
http://www.freestuff.gr/forums/viewtopic.php?t=23548
http://www.freestuff.gr/forums/viewtopic.php?t=17467

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 21 Δεκ 2009 12:00

cherouvim έγραψε:Αν οι συνολικές τιμές των select boxes είναι λίγες (ας πούμε κάτω από 200) μπορείς να έχεις τα πάντα μέσα στο HTML και απλά να τα δείχνεις/κρύβεις με javascript (χωρίς ajax και επιπλέον database queries).

http://temp.cherouvim.com/forums/cascading-dropdowns/
http://www.freestuff.gr/forums/viewtopic.php?t=23548
http://www.freestuff.gr/forums/viewtopic.php?t=17467
δυστυχώς δεν μπορώ να χρησιμοποιήσω την τεχνική αυτή στα select boxes γιατί οι τιμές δεν είναι σταθερές και αντλούνται όλες μέσα απο τη βάση. Το είχα ξαναδεί αυτό το ποστ καθώς έψαχνα γι'αυτό το θέμα. Ευχαριστώ για την απάντηση πάντως

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 21 Δεκ 2009 12:04

fafos επειδή ο κώδικάς σου μπλέκει και ajax μέσα, δυσκολεύομαι πολύ να τον αλλάξω δοκιμάσω για τη δική μου σελίδα. Υπάρχει κάποια σελίδα, κάποιο άρθρο, κάποιο πόστ το οποίο σε βοήθησε να το φτιάξεις;

Γενικά αν έχετε κάποιες σελίδες να μου προτείνετε που να έχουν σχέση με το θέμα, θα με βοηθούσατε πάρα πολύ. Δυστυχώς εγώ δεν έχω βρει κάτι αξιόλογο μέχρι στιγμής. Ίσως δε χρησιμοποιώ τα σωστά keywords, δεν ξέρω.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από fafos » 21 Δεκ 2009 15:09

zekia έγραψε:fafos επειδή ο κώδικάς σου μπλέκει και ajax μέσα, δυσκολεύομαι πολύ να τον αλλάξω δοκιμάσω για τη δική μου σελίδα. Υπάρχει κάποια σελίδα, κάποιο άρθρο, κάποιο πόστ το οποίο σε βοήθησε να το φτιάξεις;

Γενικά αν έχετε κάποιες σελίδες να μου προτείνετε που να έχουν σχέση με το θέμα, θα με βοηθούσατε πάρα πολύ. Δυστυχώς εγώ δεν έχω βρει κάτι αξιόλογο μέχρι στιγμής. Ίσως δε χρησιμοποιώ τα σωστά keywords, δεν ξέρω.
Thn Ajax thn xrhsimopoioume gia na mhn trexoume ksana kai ksana thn idia selida me kathe allagh ton options menu.. esy ti thes? na to trexeis san aplh php forma? (opote se kathe allagh na trexei to get tou option menu) h me ajax? (me thn opoia tha kratas ton xrhsth sthn selida xoris reload)..

opoion tropo kai na dialekseis tha xrhsimopoihseis javascript anagkastika.. ego proteino ajax pantos.. pes mou ti thes na to analyso...
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από nbc » 21 Δεκ 2009 18:16

zekia, φοβάμαι ότι δυσκολεύεις τη ζωή σου χωρίς λόγο.

Κατ' αρχάς, σου προτείνω να διώξεις το πεδίο της ηπείρου. Μπορείς να το κρατήσεις στον πίνακα, για την ομαδοποίηση των χωρών. Το σύστημα θα είναι πιο ευέλικτο αν δώσεις τη δυνατότητα στο χρήστη multi-selection από το πεδίο των χωρών. Μπορεί, για παράδειγμα, να επιλέξει "Γερμανία" και "Αριζόνα", κάτι που τώρα αποκλείεις. Στο ίδιο πεδίο, και εφόσον το επιθυμείς, μπορείς να βάλεις και τις ηπείρους οι οποίες θα είναι ευδιάκριτες και θα ξεχωρίζουν από τις χώρες με κάποιο indentation, bolding, κλπ. Έτσι, αν ο χρήστης επιλέξει ήπειρο αντί χώρας, θα είναι σαν να επιλέγει όλες τις χώρες της ηπείρου.

Αφού ο χρήστης κάνει και τις υπόλοιπες επιλογές του, πατάει το submit και το σύστημα του επιστρέφει το αποτέλεσμα με ένα και μόνο query.

Τώρα, εφόσον θέλεις να ταλαιπωρήσεις τον server και τον χρήστη, μπορείς κάλλιστα να μετατρέψεις το παραπάνω λειτουργικό σύστημα σε live query πολύ απλά, κάνοντας χρήση των onChange handlers των inputs ώστε να καλούν μια συνάρτηση η οποία - μέσω ajax - εκτελεί το action της φόρμας και να εμφανίζουν το αποτέλεσμα, real-time. Αυτή η λύση είναι τόσο καθαρή που μπορείς να την ελέγξεις με ένα απλό boolean flag (στην αρχή της συνάρτησης), χωρίς την παραμικρή επίπτωση/αλλαγή στον κώδικα, και την όλη λογική γενικότερα.

Συνεπώς, πρώτα το κάνεις να δουλεύει "στατικά" και απλά (KISS principle) και στη συνέχεια το εμπλουτίζεις. Έτσι διατηρείς και το πλεονέκτημα να έχεις ένα σύστημα που δουλεύει και με απενεργοποιημένη javascript. Με τον τρόπο που το σκέφτεσαι, αν δεν σου κάτσει, θα πάει χαμένος ο κώδικας και ο χρόνος σου.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από fafos » 21 Δεκ 2009 21:27

Φίλτατε nbc δεν ξέρεις τι "κάλο" έχουμε εμείς οι "ταξιδιάρηδες" :lol:

εγώ προσωπικά θα ήθελα στην φόρμα αναζήτησης κάποιου προγράμματος να μου έβγαζε και τις γειτονιές του κάθε χωριού ανά την υφήλιο!

Τέλος πάντων.. και για μένα θα ήταν καλό να επέλεγε χώρα>πόλη αλλά και οι ήπειροι δεν είναι λάθος αν υπάρχουν σαν ξεχωριστό table στην βάση..


Έφτιαξα κάτι στα γρήγορα για την περίπτωση της zekia.. εδώ χρησιμοποιώ 3 tables (continent, country & program)..

Ένα demo εδώ: http://www.istopoli.com/cruise/options/

Χρησιμοποίησα λίγο ajax, php & mysql... αν κάποιος έχει γνώσεις php & mysql μπορεί να το προσαρμόσει όπως θέλει..

Το πρόβλημα με αυτό το script ήταν να "ταιριάξουν" τα πεδία που είναι μέσα στο ίδιο table (type & duration). Το πρόβλημα ήταν ότι επιλέγοντας τον τύπο "αθετούσε" την ήπειρο και την χώρα που είχα επιλέξει πριν και μου έβγαζε όλες τις διάρκειες (ανεξαρτήτου ηπείρου και χώρας) ενώ εμείς θέλουμε της Α ηπείρου > της Β χώρα> του Γ τύπου τις διάρκειες. Αυτό το πρόβλημα λύθηκε με την χρήση sessions..


Η φόρμα:

Κώδικας: Επιλογή όλων

<!--h forma mas-->
<form name="forma" method="post" action="">
<input type="hidden" name="validform" value="1">


<table  cellpadding="5" cellspacing="2">
    <tr>
    <td align="left" valign="top">Ήπειρος&#58;<br>
<font id="continent"><select>
<option value=''>===</option> 
</select></font>
	  </td>
	  
     <td align="left" valign="top">Χώρα&#58;<br>
<font id="country"><select>
<option value=''>Όλες</option> 
</select></font>
 
	  
	  </td>
      <td align="left" valign="top">Τύπος&#58;<br>
  <font id="type"><select>
<option value=''>Όλοι</option> 
</select></font>
	  </td>
	  
	  
      <td align="left" valign="top">Δειάρκεια&#58;<br>
  <font id="duration"><select>
<option value=''>Όλες</option> 
</select></font>
	  </td>
	  
  
      <td align="left" valign="top"><br>

<input type="submit" name="submit" value="submit" style="font-size &#58; 12px;font-family &#58; Arial;font-weight &#58; bold;color &#58; #ffffff;background-color &#58; #0080ff;padding-top &#58; 2px;padding-left &#58; 2px;padding-right &#58; 2px;padding-bottom &#58; 2px;border-width &#58; 3px 3px 3px 3px;border-style &#58; solid solid solid solid;border-color &#58; #0055aa #0055aa #0055aa #0055aa;cursor &#58; pointer;">

	  </td>	  
    </tr>
</table>

</form>



<!--telos formas-->
Στο demo μου χρησιμοποιώ τα options για μία απλή αναζήτηση... Αυτό που μας ενδιαφέρει εδώ είναι τα select όπως αυτό:

Κώδικας: Επιλογή όλων

<font id="continent"><select>
<option value=''>===</option> 
</select></font>
Για να μπορέσει η ajax να καταλάβει ποιο select καλούμε θα πρέπει να το βάλουμε σε ένα element της html και να του δώσουμε ένα μοναδικό id:

<font id="continent"><select>
<option value=''>===</option>
</select></font>

συνεχίζουμε φτιάχνοντας όλα τα select με τον ίδιο τρόπο βάζοντας πάντα ΜΟΝΑΔΙΚΟ id για κάθε select...


To Ajax script:

Κώδικας: Επιλογή όλων

<!--ajax script-->
<script language=Javascript>
function Inint_AJAX&#40;&#41; &#123;
   try &#123; return new ActiveXObject&#40;"Msxml2.XMLHTTP"&#41;;  &#125; catch&#40;e&#41; &#123;&#125; //IE
   try &#123; return new ActiveXObject&#40;"Microsoft.XMLHTTP"&#41;; &#125; catch&#40;e&#41; &#123;&#125; //IE
   try &#123; return new XMLHttpRequest&#40;&#41;;          &#125; catch&#40;e&#41; &#123;&#125; //Native Javascript
   alert&#40;"XMLHttpRequest not supported"&#41;;
   return null;
&#125;;

function dochange&#40;src, val&#41; &#123;
     var req = Inint_AJAX&#40;&#41;;
     req.onreadystatechange = function &#40;&#41; &#123; 
          if &#40;req.readyState==4&#41; &#123;
               if &#40;req.status==200&#41; &#123;
                    document.getElementById&#40;src&#41;.innerHTML=req.responseText; 
               &#125; 
          &#125;
     &#125;;
     req.open&#40;"GET", "get-options.php?data="+src+"&val="+val&#41;; 
     req.send&#40;null&#41;; 
&#125;

window.onLoad=dochange&#40;'continent', -1&#41;;     
</script>
<!--telos ajax script-->
Εδώ μας ενδιαφέρει ποια σελίδα (php) θέλουμε να τρέξει η ajax για να μας γυρίσει αποτελέσματα που ταιριάζουν στα select μας.. Εγώ έδωσα ένα τίτλο get-options.php:

Κώδικας: Επιλογή όλων

req.open&#40;"GET", "get-options.php?data="+src+"&val="+val&#41;; 
Παρακάτω έχω αυτό:
window.onLoad=dochange('continent', -1);

το οποίο λέει πιο select να τρέξει αρχικά η σελίδα ( continent = ήπειροι)


To Αρχείο php get-options.php:

Κώδικας: Επιλογή όλων

<?session_start&#40;&#41;;

     header &#40;"Expires&#58; Mon, 26 Jul 1997 05&#58;00&#58;00 GMT"&#41;;
     header &#40;"Last-Modified&#58; " . gmdate&#40;"D, d M Y H&#58;i&#58;s"&#41; . " GMT"&#41;;
     header &#40;"Cache-Control&#58; no-cache, must-revalidate"&#41;;
     header &#40;"Pragma&#58; no-cache"&#41;;
     
     header&#40;"content-type&#58; application/x-javascript; charset=UTF-8"&#41;;
     
     $data=$_GET&#91;'data'&#93;;
     $val=$_GET&#91;'val'&#93;;
     

//stoixeia vashs
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'trips';

 $country = $_SESSION&#91;'country'&#93;;
mysql_pconnect&#40;$dbhost,$dbuser,$dbpass&#41; or die &#40;"Unable to connect to MySQL server"&#41;; 

//se periptosh provlhmatos me ta Ellhnika + UTF-8 vazoume to parakato
mysql_query&#40;' set character set utf8 '&#41;;
mysql_query&#40;"SET NAMES 'utf8' "&#41;; 

   mysql_real_escape_string&#40;$data&#41;; 
   mysql_real_escape_string&#40;$val&#41;;
     if &#40;$data=='continent'&#41; &#123;
          echo "<select name='continent' onChange=\"dochange&#40;'country', this.value&#41;\">\n";
          echo "<option value=''>Επιλέξτε Ήπειρο</option>\n";
          $result=mysql_db_query&#40;$dbname,"select id, name from continent order by BINARY name ASC"&#41;;
          while&#40;list&#40;$id, $name&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;
               echo "<option value=\"$id\" >$name</option> \n" ;
          &#125;
     &#125; else if &#40;$data=='country'&#41; &#123;
          echo "<select name='country' onChange=\"dochange&#40;'type', this.value&#41;\">\n";
          echo "<option value=''>Χώρα</option>\n";                          
          $result=mysql_db_query&#40;$dbname,"SELECT id, name FROM country WHERE  continent= '$val'   ORDER BY BINARY name ASC "&#41;;
          while&#40;list&#40;$id, $name&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;
               echo "<option value=\"$id\" >$name</option> \n" ;
          &#125;
     &#125; else if &#40;$data=='type'&#41; &#123;
          echo "<select name='type' onChange=\"dochange&#40;'duration', this.value&#41;\">\n";
          echo "<option value=''>Τύπος</option>\n";                         
          $result=mysql_db_query&#40;$dbname,"SELECT DISTINCT&#40;type&#41;, country FROM program WHERE  country= '$val'   GROUP BY type ORDER BY type ASC"&#41;;
          while&#40;list&#40;$name, $country&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;
			$_SESSION&#91;'country'&#93; = $country;		  
               echo "<option value=\"$name\" >$name</option> \n" ;
          &#125;
     &#125;  else if &#40;$data=='duration'&#41; &#123;
          echo "<select name='duration' >\n";
          echo "<option value=''>Δειάρκεια</option>\n";                               
          $result=mysql_db_query&#40;$dbname,"SELECT DISTINCT&#40;duration&#41; FROM program WHERE  type='$val' AND country='$country'  GROUP BY duration  ORDER BY duration ASC"&#41;;
		  while&#40;list&#40;$id&#41;=mysql_fetch_array&#40;$result&#41;&#41;&#123;
 
               echo "<option value=\"$id\" >$id</option> \n" ;
          &#125;
     &#125; 
     echo "</select>\n"; 
?>
Εδώ ξεκινάμε το αρχείο με το session_start(); για να λύσουμε το πρόβλημα που προανέφερα..

Μετά κάνουμε την σύνδεση με την βάση μας και ξεκινάμε τα queries...

το πρώτο μας δίνει τις ηπείρους.. αν επιλέξουμε την ήπειρο η ajax θα καλέσει το select των χωρών.. για αυτά τα 2, τα πράγματα είναι εύκολα γιατί τα έχω σε 2 διαφορετικά tables στην βάση μου έχοντας αντιστοιχίσει την κάθε χώρα με το id της ανάλογης ηπείρου..

Εδώ μπορείς να προσθέσεις άλλο ένα query ζητώντας και τις ανάλογες πόλεις κάθε χώρας (πρέπει να δημιουργηθεί άλλο ένα table στην βάση και το ανάλογο select στην φόρμα μας).. Μπορεί βέβαια να υπάρχει και η πόλη μέσα στο table program και να το καλείς όπως παρακάτω..

Στα επόμενα queries καλώ τον τύπο που αντιστοιχεί στην κάθε χώρα και δημιουργώ μία session για να την χρησιμοποιήσω στο επόμενο query: $_SESSION['country'] = $country;

Στο επόμενο query καλώ όλες τις διάρκειες που αντιστοιχούν στον τύπο που επιλέξαμε αλλά και στην χώρα ( WHERE type='$val' AND country='$country' )..

Όπως βλέπεις στα παραπάνω queries καλώ τα πεδία ως DISTINCT για να μην επαναλαμβάνει τις όμοιες εγγραφές στο select.. επίσης τις κάνω GROUP (π.χ. GROUP BY duration)..

Όποιος έχει γνώσεις μπορεί να βάλει όσα select θέλει...

Επισυνάπτω τα αρχεία που χρησιμοποιώ.. μέσα έχει και την δομή της βάσης..

Δεν πρέπει να ξεχνάμε την ασφάλεια των δεδομένων μας!!
Συνημμένα
trips.zip
αρχεια
(4.09 KiB) Μεταφορτώθηκε 275 φορές
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 22 Δεκ 2009 16:14

nbc έγραψε:zekia, φοβάμαι ότι δυσκολεύεις τη ζωή σου χωρίς λόγο.

Κατ' αρχάς, σου προτείνω να διώξεις το πεδίο της ηπείρου. Μπορείς να το κρατήσεις στον πίνακα, για την ομαδοποίηση των χωρών. Το σύστημα θα είναι πιο ευέλικτο αν δώσεις τη δυνατότητα στο χρήστη multi-selection από το πεδίο των χωρών. Μπορεί, για παράδειγμα, να επιλέξει "Γερμανία" και "Αριζόνα", κάτι που τώρα αποκλείεις. Στο ίδιο πεδίο, και εφόσον το επιθυμείς, μπορείς να βάλεις και τις ηπείρους οι οποίες θα είναι ευδιάκριτες και θα ξεχωρίζουν από τις χώρες με κάποιο indentation, bolding, κλπ. Έτσι, αν ο χρήστης επιλέξει ήπειρο αντί χώρας, θα είναι σαν να επιλέγει όλες τις χώρες της ηπείρου.

Αφού ο χρήστης κάνει και τις υπόλοιπες επιλογές του, πατάει το submit και το σύστημα του επιστρέφει το αποτέλεσμα με ένα και μόνο query.

Τώρα, εφόσον θέλεις να ταλαιπωρήσεις τον server και τον χρήστη, μπορείς κάλλιστα να μετατρέψεις το παραπάνω λειτουργικό σύστημα σε live query πολύ απλά, κάνοντας χρήση των onChange handlers των inputs ώστε να καλούν μια συνάρτηση η οποία - μέσω ajax - εκτελεί το action της φόρμας και να εμφανίζουν το αποτέλεσμα, real-time. Αυτή η λύση είναι τόσο καθαρή που μπορείς να την ελέγξεις με ένα απλό boolean flag (στην αρχή της συνάρτησης), χωρίς την παραμικρή επίπτωση/αλλαγή στον κώδικα, και την όλη λογική γενικότερα.

Συνεπώς, πρώτα το κάνεις να δουλεύει "στατικά" και απλά (KISS principle) και στη συνέχεια το εμπλουτίζεις. Έτσι διατηρείς και το πλεονέκτημα να έχεις ένα σύστημα που δουλεύει και με απενεργοποιημένη javascript. Με τον τρόπο που το σκέφτεσαι, αν δεν σου κάτσει, θα πάει χαμένος ο κώδικας και ο χρόνος σου.
Σε ευχαριστώ πολύ για τις προτάσεις σου nbc. Δυστυχώς έχει αποφασιστεί και συμφωνηθεί ο τρόπος λειτουργίας της φόρμας αυτής και δεν μπορώ να τον αλλάξω:) Το ajax θα το προσθέσω σίγουρα, ήθελα απλά σε πρώτη φάση να ξεκαθαρίσω τα ερωτήματα προς τη βάση.

Άβαταρ μέλους
zekia
Δημοσιεύσεις: 146
Εγγραφή: 04 Μάιος 2004 16:38
Τοποθεσία: thessaloniki

Τέσσερα δυναμικά select boxes συνδεδεμένα μεταξύ τους

Δημοσίευση από zekia » 22 Δεκ 2009 16:19

fafos,
καταρχάς σε ευχαριστώ πάρα πολύ για το χρόνο και τον κόπο σου. Σήμερα έριξα μια δεύτερη πιο ώριμη ματιά στον πρώτο κώδικά σου και τα πράγματα άρχισαν να γίνονται πιο ξεκάθαρα.
Τώρα που βλέπω και το νέο κομμάτι κώδικα που παρέθεσες, νομίζω πως θα τα καταφέρω ακόμα καλύτερα :)
Δώσε μου λίγο χρόνο να μελετήσω και αυτόν τον κώδικα και θα επιστρέψω. Ευχαριστώ και πάλι

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης