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:

<form name="adm-gform" method="post" action="">
 <span class="Y">
  <input type="radio" value="Y" id="allowed" name="allowed" '.$checked1.'> Igen</span>
 <span class="N">
  <input type="radio" value="N" id="allowed" name="allowed" '.$checked2.'> Nem</span>
</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):

$sql = "SELECT * FROM $tbl_name ORDER by ID";      
$result = mysql_query($sql);
$sor = mysql_fetch_array($result);
$allapot = $sor[5];
...
 $checked1 = '';
 $checked2 = '';
 if ($allapot == 'Y') { $checked1 = 'checked'; }
 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:

$sql = "SELECT * FROM $tbl_name
        ORDER by ID";      
$result = mysql_query($sql);
while($rows = mysql_fetch_array($result)) { 
 $sor = mysql_fetch_array($result);
 $allapot = $sor[5];
 $checked1 = '';
 $checked2 = '';
 if ($allapot == 'Y') { $checked1 = 'checked'; }
 if ($allapot == 'N') { $checked2 = 'checked'; }

 echo
 '<div id="gbook">
  <table>
  <tr><td></td><td>Közzétéve? / '.$rows['allowed'].' || Új érték: 
   <form name="adm-gform" method="post" action=""><span class="Y">
   <input type="radio" value="Y" id="allowed" name="allowed" '.$checked1.'> Igen</span>
   <span class="N">
   <input type="radio" value="N" id="allowed" name="allowed" '.$checked2.'> Nem</span>
   <input type=submit value=Submit>
   </form>
  </td></tr>
  </table>
 </div>
 ';}
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?

$sql = "SELECT * FROM $tbl_name
        ORDER by ID";      
$result = mysql_query($sql);
while($rows = mysql_fetch_array($result)) {
$checked_n = 'N';
$checked_y = 'Y';
if ($rows['allowed'] == 'N') {$checked_n = 'checked';}
 else {$checked_n = '';}
if ($rows['allowed'] == 'Y') {$checked_y = 'checked';}
 else {$checked_y = '';}
 echo
 '<div id="gbook">
  <tr><td></td><td>Közzétéve? / '.$rows['allowed'].' || Új érték: 
  <form name="adm-gform" method="post" action="">
  <span class="Y">
  <input type="radio" value="Y" id="allowed" name="allowed" '.$checked_y.'> Igen
  </span>
  <span class="N">
  <input type="radio" value="N" id="allowed" name="allowed" '.$checked_n.'> Nem
  </span>
...
  </div>
 ';}

C.
2

While

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

<input type="radio" value="Y" name="allowed[]" onclick="submit();" '.$checked_y.'> Igen
<input type="radio" value="N" name="allowed[]" onclick="submit();" '.$checked_n.'>Nem
<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:

if (isset($_POST['submit'])) {
 $allapot = '';
 if ($_POST['allowed[]'] == 'N') {
  $allapot = 'N';
  $update = 'UPDATE shoutbox set ALLOWED = '.$allapot.'
  where ID = '.$_POST['ID'].' limit 1';
  $result = mysql_query($update);
 }
 if ($_POST['allowed[]'] == 'Y') {
  $allapot = 'Y';
  $update = 'UPDATE shoutbox set ALLOWED = '.$allapot.'
  where ID = '.$_POST['ID'].' limit 1';
  $result = mysql_query($update);
 }
}
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.

if (isset($_POST['submit'])) {
 $allapot_tb = Array('Y','N');
 if ($_POST['allowed'] == $allapot_tb[0]) {
  $command = 'UPDATE shoutbox set ALLOWED = Y where ID = '.$_POST['ID'].' limit 1';  
  $result = mysql_query($command);
 }
 if ($_POST['allowed'] == $allapot_tb[1]) {
  $command = 'UPDATE shoutbox set ALLOWED = N where ID = '.$_POST['ID'].' limit 1';  
  $result = mysql_query($command);
 } 
} 
C.
9

Markup

Poetro · 2010. Ápr. 14. (Sze), 01.40
A fentihez viszont meg kellene változtanod a HTML-t.
<input type="radio" value="Y" name="allowed" onclick="submit();" '.$checked_y.'> Igen  
<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:

if (isset($_POST['allowed'])) {
 $id = trim($_POST['ID']);
 $azon = intval($id);
 $allapot_tb = Array('Y','N');
 if ($_POST['allowed'] == $allapot_tb[0]) {
  $command = 'UPDATE '.$tbl_name.' SET allowed="Y" WHERE id='.$azon.' limit 1';  
  $result = mysql_query($command);
 }
 if ($_POST['allowed'] == $allapot_tb[1]) {
  $command2 = 'UPDATE '.$tbl_name.' SET allowed="N" WHERE id='.$azon.' limit 1';  
  $result = mysql_query($command2);
 }
}