[ vojabgd @ 25.10.2009. 14:44 ] @
Pozdrav. Potrebna mi je pomoć oko jedne forme, neće da mi učita promenljivu. Treba da vrednost ad_location_city i ad_location_country stavim u bazu. Ukoliko korisnik ne promeni vrednosti ova 2 dropdowna, sve je u redu i obe vrednosti su u bazi.
Međutim, ako se promeni država pokreće se ajax funkcija load_cities_ad koja izbaci odgovarajuće gradove, ali kad pošaljem formu $_POST['ad_location_city'] mi je prazna, dok je $_POST['ad_location_country'] uvek u redu.

Evo koda:
create.php
Code:
<div id="ad_location_city_div">
          <select name="ad_location_city" id="ad_location_city" class="create_ad_input"> 
        <?php
        $uq=mysql_query("SELECT cw.*,u.country FROM countries_world AS cw,users AS u WHERE cw.id=u.country AND u.id='$userid'");
        $uf=mysql_fetch_array($uq);
        $country_id=$uf['id'];
        $q=mysql_query("SELECT * FROM cities_world WHERE pid='$country_id'");
        if(mysql_num_rows($q)>0) {
       while($f=mysql_fetch_array($q)) {
       
       echo '<option value="'.$f['id'].'">'.$f['name'].'</option>';
       
       }
      }
      
     else {
      
      echo '<option value="">City</option>';
      }
       ?>
      </select>
       </div>

     <select name="ad_location_country" id="ad_location_country" class="create_ad_input" [red]onchange="load_cities_ad(this.value,'ads')"[/red]>
     <?php
      $cq=mysql_query("SELECT * FROM countries_world ORDER BY name ASC");
 
      while($cf=mysql_fetch_array($cq)) {
       $uq=mysql_query("SELECT country FROM users WHERE id='$userid'");
       $uf=mysql_fetch_array($uq);
       if($ad_country!='') {
          if($cf['id']==$ad_country) {
           $selected=' selected="selected"';
          }
          else {
           $selected='';
          }
       }
       else {
        if($cf['id']==$uf['country']) {
         $selected=' selected="selected"';
        }
        else {
         $selected='';
        }
       
      }
     
      
       echo '<option value="'.$cf['id'].'"'.$selected.'>'.$cf['name'].'</option>';
   
      } 
      ?>
      </select>



ajax funkcija:
Code:

function load_cities_ad(country) {
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
  {
  alert ("Browser does not support HTTP Request");
  return;
  }
var url="http://www.wwiyo.com/ajax/load_cities_ad.php";
var checkpars="country="+country;
xmlhttp.open("POST",url,true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", checkpars.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4)
   {
   document.getElementById('ad_location_city_div').innerHTML=xmlhttp.responseText;
   }
 }
xmlhttp.send(checkpars);
}


ajax fajl:
Code:

   $country=$_POST['country'];
   $q=mysql_query("SELECT * FROM cities WHERE pid='$country' ORDER BY name ASC");
   echo '<select name="ad_location_city" id="ad_location_city">';

 if(mysql_num_rows($q)>0) {

   while($f=mysql_fetch_array($q)) {
 
    echo '<option value="'.$f['id'].'">'.$f['name'].'</option>';
    
    }
    
 }

 else {

  echo '<option value="">City</option>';
 }

 echo '</select>';



Izvinjavam se ako sam malo konfuzno objasnio u čemu je problem.
Hvala unapred!:)
[ Nikola Poša @ 25.10.2009. 16:12 ] @
Ne znam dal koristiš Firebug, al' bilo bi dobro da s njim proveriš šta output-uje taj ajax_handler. Meni se čini da je problem u ovom delu: while($f=mysql_fetch_array($q)). Ti podatke fetch-uješ kao niz sa numeričkim indeksima, a posle njegove članove pozivaš kao da je u pitanju asocijativni niz: $f['id'], $f['name']. Probaj da umesto mysql_fetch_array staviš mysql_fetch_assoc.
[ Nemanja Avramović @ 25.10.2009. 16:34 ] @
mysql_fetch_array() vraća niz i sa numeričkim i sa asocijativnim indeksima

edit: Po defaultu, ali drugim argumentom može da se promeni to ponašanje funkcije.
[ vojabgd @ 25.10.2009. 21:53 ] @
sa mysql_fetch_assoc mi nije vratio ništa, a sve je ostalo isto sa mysql_fetch_array kad sam upisao umesto $f['id'] $f['0'].
Nekako sam rešio problem. Pošto u javascript prepoznaje vrednosti, dodao sam <input type"hidden" name="city_id" id="city_id" value=""> i onda na submit dugme dodao onclick="document.getElementById('city_id').value=document.getElementById('ad_city_location').value".
I onda u php skripti pozovem $_POST['city_id'] i radi. :)))
[ kazil @ 25.10.2009. 22:20 ] @
A jesi probao da prilikom submit-a da var_dump()-ujes $_POST? Cisto da vidis sta je prosledjeno? (u verziji pre ovog JS dirty hack-a)
[ vojabgd @ 26.10.2009. 17:02 ] @
Sad sam var_dump()-ovao i ad_location_city uopšte nije prosleđeno. Mislim da je problem u tome što pri promeni države učitavam ceo dropdown sa gradovima ajax requestom u određeni div, pa ga verovatno ne pošalje kao deo forme. Ali ne može drukčije pošto IE ne podržava <select> innerHTML.
[ agvozden @ 26.10.2009. 17:32 ] @
Nije mi bas jasno ovo zadnje,ali ukoliko je problem samo do IE onda je problem resiv.
IE ne podrzava to direktno, ali postoje skripte koj to rade, a mozda je najbolje da iskoristis jQuery za tako nesto.
moraces da primis podatke, napravis element, u njega ubacis podatke i setujes vrednost koja ti je potrebna.

Pogledacu u svojoj zbirci imam li ovakve funkcije...
[ mitke013 @ 30.10.2009. 21:31 ] @
1.
Offtopic, ali moram da te upozorim:
Code:
   
$country=$_POST['country'];
$q=mysql_query("SELECT * FROM cities WHERE pid='$country' ORDER BY name ASC");


ti je sql injection ko vrata. Apsolutno nikad nemoj dozvoliti ovakve greske.

2.
Nikad ne koristi mesanje php-a i html-a. Da, znam da moze, ali gledaj da to izbegnes jer je kasnije mnogo lakse editovati html fajl posebno.

3.
Koristi smarty dok ne napravis svoj parser. Ja sam licno bio nezadovoljan i sam sam 'sklepao' meni upotrebljiviju klasu.

4.
Nikad se ne oslanjaj da ce polja u $_post zaista postojati. Najjednostavnija odbrana od pametnjakovica je npr. ovo:
Code:

if ( !isset($_POST['country'] ) {
   require_once('_nekiFajl.html') ;
} else {
   ....//logika programa
}


U ovom slucaju jednu istu skriptu mozes koristiti i kad korisnik prvi put dodje na stranicu (ispise mu se forma), i kad je vec popunio podatke. Ako je firebug-om nesto menjao, opet dobije formu.
</offtopic>

Voleo bih da ti pomognem, ali ja vec jako dugo koristim jquery za sve. Imao sam slican problem sa IE (jer mi sajt 100% radi pod ajax-om) i bilo je to sto nisam stavio method='post'. jquery je to na silu pokusavao da upise, ali nije pomagalo kod IE. Inace se svi elementi dinamicki kreiraju pa mi nije jasno zasto ti ne radi.
[ programer.master @ 01.11.2009. 22:29 ] @
>

Moraces ceo combo tj select sa svim option-s da napravis kao respond preko
ajaxa inace innerHTML u select nece u ie sto si i sam zakljucio..

--0016364d21a7180458047756ccd7
Content-Type: text/html; charset=ISO-8859-1

<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div class="h5">
Ne menjajte sledece dve linije ukoliko odgovarate putem emaila!<br>
esauth:379600:49b706f4891faa0cf285904595dc7417<br>
[ vojabgd @ 02.11.2009. 22:47 ] @
@mitke013
Hvala na savetima. Radim sa php-om tek godinu dana, tako da još nisam koristio smarty.

@programer.master
Kako to da uradim? Do sad sam uglavnom ovako ispisivao ajax response:
Code:

xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4)
   {
   document.getElementById(id).innerHTML=xmlhttp.responseText;
   }
 }
[ mitke013 @ 07.11.2009. 00:02 ] @
Moj ti je savet da u potpunosti batalis ajax na klasican nacin vec da koristis jQuery. Kad jednom savladas kako se koristi (par dana), veruj da vise nikad neces praviti sajtove na klasican nacin.

Dacu ti primer kako se preko ajax-a ubaci neki element koristeci jQuery:
Code:

<head>
$(document).ready(function(){  // ako ne znas sta znaci ovo, ostavi tako dok ne naucis sta su dom elementi i body onload event
  $('#test').load('demo.php');  // ovaj deo ce putem ajax-a da u donji div ispise rezultat koji vrati demo.php . '#test' je id elementa u koji zelis da upises rezultat
});  // ovo samo zatvara zagrade iz prvog reda. Cela logika je zapravo samo drugi red

</head>

<body>
<div id="test">
Bezveze tekst koji ce brzo biti prebrisan
</div>

a u demo.php stavis npr.
echo '<select>';
foreach($nekiArray as $key=>$value){
  echo '<option value="' . $key . '">'.$value.'</option>' ;
}
echo '</select>' ;

To je sve!

Naravno, php kod se ovako ne pise pravilno ali sam uprostio da bi kao pocetnik lakse shvatio. Veruj mi, kao profesionalnom programeru, izmisljanje tople vode te nece nigde dovesti. jQuery je genijalna stvar i sto ga pre naucis, bice ti mnogo lakse da napravis BILO sta. Ja sve moje programe pravim da rade preko ajax-a jer je bas, bas toliko jednostavno.

A da ne pricam o svim onim fancy efektima.

[ vatri @ 07.11.2009. 11:09 ] @
"...izmisljanje tople vode te nece nigde dovesti..."

da nije bilo izmisljanja tople vode, PHP-a ne bi ni bilo...
[ vojabgd @ 08.11.2009. 00:56 ] @
Dobro, nisam baš toliki početnik, znam šta je onload i dom elementi :))
Juče sam počeo sa jquery-jem, i baš je praktičan.

Odosmo sad u offtopic, ali zanima me kako bi pravilno ispisao npr ovaj kod što si stavio u demo.php.
Uglavnom pišem tako i sav se pogubim kad je neki malo duži kod.
[ mitke013 @ 08.11.2009. 01:41 ] @
Namerno sam skratio da bi shvatio lakse. Elem, osnovno je da ne mesas php i html, pa bi onaj kod izgledao npr. ovako:

Code:

// demo.php
// Recimo da korisniku treba da das listu svih kompanija; ovo je samo primer pa ti prepravi
$allCompanies = Companies::getAll() ;  // koristio sam klasu koja ce mi vratiti vrednosti u obliku array-a, gde je $key id kompanije, $value je ime. Tj. array(1=>'Telenor', 2=>'Telekom')..  itd
require('_demo.html') ;  // html fajl za prikaz. Ovo treba samo dizajneru, tj. tebi ako ga nemas. Ali osnovno je da to razdvojis

// fajl _demo.html

<select name="company">
<?php
  foreach($allCompanies as $companyID=>$companyName) {  ?>
   <option value="<?php echo $companyID;?>"><?php echo $companyName;?></option>
  <?php }   // ne moras koristiti } , vec mozes i kombinaciju  foreach(.... ):  i endforeach; Pogledaj sintaksu na netu    ?>
</select>


Ovaj kod ima jednu manu, a to je da ne mozes da odredis koja je unapred selektovana opcija. Da bi to resio, probaj ovo:
Code:

// demo.php
// dodaj pre require komande sledeci red:
$preselectedValue = 2 ;

// _demo.html

<select name="company">
<?php
  foreach($allCompanies as $companyID=>$companyName) { 
    $selected = $preselectedValue==$companyID ? 'selected="selected" : '' ; ?>
   <option <?php echo $selected;?>  value="<?php echo $companyID;?>"><?php echo $companyName;?></option>
  <?php }   // ne moras koristiti } , vec mozes i kombinaciju  foreach(.... ):  i endforeach; Pogledaj sintaksu na netu    ?>
</select>


Vidis razliku? U $preselectedValue stavis id kompanije za koju zelis da bude vec odabrana. Ternary operator (prouci obavezno) u redu $selected=..... ce dobiti html tag za selektovan element samo ako je $preselectedValue jednak $companyID vrednosti.

Ako si ukapirao, sad prelazim na brutalnosti :)

Zamisli da imas stranicu za koju zelis da kad korisnik prvi put dodje, ispise mu praznu formu. Kad upise podatke, ti uradis validaciju i ako nesto ne valja, ispises mu istu formu ali sa podacima koje je uneo, plus mu dodas i opis greske. Pogledaj ovo:

Code:

// demo.php

if (empty($_POST)){  // ako prvi put dodje na stranicu, $_POST je prazan (uglavnom, ali da ne komplikujem previse)
  require('_demo.html') ;  // zato mu samo prikazi praznu formu
} else {
$value = $_POST ;  // u suprotnom, korisnik je nesto uneo. Nas interesuje samo polje 'ime', a radicemo sa kopijom 
if (strlen($value['ime']) < 10) {  // ako je ime prekratko, 
$title['ime'] = 'Prekratko ime';  // u $title['ime'] dodaj opis greske
require('_demo.html') ;  // i ispisi mu razlog
} else {

// ovde je vec sve u redu
}

// demo.html
<form action="">
<input name="ime" 
value="<?php echo isset($value['ime']) ? $value['ime'] : 'Upisi ime';?>" 
title="<?php echo isset($title['ime']) ? $title['ime'] : '';?>" />
</form>


Objasnjenje: kad prvi put dodje, promenljiva $value['ime'] ne postoji pa ce ternary operator da ispise u tom polju 'Upisi ime'. To je default tekst. Kad korisnik upise nesto i uradi submit(dodaj negde to polje), zbog toga sto je action="" ucitace se ista stranica na kojoj si bio. Tada $_POST nije prazan i program ce preci na liniju 4 tj. $value = $_POST ; .

Ako je ime krace od 10 znakova, dodace se objasnjenje greske tj. $title['ime'] = 'Prekratko ime'; Opet se ucita html, ali se sad ispise tekst koji je korisnik uneo a title tog polja je opis greske. Valjda nije komplikovano previse?

I btw: kad koristis <input> elemente i zelis da ti php uradi ispis za value tog elementa, obavezno koristi komandu htmlentities.

Primer; ako uradis <input value="<?php echo $text;?>" /> a u toj promenljivoj postoji navodnik ili neki javascript, dolazis u problem. Probaj da u gornjem primeru to uradis. Nisam hteo da komplikujem kod, ali ako si ga savladao, prepravi liniju za value u :

value="<?php echo isset($value['ime']) ? htmlentities($value['ime'], ENT_QUOTES, 'utf-8') : 'Upisi ime';?>"

Red:
if (empty($_POST)){ // ako prvi put dodje na stranicu, $_POST je prazan (uglavnom, ali da ne komplikujem previse)

ti uglavnom nece praviti problem. Ali ako ocekujes posetu problematicnih likova, probaj sledece:
Code:

if ( ! isset($_POST['ime'] or ! isset($_POST['prezime'] ) {


Na ovaj nacin si siguran da cak iako je nekom menjao imena <input> elemenata, nista nece uraditi. Nadam se da sam pomogao.

[ vojabgd @ 09.11.2009. 16:04 ] @
Skapirao sam sve, hvala puno.