Autor | Zpráva | ||
---|---|---|---|
DJ Profil * |
#1 · Zasláno: 4. 8. 2011, 23:18:21
Ahoj,
prosila bych o radu, možná je to primitivní, ale nepodařilo se mi to nikde najít. Pomocí php skriptu vypíšu z databáze seznam prvků, u toho checkboxy, které jsou zaškrtnuté, pokud v sloupci v databázi "IsActive" je hodnota 1. <form method="post" action="admin.php?p=rozvrh-hodin"> Aktivní hodiny:<br /> <?php $link = mysql_connect ("******","******","******") or die (mysql_error()); mysql_query("set names cp1250"); $db = mysql_select_db("*******", $link) or die (mysql_error()); $query = "SELECT * FROM Hours"; $result = mysql_query($query,$link) or die (mysql_error()); while ($row = mysql_fetch_array($result)) { $time = $row["Time"]; $id = $row["id"]; echo "<input type=\"checkbox\" name=\"".$id."\""; if ($row["IsActive"]==1) { echo " checked=\"checked\""; } echo " />".$time.", "; } mysql_free_result($result); mysql_close(); ?> <input type="submit" name="save" value="Uložit změny"> </form> Potřebuju, aby po odeslání formuláře se uložily změny do databáze. Tj., nezaškrtnuté hodnoty = 0, zaškrtnuté = 1. Mám na to tento skript <?php if ($save) { $link = mysql_connect ("******","*****","******") or die (mysql_error()); mysql_query("set names cp1250"); $db = mysql_select_db("*******", $link) or die (mysql_error()); for ($i=1;$i<16;$i++) { if ($$i==on) { $query = "UPDATE Hours SET IsActive = 1 WHERE id = '$i'"; mysql_query($query,$link) or die (mysql_error()); } else { $query = "UPDATE Hours SET IsActive = 0 WHERE id = '$i'"; mysql_query($query,$link) or die (mysql_error()); } } mysql_close(); } ?> Po odeslání formuláře se nesplní podmínka "if ($$i == on)" a vše se tedy nastaví na 0. Nevíte co s tím? Děkuju. |
||
johnl Profil |
#2 · Zasláno: 4. 8. 2011, 23:21:38 · Upravil/a: johnl
DJ:
„$$i“ nemá to být $i ?
|
||
DJ Profil * |
#3 · Zasláno: 4. 8. 2011, 23:24:44
johnl:
„nemá to být $i“ ne, např. $i =1 a $$i = $1 a ve formuláři je např. <input type="checkbox" name="$1" /> |
||
johnl Profil |
#4 · Zasláno: 4. 8. 2011, 23:52:35 · Upravil/a: johnl
DJ:
To jsem netušil a když si necháš vypsat jen tuto proměnnou $$i co obsahuje? Asi něco jiného než očekáváš, ale určitě neobsahuje on.. |
||
DJ Profil * |
#5 · Zasláno: 5. 8. 2011, 00:05:11
johnl:
„To jsem netušil a když si necháš vypsat jen tuto proměnnou $$i co obsahuje? Asi něco jiného než očekáváš, ale určitě neobsahuje on..“ neobsahuje nic :( tak tady bude zakopanej pes, ale jak teď ten problém vyřešit? |
||
johnl Profil |
#6 · Zasláno: 5. 8. 2011, 00:16:50 · Upravil/a: johnl
DJ:
Pokud se nemýlím, tak chceš něco takového: echo "<input type=\"checkbox\" value=\"1\" name=\"".$id."\""; if ($row["IsActive"]==1) { echo " checked=\"checked\""; } echo " />".$time.", "; if($_POST[$i]==1) |
||
DJ Profil * |
#7 · Zasláno: 5. 8. 2011, 00:27:34
johnl:
ne, value tam nechci. např. pro $i = 1 <input type="checkbox" name="1" /> a příkaz <?php if ($1==on) { $query = "UPDATE Hours SET IsActive = 1 WHERE id = '1'"; mysql_query($query,$link) or die (mysql_error()); } else { $query = "UPDATE Hours SET IsActive = 0 WHERE id = '1'"; mysql_query($query,$link) or die (mysql_error()); } } mysql_close(); } ?> |
||
Taps Profil |
#8 · Zasláno: 5. 8. 2011, 07:07:03 · Upravil/a: Taps
DJ:
„ne, value tam nechci“ A jaké hodnoty se ti pak mají odeslat ? aby ti skript fungoval tak jak požaduješ tak musíš pracovat s polem zkus níže uvedené <form method="post" action="admin.php?p=rozvrh-hodin"> Aktivní hodiny:<br /> <?php $link = mysql_connect ("******","******","******") or die (mysql_error()); mysql_query("set names cp1250"); $db = mysql_select_db("*******", $link) or die (mysql_error()); $query = "SELECT * FROM Hours"; $result = mysql_query($query,$link) or die (mysql_error()); while ($row = mysql_fetch_array($result)) { $time = $row["Time"]; $id = $row["id"]; echo "<input type=\"checkbox\" value=\"".$id."\"" name=\"polozky[]\" ; if ($row["IsActive"]==1) { echo " checked=\"checked\""; } echo " />".$time.", "; } mysql_free_result($result); mysql_close(); ?> <input type="submit" name="save" value="Uložit změny"> </form> a pak zpracování <?php foreach($_POST['polozky'] as $polozky => $hodnota){ if($hodnota==1) { $query = "UPDATE Hours SET IsActive = 1 WHERE id = '$hodnota'"; mysql_query($query,$link) or die (mysql_error()); } else { $query = "UPDATE Hours SET IsActive = 0 WHERE id = '1'"; mysql_query($query,$link) or die (mysql_error()); } mysql_close(); } ?> |
||
DJ Profil * |
#9 · Zasláno: 5. 8. 2011, 15:16:36
Taps:
to už je rozhodně lepší než moje varianta (aspoň mi nenastaví vše na 0), ale změny se neukládají. Sama se na to zkusím pořádně ještě podívat později, teď budu několik dní mimo internet. Prozatím díky! |
||
meris Profil |
#10 · Zasláno: 5. 8. 2011, 22:00:31 · Upravil/a: meris
DJ:
Ahoj v tom skriptu je více chyb, první je v tom, že nezaškrtnutý checkbox se na server vůbec neodesílá, tedy se tímto způsobem žádná hodnota nemůže nastavit na nulu Druhá chyba je že si nikde neukládáš hodnoty ID, tedy pokud budeš mít v DB více záznamů než 16 tak budeš stejně nastavovat pouze hodnoty na od 1 do 15. Taps ve svém řešení nebere v potaz právě neodeslané nezaškrtnuté checkboxy a druhá chyba pak je podmínce if($hodnota==1) Co musíš udělat pro správné zpracování: 1) zapamatovat si ID která budeš upravovat. 2) tyto ID pak porovnávat s ID která ti poslal uživatel. ID která nejsou přítomna v odeslaných datech pak nastavíš na 0, ostatní na 1. Možné řešení: Na začátek obou skriptů vlož tuto funkci session_start(); do prvního souboru, nahraď cyklus while tímto // inicializace if (isset($_SESSION['polozky'])) unset($_SESSION['polozky']); $_SESSION['polozky'] = array(); while ($row = mysql_fetch_array($result)) { $time = $row["Time"]; $id = $row["id"]; echo "<input type=\"checkbox\" name=\"polozky[".$id."]\""; if ($row["IsActive"]==1) { echo " checked=\"checked\""; } echo " />".$time.", "; // díky tomuto řádku si zapamatujeme zpracovaná ID do databáze $_SESSION['polozky'][$id] = $id; } do druhého skriptu vlož: // procházíme pouze položky, které jsme v předchozím skriptu umožnili foreach ($_SESSION['polozky'] as $id) { $set = (array_key_exists($id, $_POST['polozky'])) ? 1 : 0; $query= "UPDATE Hours SET IsActive = {$set} WHERE id = {$id}"; mysql_query($query,$link) or die (mysql_error()); } // vymaže data v session aby byla připravena pro další použití unset($_SESSION['polozky']); toto řešení má tu výhodu, že případný útočník nezmění hodnotu jiného ID než ke kterému má přístup. Například student A nezmení rozvrh studentovi B. --- Menší doporučení, je lepší používat proměnné $_POST['save'] místo $save. |
||
Časová prodleva: 17 dní
|
|||
DJ Profil * |
#11 · Zasláno: 22. 8. 2011, 16:20:59
meris:
použila jsem tvůj skript, ale opět neukládá změny. musím přiznat, že nechápu, co dělá funkce array_key_exists v „$set = (array_key_exists($id, $_POST['polozky'])) ? 1 : 0;“ a nevidím v tomhle příkazu žádnou podmínku, která by ověřila, který checkbox je zaškrtnut |
||
pcmanik Profil |
#12 · Zasláno: 22. 8. 2011, 16:54:20
DJ:
Co robi funkcia array_key_exists si mozes pozret v dokumentacii. A podmienka je tam, len sa jedna o skrateny zapis, otaznik oznacuje podmienku, jednotka true, nula false. |
||
DJ Profil * |
#13 · Zasláno: 23. 8. 2011, 09:56:05
Tak už jsem na to přišla. Sice jsem to udělala poněkud jinak, než meris, ale funguje to tak, jak potřebuju.
Výpis checkboxů vypadá takto <?php $link = mysql_connect ("******","******","*******") or die (mysql_error()); mysql_query("set names cp1250"); $db = mysql_select_db("*******", $link) or die (mysql_error()); $query = "SELECT * FROM Hours"; $result = mysql_query($query,$link) or die (mysql_error()); while ($row = mysql_fetch_array($result)) { $time = $row["Time"]; $id = $row["id"]; echo "<input type=\"checkbox\" name=\"polozky[".$id."]\""; if ($row["IsActive"]==1) { echo " checked=\"checked\""; } echo " />".$time.", "; } mysql_free_result($result); mysql_close(); ?> a zpracování takto $link = mysql_connect ("*******","*******","*******") or die (mysql_error()); mysql_query("set names cp1250"); $db = mysql_select_db("*******", $link) or die (mysql_error()); //s tou 16 to není zrovna nejšikovnější, ale mně to tak stačí for ($id=1;$id<16;$id++) { if ($polozky[$id]) { $query= "UPDATE Hours SET IsActive = 1 WHERE id = '$id'"; } else { $query= "UPDATE Hours SET IsActive = 0 WHERE id = '$id'"; } mysql_query($query,$link) or die (mysql_error()); } |
||
pcmanik Profil |
#14 · Zasláno: 23. 8. 2011, 12:14:26
DJ:
mysql_free_result() a mysql_close() nemusis pouzivat, to ma vyznam len pri extremne velkych a narocnych skriptoch na pamet, inak sa to spusta same po ukonceni skriptu. A u teba je to vlastne zbytocne, nakolko uz dalsi kod potom nemas. |
||
Časová prodleva: 13 let
|
0