Problema cu Null in Drop Down List - Ajax

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
Eddy90
Mesaje: 2

Problema cu Null in Drop Down List - Ajax

Salut... de cateva zile ma tot zbat sa rezolv o problema si nu ii dau de cap in nici un fel... am luat modelul de pe acest site de la selectia multipla cu php mysql si ajax... https://marplo.net/ajax/multiple-sel ... -ajax.html

Cod: Selectaţi tot

Problema este in felul urmator... sa zicem ca am in baza de date aceste date
| ID  |  Marca  |  Motorizare  |  Capacitate_cilindrica  |  Rezultat  |
 ---------------------------------------------------------------------------------------
| 1   | Dacia     | benzina       |  1.4 litri                       |  <link1>    |
| 2   | Dacia     | benzina       |  1.6 litri                       |  <link2>    |
| 3   | Dacia     | diesel          | /* NULL  */                   |  <link3>    |
| 4   | Dacia     | diesel          |  /*null    */                   |  <link4>    |
| 5   | BMW      | /*null*/        |  2.2 litri                       |  <link5>    |
| 6   | BMW      |  /*null*/       |  2.5 litri                       |  <link6>    |
| etc| etc        |................................................................. |
cum as putea sa fac sa sar peste selecturile in care nu am nici o inregistrare...de ex: daca selectez DACIA... apoi DIESEL...sa imi afiseze link3 si 4... sau ...daca selectez BMW urmatorul select sa fie la capacitatea cilindrica...adika sa sara peste selecturile in care nu este nici o valoare de selectat... sper ca ati inteles problema pe care o am si va rog din tot sufletul sa ma ajutati pentru ca nu mai stiu ce sa ii mai fac...
...va multumesc mult tuturor.

MarPlo Mesaje: 4343
Salut
Incearca sa inlocuiesti in "select_list.php", randurile:

Cod: Selectaţi tot

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

Cod: Selectaţi tot

// defineste sirul cu conditia WHERE, apoi instructiunea SELECT
$where = isset($ar_where) ? implode($ar_where, ' AND '). ' AND ' : '';
$sql = "SELECT DISTINCT `$col` FROM `$table` WHERE ".$where.' `'.$col.'` IS NOT NULL AND `'.$col.'` <>""';
Dar asta va rezolva doar intr-un fel diferit problema, in sensul ca va exclude randurile cu NULL, dar nu va trece la coloana urmatoare.
Acest script nu poate sa sara peste NULL la urmatoarea coloana, findca nu stie de ea, ci doar de cele anterioare selectate (pastrate in Sesiune) si cea curenta din lista Select.
Fiecare coloana reprezinta datele (optiunile) pt. o anumita lista <select>, nu poate adauga optiunea din coloana cu datele listei 3 in <select>-ul 2.

Eddy90 Mesaje: 2
am mai incercat sa modific intre linia 38 si 41.... din select_list.php ...daca as reusi sa validez aici cred ca va merge sa trec mai departe...dar nici aici nu imi iasa...practic...verifica daca e null...si trece mai departe pana la cod
DE AICI INCEPE RANDUL 38

Cod: Selectaţi tot

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

// verifica daca urmatoarea coloana prezinta doar elemente nule, pentru a o exclude din optiuni
$valid=TRUE;
$i=1;
while($valid & isset($wval) & ($key+$i)<$last_key){
    $check=FALSE;
    $qry="SELECT ".$ar_cols[$key+$i]." FROM ".$table." WHERE ".$wcol."=".$wval;
    $cres = $conn->query($qry);
    $allf=$cres->fetch_all();
    foreach($allf as $val){
        if(!is_null($val)){
            $check = TRUE;
            break;
        }
    }
    if($check){
        $valid=FALSE;
        $next_col=$ar_cols[$key+$i];
    }
    else{
        $i++;
    }
    
}
if(!isset($wval)) $next_col=$ar_cols[$key+1];

// 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>';
  echo "<br />";
  
  while($row = $result->fetch_assoc()) {
    /*$valid=TRUE;
    //verifica daca is nule/nenule inregistrarile din $row
    $result2=$conn->query("SELECT * FROM ".$table." WHERE ".$col."='".$row[$col]."'");
    //echo $conn->error;
    $check=TRUE;
    $check2=FALSE;
    $ar_lim=array_search($col, $ar_cols);
    while($row2=$result2->fetch_row()){
        $check=TRUE;
        for($i=$ar_lim+1; $i<count($row2); $i++){
            if($row2[$i]=='' | $row2[$i]==NULL){
                $check=FALSE;
                break;
            }
        }
        if($check==TRUE) {
            $check2=TRUE;
            break;
        }
    }
    if($check2==FALSE) {echo "banana"; $valid=FALSE;}
    */
    // 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'; } 

MarPlo Mesaje: 4343
Mai mult decat modificarea prezentata in raspunsul anterior, care exclude inregistrarile cu Null nu stiu cum sa fac.
Scriptul functioneaza bine asa cum e.
Pt. ceea ce vrei, probabil trebuie sa faci tu un script de la zero, cu o abordare strict la ce vrei sa obtii, ca sa nu te incurci in logica acestuia, care e facut pt. cazuri generale, simple.

Subiecte similare