ugrás a tartalomhoz

Radio Button VS Form

Creative · 2010. Ápr. 9. (P), 22.42
Üdv

Már két hasonló témában írtam ide, most egy másik projektben akadtam falba. Kutakodtam idefönn, de csak selectes témákba futottam sorra, ami hasonló témával foglalkozott. Tehát... adva vagyon egy msyql /mi más? :)/ adattábla, amiből lekérdezek és While-al szépen táblázatba rendezve kiírom őket. Minden rekordhoz tartozik egy allowed nevű cella, melynek értéke N vagy Y. A lekérdezésben szerepel 2db radio button is, melyek értéke a cellában lévő két értékkel azonos.
A kérdésem az lenne,hogy tudom megadni neki normálisan és egyszerűen, hogy a cellában lévő értékkel megfelelő radio button legyen checked kiíráskor?

Ez maga az érintett rész a listázás kis magántáblázatában:
  1. <form name="adm-gform" method="post" action="">  
  2.  <span class="Y">  
  3.   <input type="radio" value="Y" id="allowed" name="allowed" '.$checked1.'> Igen</span>  
  4.  <span class="N">  
  5.   <input type="radio" value="N" id="allowed" name="allowed" '.$checked2.'> Nem</span>  
  6. </form>  
Ez pedig a lekérdezés, ami nem igazán akar összejönni (a ... helyén van a while rész, kiszedtem, nehogy valakit beavarjon):
  1. $sql = "SELECT * FROM $tbl_name ORDER by ID";        
  2. $result = mysql_query($sql);  
  3. $sor = mysql_fetch_array($result);  
  4. $allapot = $sor[5];  
  5. ...  
  6.  $checked1 = '';  
  7.  $checked2 = '';  
  8.  if ($allapot == 'Y') { $checked1 = 'checked'; }  
  9.  if ($allapot == 'N') { $checked2 = 'checked'; }  
Az a bajom, hogy így minden egyes sorban a Y érték lessz bejelölve. Valaki már csinált ilyet, vagy futott bele hasonló gondba?

C.
 
1

Mindig a ciklus a hibás

abesto · 2010. Ápr. 10. (Szo), 00.14
Ha tényleg a ... helyén van a while, akkor ránézésre az lehet a gond, hogy nem a ciklusmagban veszed ki a lekérdezés eredményhalmazából a $sor, és így a $allapot változó értékét. Így mindig az első sorban szereplő adattal dolgozol.
3

Részigazság

Creative · 2010. Ápr. 10. (Szo), 10.02
Részigazség, amit írtál. Tudom hogy szabálytalan és logikátlan cikluson kívül kiszedni már az infót, de mivel cikluson belül nem tudtam megoldani, azért gondoltam már erre. Ciklusmagon belül hagyva a lényeget, fura mód csak a páratlan id-vel ellátott rekordokat listázza ki.
Itt az eredeti kódrészlet, a teljesség igénye nélkül:
  1. $sql = "SELECT * FROM $tbl_name  
  2.         ORDER by ID";        
  3. $result = mysql_query($sql);  
  4. while($rows = mysql_fetch_array($result)) {   
  5.  $sor = mysql_fetch_array($result);  
  6.  $allapot = $sor[5];  
  7.  $checked1 = '';  
  8.  $checked2 = '';  
  9.  if ($allapot == 'Y') { $checked1 = 'checked'; }  
  10.  if ($allapot == 'N') { $checked2 = 'checked'; }  
  11.   
  12.  echo  
  13.  '<div id="gbook">  
  14.   <table>  
  15.   <tr><td></td><td>Közzétéve? / '.$rows['allowed'].' || Új érték:   
  16.    <form name="adm-gform" method="post" action=""><span class="Y">  
  17.    <input type="radio" value="Y" id="allowed" name="allowed" '.$checked1.'> Igen</span>  
  18.    <span class="N">  
  19.    <input type="radio" value="N" id="allowed" name="allowed" '.$checked2.'> Nem</span>  
  20.    <input type=submit value=Submit>  
  21.    </form>  
  22.   </td></tr>  
  23.   </table>  
  24.  </div>  
  25.  ';}  
  26. mysql_close();  
4

dupla fetch

N0r3i · 2010. Ápr. 10. (Szo), 10.13
Szia!

Azért hagy ki minden második sort, mert kétszer van a ciklusban mysql_fetch_array() hívás. A másodikat töröld, és használd a While-ban kapott $rows-t, vagy nevezd át $sor-ra!

Üdv: Norbi
5

Azt hiszem megvan

Creative · 2010. Ápr. 10. (Szo), 10.26
Úgy gondolom, rájöttem, hogy lehet megoldani. Eredményesnek tűnik eddig. Mindkét radio button checked értékének más változónevet adtam, s a ciklusmagban mindkettőt megfeleltettem. Így úgy fest, hogy habár randa mint a bűn, de működik :) Nem lehet valahogy szebben megírni ezt?
  1. $sql = "SELECT * FROM $tbl_name  
  2.         ORDER by ID";        
  3. $result = mysql_query($sql);  
  4. while($rows = mysql_fetch_array($result)) {  
  5. $checked_n = 'N';  
  6. $checked_y = 'Y';  
  7. if ($rows['allowed'] == 'N') {$checked_n = 'checked';}  
  8.  else {$checked_n = '';}  
  9. if ($rows['allowed'] == 'Y') {$checked_y = 'checked';}  
  10.  else {$checked_y = '';}  
  11.  echo  
  12.  '<div id="gbook">  
  13.   <tr><td></td><td>Közzétéve? / '.$rows['allowed'].' || Új érték:   
  14.   <form name="adm-gform" method="post" action="">  
  15.   <span class="Y">  
  16.   <input type="radio" value="Y" id="allowed" name="allowed" '.$checked_y.'> Igen  
  17.   </span>  
  18.   <span class="N">  
  19.   <input type="radio" value="N" id="allowed" name="allowed" '.$checked_n.'> Nem  
  20.   </span>  
  21. ...  
  22.   </div>  
  23.  ';}  
C.
2

While

Poetro · 2010. Ápr. 10. (Szo), 00.16
Nem tudom miért vetted ki a while-t hiszen pont az, ami bekavar.
  1. $sql = "SELECT * FROM $tbl_name ORDER by ID";          
  2. $result = mysql_query($sql);  
  3. while ($sor = mysql_fetch_array($result)) {  
  4.   $allapot = $sor[5];  
  5.   $checked1 = $allapot == 'Y' ? 'checked' : '';  
  6.   $checked2 = $allapot == 'N' ? 'checked' : '';  
  7.   // ...  
  8. }  
6

Kis update

Creative · 2010. Ápr. 13. (K), 13.04
Nos, mivel ehhez kapcsolódik a kérdés, nem akartam új témát nyitni hozzá. Adott a már említett kódrészlet a két radio buttonnal, minimális kódbeli változtatással.
  1. <input type="radio" value="Y" name="allowed[]" onclick="submit();" '.$checked_y.'> Igen  
  2. <input type="radio" value="N" name="allowed[]" onclick="submit();" '.$checked_n.'>Nem  
  3. <input type="hidden" name="ID" value="'.$azonosito.'">  
Mint látható, azt akarom megoldani, hogy klikkre az adott érték kerül elküldésre, s ennek fejében lefut egy update függvény. Melyre pediglen ezt a kis kódot írtam össze:
  1. if (isset($_POST['submit'])) {  
  2.  $allapot = '';  
  3.  if ($_POST['allowed[]'] == 'N') {  
  4.   $allapot = 'N';  
  5.   $update = 'UPDATE shoutbox set ALLOWED = '.$allapot.'  
  6.   where ID = '.$_POST['ID'].' limit 1';  
  7.   $result = mysql_query($update);  
  8.  }  
  9.  if ($_POST['allowed[]'] == 'Y') {  
  10.   $allapot = 'Y';  
  11.   $update = 'UPDATE shoutbox set ALLOWED = '.$allapot.'  
  12.   where ID = '.$_POST['ID'].' limit 1';  
  13.   $result = mysql_query($update);  
  14.  }  
  15. }  
A submit megtörténik klikkor, viszont az update függvény nem fut le. Nem vagyok biztos a gondban, de lehet a két értéket nem úgy kéne kezelnem, ahogy azt teszem?

C.
7

$_POST és a tömbök

Poetro · 2010. Ápr. 13. (K), 13.28
$_POST['allowed[]'] helyett $_POST['allowed'] tömb értékei. Nem tudom, mennyi értéke van, mindenesetre a $_POST['allowed'] egy tömb lesz, azért annak kell kivenni az elemeit, mondjuk $_POST['allowed'][0] vagy végigmehetsz rajta foreach-csel.
8

tömbök

Creative · 2010. Ápr. 13. (K), 15.36
Tehát akkor a fenti kódhoz igazodva duván ez lenne a jó megoldás? Most ForEach nélkül gondolkozom, nem akarom agyonbonyolítani ha nem szükséges.
  1. if (isset($_POST['submit'])) {  
  2.  $allapot_tb = Array('Y','N');  
  3.  if ($_POST['allowed'] == $allapot_tb[0]) {  
  4.   $command = 'UPDATE shoutbox set ALLOWED = Y where ID = '.$_POST['ID'].' limit 1';    
  5.   $result = mysql_query($command);  
  6.  }  
  7.  if ($_POST['allowed'] == $allapot_tb[1]) {  
  8.   $command = 'UPDATE shoutbox set ALLOWED = N where ID = '.$_POST['ID'].' limit 1';    
  9.   $result = mysql_query($command);  
  10.  }   
  11. }   
C.
9

Markup

Poetro · 2010. Ápr. 14. (Sze), 01.40
A fentihez viszont meg kellene változtanod a HTML-t.
  1. <input type="radio" value="Y" name="allowed" onclick="submit();" '.$checked_y.'> Igen    
  2. <input type="radio" value="N" name="allowed" onclick="submit();" '.$checked_n.'>Nem    
És semmiképpen se használd a $_POST['ID'] értéket mindenféle előszűrés vagy feldolgozás nélkül, mivel nem tudhatod, mi jön benne. Ezért vagy számmá kellene előbb alakítani intval-lal, ha számot várunk, vagy megfelelően escapelni, például mysql_real_escape_string-gel.
10

Update

Creative · 2010. Ápr. 14. (Sze), 11.00
Értem. Egy sima intval és trim kombó akkor gondolom elegendő is lenne hozzá. Feltételezve, hogy jó az, amit fentebb írtam, kipróbálom élesben :)

Frissítés:

Igen, működött, köszönöm Poetro :)
Azért íme az általam használt kód:
  1. if (isset($_POST['allowed'])) {  
  2.  $id = trim($_POST['ID']);  
  3.  $azon = intval($id);  
  4.  $allapot_tb = Array('Y','N');  
  5.  if ($_POST['allowed'] == $allapot_tb[0]) {  
  6.   $command = 'UPDATE '.$tbl_name.' SET allowed="Y" WHERE id='.$azon.' limit 1';    
  7.   $result = mysql_query($command);  
  8.  }  
  9.  if ($_POST['allowed'] == $allapot_tb[1]) {  
  10.   $command2 = 'UPDATE '.$tbl_name.' SET allowed="N" WHERE id='.$azon.' limit 1';    
  11.   $result = mysql_query($command2);  
  12.  }  
  13. }