Autor Zpráva
DJ
Profil *
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
DJ:
$$i
nemá to být $i?
DJ
Profil *
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
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 *
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
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 *
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
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 *
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
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)
, ta bude platit pouze pro ID 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.
DJ
Profil *
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
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 *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0