Autor Zpráva
Adrifinel
Profil
Kdysi mi bylo uděláno filtrování, ale když jsem se autorky ptala na úpravu, už si nepamatovala, že něco takového vůbec dělala.

echo '<form method="GET" action="?" id="noborder">
Filtrovat měsíc: <select name="filter" class="kolon">
<option value="0" '.$optf[0].'>Zobrazit vše</option>
<option value="1" '.$optf[1].'>Leden</option>
<option value="2" '.$optf[2].'>Únor</option>
<option value="3" '.$optf[3].'>Březen</option>
<option value="4" '.$optf[4].'>Duben</option>
<option value="5" '.$optf[5].'>Květen</option>
<option value="6" '.$optf[6].'>Červen</option>
<option value="7" '.$optf[7].'>Červenec</option>
<option value="8" '.$optf[8].'>Srpen</option>
<option value="9" '.$optf[9].'>Září</option>
<option value="10" '.$optf[10].'>Říjen</option>
<option value="11" '.$optf[11].'>Listopad</option>
<option value="12" '.$optf[12].'>Prosinec</option>
</select>


Systém funguje tak, že vám to ukáže výsledky jen týkající se daného měsíce.

Bylo mi řečeno, že funkce $optf se používá jen na čísla. Která funkce se použivá, když chci použít názvy (míst)? O té $optf jsem nenašla ani moc informací...
Michal Maršálek
Profil
Adrifinel:
funkce $optf
Není to žádná funkce, je to proměnná (pole). V php může být klíčem pole (to co je v hranatých závorkách) jak číslo, tak i textový řetězec.
Adrifinel
Profil
Michal Maršálek:

Tak pole... trochu jsem jaksi tápala, co to vůbec je, vzhledem k tomu, že to neví ani autor :D

Takže říkáš, že když vyměním čísla za text, tak to bude fungovat?

if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND $_GET["filter"] >= 1 AND $_GET["filter"] <= 12) {

Ono se totiž s těmi čísly pojí tohle pak.
Michal Maršálek
Profil
Adrifinel:
Nevím, kde co za co chceš vyměnit a co chceš vlastně udělat.
Tori
Profil
Adrifinel:
Řešíš dvě různé věci naráz.
Pokud chceš zjistit, jak to funguje, vypiš si to pole $optf a případně dej najít v kódu všechny výskyty téhle proměnné - někde určitě musíš narazit na to, jak a podle čeho je definovaná.

Pokud se ptáš, jak udělat omezit výpis dat jen na konkrétní měsíc, tak prosím tě doplň info:
- v jakém formátu jsou data (asi z DB, že?), která chceš porovnávat s GET[filter]
- jakou úpravu proti té původní funkčnosti potřebuješ
Adrifinel
Profil
Tori:

Zkusím to zformulovat jinak.

Já nechci udělat výpis dat na měsíce, to mám dávno uděláno a funguje to. Já chci použít stejný systém na výpis zeměpisných názvů. Prostě mám stávající kód a chci ho upravit na jinou část webu.

if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND $_GET["filter"] >= 0 AND $_GET["filter"] <= 12) {
    $optf[$_GET["filter"]] = "selected";
}
else {
    $optf[0] = "selected";

Je ještě tady.

Já se tedy ptám na to jak předělat výpis měsíců na výpis lokací s tím, že je tam proměnná o které nevím, co je zač. Jestli je to něco jako vlastní kombinace nebo tak.
Tori
Profil
To pole $optf je jen k tomu, aby po odeslání formuláře zůstal v <select>u vybraný ten měsíc, který jsi chtěla.
Dá se to udělat i jinak, např.:
$mesice = array(1 => 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec');

$vybranyMesic = 0;
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND isset($mesice[$_GET["filter"]]) {
    $vybranyMesic = $_GET["filter"];
}

echo '<form method="GET" action="?" id="noborder">
  Filtrovat měsíc: <select name="filter" class="kolon">
  <option value="0"' . ($vybranyMesic == 0 ? ' selected' : '') . '>Zobrazit vše</option>';
foreach ($mesice as $cislo => $nazev) {
  echo '<option value="'.$cislo.'"' . ($vybranyMesic == $cislo ? ' selected' : '') . '>'.$nazev.'</option>';
}
echo '</select>';
Pokud budeš ty zeměpisné názvy číst z DB, tak bych to určitě udělala tímhle způsobem.

jak předělat výpis měsíců na výpis lokací
Změní se ta podmínka:
if(!empty($_GET["filter"]) - tohle zůstane stejné (pokud to nechceš přejmenovat)
is_numeric($_GET["filter"]) - pokud budeš ve formuláři používat ID těch lokací, tak tohle zůstane stejné. Kdybys používala názvy (tj. stranka.php?filter=Brno), tak to vynech.
$_GET["filter"] >= 0 AND $_GET["filter"] <= 12 - tahle část ověřuje, jestli to je platné číslo měsíce. Jestli budeš názvy lokací číst z DB, tak to taky dej pryč. Kdyby někdo zadal neexistující název nebo ID, tak se prostě nic nenajde.
Adrifinel
Profil
Ještě jedna věc by se s tím pojila a to stránkování. Uvědomila jsem si, že těch záznamů bude hodně a lidi neradi jaksi rolují. A není mi jasné, jak do tohoto kódu to stránkování zaimponovat... výpisy se nerozdělí na stránky.

Nějak nevím, jak do jejího stylu napsat... LIMIT $limit

<?php
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND $_GET["filter"] >= 1 AND $_GET["filter"] <= 12) {
    $filter_by_month = htmlspecialchars($_GET["filter"]); // Ochrana proti hackerům
    $prikaz = MySQL_Query("SELECT * FROM `kalendar` WHERE MONTH(datum) = ".$filter_by_month." ".$sql_order.";") or die (mysql_error());
}
else {
    $prikaz = MySQL_Query("SELECT * FROM `kalendar` ".$sql_order.";") or die (mysql_error());
}

if(mysql_num_rows($prikaz) >= 1) { // Když je alespoň jeden záznam
    echo'<table style="width: 100%">
        <tr><td width="10" class="td3">Datum</td><td width="220" class="td3">Událost</td></tr>';
    
    while($data = mysql_fetch_array($prikaz)) { // Vypisuj záznamy
        if(date("j.n", strtotime($data["datum"])) == date("j.n", time())) { // pokud je datum záznamu stejné jako dnešní:
            echo '<tr class="tr" id="z'.$data["ID"].'"><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš obarvený řádek
        }
        else { // když je datum jiné:
            echo '<tr><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš normální řádek
        }

        }
        echo '</table>';
}



?>

<? include "./zabody.php";?>
Tori
Profil
// stránkovací funkce. Vrací pole, kde klíče jsou čísla stránek a 
//  hodnota je false|true (= jestli tato stránka je aktuální)
// parametry: počet záznamů celkem; počet záznamů na 1 stránku; číslo aktuální stránky; číslo první stránky (jestli 0 nebo 1)
function strankovani($celkem, $naStranku, $aktualni, $start = 1) {
    $data = array();
    while ($celkem > 0) {
        $data[$start] = ($start == $aktualni);
        $celkem -= $naStranku;
        $start++;
    }
    return $data;
}


// nejdřív nastavíš omezení výpisu (filtr, stránkování)
$mesice = array(1 => 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec');
define('ZAZNAMU_NA_STRANKU', 20);
 
$vybranyMesic = 0;
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND isset($mesice[$_GET["filter"]]) {
    $vybranyMesic = $_GET["filter"];
}
// stránky jsou číslované od jedničky
$aktualniStranka = !empty($_GET['stranka']) ? (int)$_GET['stranka']: 1;

// Pak poskládáš SQL a zjistíš, kolik záznamů je tam celkem.
$sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM `kalendar`';
if ($vybranyMesic)
    $sql .= ' WHERE MONTH(`datum`) = '.$vybranyMesic;
$sql .= ' '.$sql_order.' LIMIT '.( ($aktualniStranka-1) * ZAZNAMU_NA_STRANKU).', '.ZAZNAMU_NA_STRANKU;
// ↑ to $stranka-1 je nutné, pokud číslo první stránky je 1. Pokud čísluješ od nuly, nech tam jen $stranka.

$vysledek = mysql_query($sql);
if (!$vysledek) {
    echo 'Chyba dotazu'; // nějaké zpracování chyby...
}
$zaznamuCelkem = mysql_result(mysql_query('SELECT FOUND_ROWS()'), 0);


// Stránkování:
echo "<p>Nalezeno $zaznamuCelkem událostí v kalendáři. Přejít na stránku č. ";
foreach(strankovani($zaznamuCelkem, ZAZNAMU_NA_STRANKU, $aktualniStranka) as $cislo => $jeAktualni) {
    if (!$jeAktualni)
         echo " <a href='?filter=".$vybranyMesic."&amp;stranka=".$cislo."'>$cislo</a> |";
    else
         echo " $cislo |";
}
echo '</p>';


// Výpis událostí z kalendáře 
if (mysql_num_rows($vysledek) >= 1) {
    echo'<table style="width: 100%">
        <tr><td width="10" class="td3">Datum</td><td width="220" class="td3">Událost</td></tr>';

    // Datum z DB můžeš porovnávat takhle, je zbytečné volat tolikrát date(). 
    //  (předpokládám, že v DB je ten sloupec DATE. Pokud je DATETIME, tak by se to muselo trochu upravit)
    $dnesniDatum = date('Y-m-d');
    while($data = mysql_fetch_array($vysledek)) { // Vypisuj záznamy

        if($data["datum"] == $dnesniDatum) { // pokud je datum záznamu stejné jako dnešní:
            echo '<tr class="tr" id="z'.$data["ID"].'"><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš obarvený řádek
        }
        else { // když je datum jiné:
            echo '<tr><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš normální řádek
        }
 
    }
    echo '</table>';
}
Adrifinel
Profil
No ještě předtím je kus kódu, zkusím jak to na sebe bude pasovat :)

Tak si říkám, kde mi tam chybí "}" Jedu celý kód a nikde to nevypadá, že by to nebylo jako ukončeno.
<? $title="Kalendář";
include ('./predtitle.php'); ?>
<? include "./zatitle.php";?>
<h2>Kalendář</h2>

<?php
// Kontrola filtrování, nastavení formuláře pro filtr:
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND $_GET["filter"] >= 0 AND $_GET["filter"] <= 12) {
$optf[$_GET["filter"]] = "selected";
}
else {
$optf[0] = "selected";
}

// Kontrola řazení, nastavení formuláře, nastavení SQL příkazu pro řazení:
if(!empty($_GET["order"])) {
$opto[$_GET["order"]] = "selected";

if($_GET["order"] == "id_asc") {
$sql_order = "ORDER BY ID ASC";
}
elseif($_GET["order"] == "id_desc") {
$sql_order = "ORDER BY ID DESC";
}
elseif($_GET["order"] == "date_asc") {
$sql_order = "ORDER BY YEAR(datum) ASC, MONTH(datum) ASC, DAY(datum) ASC";
}
elseif($_GET["order"] == "date_desc") {
$sql_order = "ORDER BY YEAR(datum) DESC, MONTH(datum) DESC, DAY(datum) DESC";
}
else {
$sql_order = "ORDER BY ID ASC";
}
}
else {
$sql_order = "ORDER BY ID ASC";
}

// Formulář pro filtr a řazení:
echo '<form method="GET" action="?" id="noborder">
Filtrovat měsíc: <select name="filter" class="kolon">
<option value="0" '.$optf[0].'>Zobrazit vše</option>
<option value="1" '.$optf[1].'>Leden</option>
<option value="2" '.$optf[2].'>Únor</option>
<option value="3" '.$optf[3].'>Březen</option>
<option value="4" '.$optf[4].'>Duben</option>
<option value="5" '.$optf[5].'>Květen</option>
<option value="6" '.$optf[6].'>Červen</option>
<option value="7" '.$optf[7].'>Červenec</option>
<option value="8" '.$optf[8].'>Srpen</option>
<option value="9" '.$optf[9].'>Září</option>
<option value="10" '.$optf[10].'>Říjen</option>
<option value="11" '.$optf[11].'>Listopad</option>
<option value="12" '.$optf[12].'>Prosinec</option>
</select>

Řadit podle: <select name="order" class="kolon">
<option value="id_asc" '.$opto[id_asc].'>ID vzestupně</option>
<option value="id_desc" '.$opto[id_desc].'>ID sestupně</option>
<option value="date_asc" '.$opto[date_asc].'>Data vzestupně</option>
<option value="date_desc" '.$opto[date_desc].'>Data sestupně</option>
</select>

<input class="button" type="submit" value="Zobraz">
</form>';
?>
<?
// stránkovací funkce. Vrací pole, kde klíče jsou čísla stránek a
// hodnota je false|true (= jestli tato stránka je aktuální)
// parametry: počet záznamů celkem; počet záznamů na 1 stránku; číslo aktuální stránky; číslo první stránky (jestli 0 nebo 1)
function strankovani($celkem, $naStranku, $aktualni, $start = 1) {
$data = array();
while ($celkem > 0) {
$data[$start] = ($start == $aktualni);
$celkem -= $naStranku;
$start++;
}
return $data;
}


// nejdřív nastavíš omezení výpisu (filtr, stránkování)
$mesice = array(1 => 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec');
define('ZAZNAMU_NA_STRANKU', 20);

$vybranyMesic = 0;
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND isset($mesice[$_GET["filter"]]) {
$vybranyMesic = $_GET["filter"];
}
// stránky jsou číslované od jedničky
$aktualniStranka = !empty($_GET['stranka']) ? (int)$_GET['stranka']: 1;

// Pak poskládáš SQL a zjistíš, kolik záznamů je tam celkem.
$sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM `kalendar`';
if ($vybranyMesic)
$sql .= ' WHERE MONTH(`datum`) = '.$vybranyMesic;
$sql .= ' '.$sql_order.' LIMIT '.( ($aktualniStranka-1) * ZAZNAMU_NA_STRANKU).', '.ZAZNAMU_NA_STRANKU;
// ↑ to $stranka-1 je nutné, pokud číslo první stránky je 1. Pokud čísluješ od nuly, nech tam jen $stranka.

$vysledek = mysql_query($sql);
if (!$vysledek) {
echo 'Chyba dotazu'; // nějaké zpracování chyby...
}
$zaznamuCelkem = mysql_result(mysql_query('SELECT FOUND_ROWS()'), 0);


// Stránkování:
echo "<p>Nalezeno $zaznamuCelkem událostí v kalendáři. Přejít na stránku č. ";
foreach(strankovani($zaznamuCelkem, ZAZNAMU_NA_STRANKU, $aktualniStranka) as $cislo => $jeAktualni) {
if (!$jeAktualni)
echo " <a href='?filter=".$vybranyMesic."&amp;stranka=".$cislo."'>$cislo</a> |";
else
echo " $cislo |";
}
echo '</p>';


// Výpis událostí z kalendáře
if (mysql_num_rows($vysledek) >= 1) {
echo'<table style="width: 100%">
<tr><td width="10" class="td3">Datum</td><td width="220" class="td3">Událost</td></tr>';

// Datum z DB můžeš porovnávat takhle, je zbytečné volat tolikrát date().
// (předpokládám, že v DB je ten sloupec DATE. Pokud je DATETIME, tak by se to muselo trochu upravit)
$dnesniDatum = date('Y-m-d');
while($data = mysql_fetch_array($vysledek)) { // Vypisuj záznamy

if($data["datum"] == $dnesniDatum) { // pokud je datum záznamu stejné jako dnešní:
echo '<tr class="tr" id="z'.$data["ID"].'"><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš obarvený řádek
}
else { // když je datum jiné:
echo '<tr><td>'.date("j.n.Y", strtotime($data["datum"])).'</td><td>'.$data["text"].'</td></tr>'; // vypiš normální řádek
}

}
echo '</table>';
}


?>

<? include "./zabody.php";?>
[/pre]

[pre]<? $title="Kalendář";
include ('./predtitle.php'); ?>
<? include "./zatitle.php";?>
<h2>Kalendář</h2>

<?php
// Kontrola filtrování, nastavení formuláře pro filtr:
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND $_GET["filter"] >= 0 AND $_GET["filter"] <= 12) {
$optf[$_GET["filter"]] = "selected";
}
else {
$optf[0] = "selected";
}

// Kontrola řazení, nastavení formuláře, nastavení SQL příkazu pro řazení:
if(!empty($_GET["order"])) {
$opto[$_GET["order"]] = "selected";
}
if($_GET["order"] == "id_asc") {
$sql_order = "ORDER BY ID ASC";
}
elseif($_GET["order"] == "id_desc") {
$sql_order = "ORDER BY ID DESC";
}
elseif($_GET["order"] == "date_asc") {
$sql_order = "ORDER BY YEAR(datum) ASC, MONTH(datum) ASC, DAY(datum) ASC";
}
elseif($_GET["order"] == "date_desc") {
$sql_order = "ORDER BY YEAR(datum) DESC, MONTH(datum) DESC, DAY(datum) DESC";
}
else {
$sql_order = "ORDER BY ID ASC";
}
}
else {
$sql_order = "ORDER BY ID ASC";
}

// Formulář pro filtr a řazení:
echo '<form method="GET" action="?" id="noborder">
Filtrovat měsíc: <select name="filter" class="kolon">
<option value="0" '.$optf[0].'>Zobrazit vše</option>
<option value="1" '.$optf[1].'>Leden</option>
<option value="2" '.$optf[2].'>Únor</option>
<option value="3" '.$optf[3].'>Březen</option>
<option value="4" '.$optf[4].'>Duben</option>
<option value="5" '.$optf[5].'>Květen</option>
<option value="6" '.$optf[6].'>Červen</option>
<option value="7" '.$optf[7].'>Červenec</option>
<option value="8" '.$optf[8].'>Srpen</option>
<option value="9" '.$optf[9].'>Září</option>
<option value="10" '.$optf[10].'>Říjen</option>
<option value="11" '.$optf[11].'>Listopad</option>
<option value="12" '.$optf[12].'>Prosinec</option>
</select>

Řadit podle: <select name="order" class="kolon">
<option value="id_asc" '.$opto[id_asc].'>ID vzestupně</option>
<option value="id_desc" '.$opto[id_desc].'>ID sestupně</option>
<option value="date_asc" '.$opto[date_asc].'>Data vzestupně</option>
<option value="date_desc" '.$opto[date_desc].'>Data sestupně</option>
</select>

<input class="button" type="submit" value="Zobraz">
</form>';
?>
<?
// stránkovací funkce. Vrací pole, kde klíče jsou čísla stránek a
// hodnota je false|true (= jestli tato stránka je aktuální)
// parametry: počet záznamů celkem; počet záznamů na 1 stránku; číslo aktuální stránky; číslo první stránky (jestli 0 nebo 1)
function strankovani($celkem, $naStranku, $aktualni, $start = 1) {
$data = array();
while ($celkem > 0) {
$data[$start] = ($start == $aktualni);
$celkem -= $naStranku;
$start++;
}
return $data;
}


// nejdřív nastavíš omezení výpisu (filtr, stránkování)
$mesice = array(1 => 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec');
define('ZAZNAMU_NA_STRANKU', 20);

$vybranyMesic = 0;
if(!empty($_GET["filter"]) AND is_numeric($_GET["filter"]) AND isset($mesice[$_GET["filter"]]) {
$vybranyMesic = $_GET["filter"];
}
// stránky jsou číslované od jedničky
$aktualniStranka = !empty($_GET['stranka']) ? (int)$_GET['stranka']: 1;

// Pak poskládáš SQL a zjistíš, kolik záznamů je tam celkem.
$sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM `kalendar`';
if ($vybranyMesic)
$sql .= ' WHERE MONTH(`datum`) = '.$vybranyMesic;
$sql .= ' '.$sql_order.' LIMIT '.( ($aktualniStranka-1) * ZAZNAMU_NA_STRANKU).', '.ZAZNAMU_NA_STRANKU;
// ↑ to $stranka-1 je nutné, pokud číslo první stránky je 1. Pokud čísluješ od nuly, nech tam jen $stranka.

$vysledek = mysql_query($sql);
if (!$vysledek) {
echo 'Chyba dotazu'; // nějaké zpracování chyby...
}
$zaznamuCelkem = mysql_result(mysql_query('SELECT FOUND_ROWS()'), 0);


// Stránkování:
echo "<p>Nalezeno $zaznamuCelkem událostí v kalendáři. Přejít na stránku č. ";
foreach(strankovani($zaznamuCelkem, ZAZNAMU_NA_STRANKU, $aktualniStranka) as $cislo => $jeAktualni) {
if (!$jeAktualni)
echo " <a href='?filter=".$vybranyMesic."&amp;stranka=".$cislo."'>$cislo</a> |";
else
echo " $cislo |";
}
echo '</p>';


// Výpis událostí z kalendáře
if (mysql_num_rows($vysledek) >= 1) {
echo'<table style="width: 100%">
<tr><td width="10" class="td3">Datum</td><td width="220" class="td3">Událost</td></tr>';

// Datum z DB můžeš porovnávat takhle, je zbytečné volat tolikrát date().
// (předpokládám, že v DB je ten sloupec DATE. Pokud je DATETIME, tak by se to muselo trochu upravit)
$dnesniDatum = dat

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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