online: 3; azi: 797; total: 51252 Webdesign - Ajax - 10

Multiple Select Drop down List cu AJAX

In acest tutorial e prezentat un script AJAX care poate fi folosit la crearea dinamica a mai multor liste Select cu optiuni (denumite si "Drop down list") cu date dintr-un tabel MySQL, in functie de optiunea aleasa.

La inceput e afisata o singura lista select, cand utilizatorul selecteaza o optiune, se apeleaza o functie Ajax care acceseaza un fisier PHP ce va returna o lista Select in functie de optiunea aleasa. Functia Ajax primeste raspunsul si afiseaza a doua lista Select.
Cand utilizatorul selecteaza o optiune din a doua lista, acest script poate afisa o a treia lista "Drop down" cu optiuni, in functie de optiunile alese in prima si a doua lista Select.

Scriptul contine doua fisiere: un fisier PHP (denumit "select_list.php") cu codul pt. selectarea datelor din tabelul MySQL si retrnarea codului HTML cu lista Select, si un fisier JS (denumit "ajax_select.js") cu functia Ajax care acceseaza fisierul PHP.
Puteti copia si folosi codurile pt. aceste fisiere prezentate mai jos, sau descarcati-le de la link-ul: Script Multiple Select Drop down List.

Codul pentru select_list.php

<?php
// Liste select multiple - www.discant.ro/ajax/
if(!isset($_SESSION)) session_start();

// Aici adaugati datele dv. pt. conectare la baza de date MySQL
$server = 'localhost';
$user = 'utilizator';
$pass = 'parola';
$dbase = 'bazadate';

// Aici adaugati numele tabelului, apoi coloanele pt. lista select, in ordinea lor
// Adaugati null in loc de 'col_descriere', daca nu vreti sa fie afisate si datele din ea
$table = 'nume_tabel';
$ar_cols = array('col_select1', 'col_select2', 'col_select3', 'col_descriere');

$preid = 'slo_';        // un prefix folosit la ID-ul elementelor in care Ajax va adauga <select>
$col = $ar_cols[0];     // variabila in care e retinuta coloana ce trebuie selectata
$re_html = '';          // va retine codul html returnat de script

// daca sunt date primite prin POST, cu index 'col' si 'wval'
if(isset($_POST['col']) && isset($_POST['wval'])) {
  // seteaza $col ce trebuie selectat si valoarea pt WHERE (sterge tag-uri si spatii exterioare din $_POST)
  $col = trim(strip_tags($_POST['col']));
  $wval = "'".trim(strip_tags($_POST['wval']))."'";
}

$key = array_search($col, $ar_cols);            // obtine index-ul asociat cu valoarea lui $col din $ar_cols
$wcol = $key===0 ? $col : $ar_cols[$key-1];     // obtine coloana pt conditia WHERE
$_SESSION['ar_cols'][$wcol] = isset($wval) ? $wval : $wcol;    // retine in SESSION coloana si valoarea ei pt WHERE
  
// obtine urmatorul element din $ar_cols (folosit la functia onchange() din tag-ul <select>)
$last_key = count($ar_cols)-1;
$next_col = $key<$last_key ? $ar_cols[$key+1] : '';

$conn = new mysqli($server, $user, $pass, $dbase);     // conectare la baza de date MySQL

if (mysqli_connect_errno()) { exit('Connect failed: '. mysqli_connect_error()); }     // verificare conexiune

// setare array cu datele conditiei WHERE (coloana=valoare) pt. instructiunea SELECT
for($i=1; $i<=$key; $i++) {
  $ar_where[] = '`'.$ar_cols[$i-1].'`='.$_SESSION['ar_cols'][$ar_cols[$i-1]];
}

// defineste sirul cu conditia WHERE, apoi instructiunea SELECT
$where = isset($ar_where) ? ' WHERE '. implode($ar_where, ' AND ') : '';
$sql = "SELECT DISTINCT `$col` FROM `$table`".$where;

$result = $conn->query($sql);       // trimite comanda la serverul MySQL

// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // seteaza evenimentul "onchange" care se adauga in <select>
  $onchg = $next_col!==null ? " onchange=\"ajaxReq('$next_col', this.value);\"" : '';

  // seteaza tag-ul pt lista select, daca nu e ultima coloana
  if($col!=$ar_cols[$last_key]) $re_html = $col. ': <select name="'. $col. '"'. $onchg. '><option>- - -</option>';

  while($row = $result->fetch_assoc()) {
    // daca e ultima coloana, returneaza datele din ea, altfel le adauga in tag-uri OPTION
    if($col==$ar_cols[$last_key]) $re_html .= '<br/>'. $row[$col];
    else $re_html .= '<option value="'. $row[$col]. '">'. $row[$col]. '</option>';
  }

  if($col!=$ar_cols[$last_key]) $re_html .= '</select> ';        // inchide lista Select
}
else { $re_html = '0 rezultate'; }

$conn->close();

// daca coloana selectata, $col, e primul element in $ar_cols
if($col==$ar_cols[0]) {
  // adauga tag-uri SPAN (sau DIV la ultimul element) unde Ajax va adauga listele <select>
  // cu ID in fiecare SPAN, cu numele coloanelor adaugate in $ar_cols
  for($i=1; $i<count($ar_cols); $i++) {
    if($ar_cols[$i]===null) continue;
    if($i==$last_key) $re_html .= '<div id="'. $preid.$ar_cols[$i]. '"> </div>';
    else $re_html .= '<span id="'. $preid.$ar_cols[$i]. '"> </span>';
  }

  // adauga coloanele in JS (folosite in removeLists() ca sa stearga listele select afisate, cand se alege alta optiune)
  $re_html .= '<script type="text/javascript">var ar_cols = '.json_encode($ar_cols).'; var preid = "'. $preid. '";</script>';
}
else echo $re_html;
?>

Codul pentru ajax_select.js

// Liste select Multiple - www.discant.ro/ajax/

// functie utilizata la stergerea urmatoarelor liste deja afisate, cand se alege alta optiune
function removeLists(colid) {
  var z = 0;
  // sterge datele din elementele cu id-ul stocat in variabila "ar_cols"
  // incepand cu elementul al carui ID e in colid
  for(var i=1; i<ar_cols.length; i++) {
    if(ar_cols[i]==null) continue;
    if(ar_cols[i]==colid) z = 1;
    if(z==1) document.getElementById(preid+ar_cols[i]).innerHTML = '';
  }
}

// crere obiect XMLHttpRequest, in functie de browser
function get_XmlHttp() {
  // variabila ce va contine instanta de obiect XMLHttpRequest (initial cu valoare null)
  var xmlHttp = null;

  if(window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); }     // pt Firefox, IE7+, Opera, Safari
  else if(window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }      // IE5 or 6

  return xmlHttp;
}

// trimite date la un script php, prin POST, si afiseaza raspunsul primit
function ajaxReq(col, wval) {
  removeLists(col);           // sterge listele select deja afisate

  // daca valoarea lui wval nu e '- - -' sau '' (primul <option>)
  if(wval!='- - -' && wval!='') {
    var request =  get_XmlHttp();		      // apeleaza functia pt. obiectul XMLHttpRequest
    var php_file = 'select_list.php';     // calea si numele fisierului php

    // creare perechi index=valoare cu datele ce vor fi trimise la server
    var  data_send = 'col='+col+'&wval='+wval;

    request.open("POST", php_file, true);			// seteaza cererea Ajax

    document.getElementById(preid+col).innerHTML = 'Incarcare...';   // notificare de incarcare

    // adauga header care sa transmita script-ului PHP sa recunoasca datele ca fiind transmise prin POST
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send(data_send);	      	// apeleaza metoda send() cu data_send

    // Verifica starea cererii
    // Daca raspunsul e primit complet, il adauga in tag-ul cu id-ul din "col"
    request.onreadystatechange = function() {
      if (request.readyState==4) {
        document.getElementById(preid+col).innerHTML = request.responseText;
      }
    }
  }
}

Utilizare Script Multiple Select Drop down List

1) Creati fisierele: "select_list.php" si "ajax_select.js" pe server (avand codul prezentat mai sus pt. fiecare), ambele in acelasi director.
In script-ul PHP adaugati datele dv. pentru conectare la baza de date MySQL, numele tabelului (in $table) si numele coloanelor unde sunt datele pt. fiecare lista Select (in array-ul $ar_cols).

- De exemplu, daca aveti un tabel numit "orase", si vreti sa creati un select triplu, cu datele din trei coloane (cate una pt. fiecare <select>): "regiune", "oras", si "sate"; apoi sa fie afisata o descriere, stocata in alta coloana "datesat", despre fiecare sat ales, schimbati valorile din variabilele $table si $ar_cols astfel:
// Aici adaugati numele tabelului, apoi coloanele pt. lista select, in ordinea lor
$table = 'orase';
$ar_cols = array('regiune', 'oras', 'sate', 'datesat');
Daca vreti sa fie afisate doar cele trei liste select (regiune, oras, sat), sau nu aveti si o coloana pt. descriere, adaugati null pt. ultimul element (aici in loc de 'datesat').

- Daca vreti sa creati doua liste select "drop down", si apoi o descriere la optiunea aleasa din al doilea select, adaugati asa:
// Aici adaugati numele tabelului, apoi coloanele pt. lista select, in ordinea lor
$table = 'nume_tabel';
$ar_cols = array('col_select1', 'col_select2', 'col_descriere');
Daca vreti sa afisati doar listele Select cu optiunile stocate in "col_select1" si "col_select2", inlocuiti 'col_descriere' cu null.

2) In pagina unde vor fi afisate listele select cu Ajax:
- Trebuie sa includeti fisierul "select_list.php" la inceputul paginii, cu urmatoarea instructiune, inaintea codului HTML sau a altor date de iesire (aceasta deoarece foloseste session_start()):
<?php include 'select_list.php'; ?>

- Includeti si fisierul "ajax_select.js" in sectiunea HEAD a codului HTML, cu urmatorul cod:
<script src="ajax_select.js" type="text/javascript"></script>

- Apoi, in formular unde vreti sa fie afisate listele Select, adaugati:
Select: <?php echo $re_html; ?>
Dupa cum puteti vedea in exemplu de mai jos, sau in fisierul "test.php" (din arhiva ce poate fi descarcata la link-ul de mai sus).

• Scriptul PHP creaza primul <select> cu optiunile din prima coloana adaugata in $ar_cols, apoi creaza tag-uri HTML unde Ajax va adauga urmatoarele liste Select. Aceste tag-uri HTML au un ID unic, compus din sirul adaugat in variabila $preid si numele coloanelor. Variabila $preid e folosita ca sa fie mai sigur ca nu exista un alt element cu acelasi ID in pagina.
- Numele de variabile si ID folosite in script-ul PHP si in functiile JavaScript sunt legate intre ele, daca modificati ceva in instructiunile lor, fara sa stiti sigur ce face, e posibil sa nu mai functioneze.

Exemplu Triplu Select drop down

Iata un exemplu concret. In MySQL avem un tabel denumit "sites" cu aceste coloane: id, site, menu, categ, links: avand urmatoarele randuri inregistrate:
idsitemenucateglinks
1discant.roCursuriAjaxwww.discant.ro/ajax/obiectul_xmlhttprequest.html
2discant.roCursuriAjaxwww.discant.ro/ajax/ajax_get_php.html
3discant.roCursuriAjaxwww.discant.ro/ajax/tutoriale_ajax_json.html
4discant.roCursuriJavaScriptwww.discant.ro/javascript/sintaxajs.html
5discant.roCursuriJavaScriptwww.discant.ro/javascript/notiuni_de_baza.html
6discant.roCursuriJavaScriptwww.discant.ro/javascript/getelementbyid.html
7discant.roCursuriEnglishwww.discant.ro/engleza/gramatica
8discant.roCursuriEnglishwww.discant.ro/engleza/exercitii
9discant.roCursuriEnglishwww.discant.ro/engleza/download_carti-programe-audio
10discant.roAnimeAspecte de viatawww.discant.ro/anime/h2o_footprints_sand-a
11discant.roAnimeAspecte de viatawww.discant.ro/anime/chobits-a
12discant.roAnimeAspecte de viatawww.discant.ro/anime/hayate_no_gotoku-a
13discant.roAnimeComediewww.discant.ro/anime/angel_tales-a
14discant.roAnimeComediewww.discant.ro/anime/my_bride_is_a_mermaid-a
15discant.roAnimeComediewww.discant.ro/anime/nodame_cantabile-a
16discant.roAnimeRomanticwww.discant.ro/anime/clannad-a
17discant.roAnimeRomanticwww.discant.ro/anime/bokura_ga_ita-a
18discant.roAnimeRomanticwww.discant.ro/anime/peach_girl-a
19discant.roGamesAventura-Misterewww.discant.ro/jocuri/misson_to_mars-j
20discant.roGamesAventura-Misterewww.discant.ro/jocuri/prince_of_persia-j
21discant.roGamesAventura-Misterewww.discant.ro/jocuri/river_rapid_rampage-j
22discant.roGamesLogica si Intuitiewww.discant.ro/jocuri/bloxorz-j
23discant.roGamesLogica si Intuitiewww.discant.ro/jocuri/flash_chess_3-j
24discant.roGamesLogica si Intuitiewww.discant.ro/jocuri/red_remover-j
25discant.roPHP-MySQLLectiiwww.discant.ro/php-mysql/writing-php-scripts
26discant.roPHP-MySQLLectiiwww.discant.ro/php-mysql/arrays
27discant.roPHP-MySQLLectiiwww.discant.ro/php-mysql/php-mysql-using-mysqli
28discant.roPHP-MySQLTutorialewww.discant.ro/php-mysql/file_put_contents-file_get_contents-readfile-file_t
29discant.roPHP-MySQLTutorialewww.discant.ro/php-mysql/uploading-multiple-files_t
30discant.roPHP-MySQLTutorialewww.discant.ro/php-mysql/count-number-downloads-accesses_t
31discant.roJavaScriptLectiiwww.discant.ro/javascript/variables-operators
32discant.roJavaScriptLectiiwww.discant.ro/javascript/document-object-dom
33discant.roJavaScriptLectiiwww.discant.ro/javascript/javascript-code-php
34discant.roJavaScriptTutorialewww.discant.ro/javascript/align-make-same-height_t
35discant.roJavaScriptTutorialewww.discant.ro/javascript/check-file-type-before-upload_t
36discant.roJavaScriptTutorialewww.discant.ro/javascript/display-simulate-loading-progress-bar_t
37discant.roJavaScriptjQuerywww.discant.ro/jquery/jquery-basics
38discant.roJavaScriptjQuerywww.discant.ro/jquery/animating-css-properties
39discant.roJavaScriptjQuerywww.discant.ro/jquery/drag-drop
40discant.roFlash-AS3Flash Lectiiwww.discant.ro/flash/simple-flash-animation-save-export
41discant.roFlash-AS3Flash Lectiiwww.discant.ro/flash/deco-tool
42discant.roFlash-AS3Flash Lectiiwww.discant.ro/flash/motion-tween-flash-animation
43discant.roFlash-AS3ActionScript Lectiiwww.discant.ro/actionscript/introduction-actionscript-3
44discant.roFlash-AS3ActionScript Lectiiwww.discant.ro/actionscript/simple-script-actionscript
45discant.roFlash-AS3ActionScript Lectiiwww.discant.ro/actionscript/oop-object-oriented-programming
46discant.roFlash-AS3Tutorialewww.discant.ro/flash/xml-actionscript-php-script_t
47discant.roFlash-AS3Tutorialewww.discant.ro/flash/access-objects-different-timeline_t
48discant.roFlash-AS3Tutorialewww.discant.ro/flash/actionscript-change-movieclip-color_t

Creem trei liste select cu optiuni salvate in coloanele: "site", "menu", si "categ", apoi afisam datele din coloana "links", in functie de optiunea selectata in ultima lista (categ).
In fisierul "select_list.php" setam urmatorul cod:
// Aici adaugati numele tabelului, apoi coloanele pt. lista select, in ordinea lor
// Adaugati null in loc de 'links', daca nu vreti sa fie afisate si datele din ea
$table = 'sites';
$ar_cols = array('site', 'menu', 'categ', 'links');

Pagina web in care vor fi afisate listele Select are urmatorul:
<?php include 'select_list.php'; ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Triplu Select Dropdown list cu Ajax</title>
<script src="ajax_select.js" type="text/javascript"></script>
</head>
<body>

<form action="" method="post";>
Select: <?php echo $re_html; ?>
</form>

</body>
</html>

- Iata rezultatul:
Select sites:

Exemplu Dublu Select Drop down list

Acum vom crea doua liste select drop down, cu optiunile din coloanele "site", si "menu" (din acelasi tabel prezentat mai sus).
Trebuie doar sa modificam variabila $ar_cols (in "select_list.php"), adaugand elementele 'site', 'menu', si null :
// Aici adaugati numele tabelului, apoi coloanele pt. lista select, in ordinea lor
$table = 'sites';
$ar_cols = array('site', 'menu', null);

- In aceeasi pagina web creata in exemplu precedent va rezulta:
Select sites: