Autor Zpráva
NiiKUss
Profil
Zdravím.
Mám tady jednu funkci která se používá pro výpis článků do selectform, ale asi v půlce se ztrácím.
Viz. pod funkcí.

		
$result = dbquery("SELECT clanek_id, clanek_titul, clanek_draft FROM ".DB_CLANKY." ORDER BY clanek_draft DESC, clanek_datestamp DESC");
		
		if (dbrows($result)) {
			$editlist = ""; $sel = "";
			
			while ($data = dbarray($result)) {
				
				if ((isset($_POST['clanek_id']) && isnum($_POST['clanek_id'])) || (isset($_GET['clanek_id']) && isnum($_GET['clanek_id']))) {
					$clanek_id = isset($_POST['clanek_id']) ? $_POST['clanek_id'] : $_GET['clanek_id'];
					$sel = ($clanek_id == $data['clanek_id'] ? " selected='selected'" : "");
				} else {
					$sel = "";
				}
				
				$editlist .= "<option value='".$data['clanek_id']."'".$sel.">".($data['clanek_draft'] ? $jazyk['a3b']." " : "").$data['clanek_titul']."</option>\n";
			}
			
			echo "<form name='selectform' method='post' action='clanek_w.php&amp;action=edit'>\n";
			echo "<select name='clanek_id' class='textbox' style='width:250px;'>\n".$editlist."</select>\n";
			echo "<input type='submit' name='edit' value='".$jazyk['a8c']."' class='button' />\n";
			echo "<input type='submit' name='delete' value='".$jazyk['a9c']."' onclick='return DeleteArticle();' class='button' />\n";
			echo "</form>\n";


Snažím se to všechno přepsat do klasické metody přes <a href= "">.
Nevím co tam určuje ID článků které se mají upravit, či po případě smazat.
Protože pro href="", budu muset určovat asi nějak takhle: clanek_w.php?action=edit&id=1 .
Pokud by někdo věděl, jak s tím vynaložit, budu moc vděčný. Neboť se s tím peru už druhý den.
(Pokud by bylo potřeba ještě cokoliv dodat,vysvětlit napište)

//EDIT: Koukám, koukám a už vím že to je řešeno přes metodu POST, ale stále si s tím nevím rady.
//Je nutné to řešit přes metodu GET, nebo by se to dalo řešit přes POST metodu, čistě kvůli bezpečnosti?
AM_
Profil
z tvého dotazu vůbec není jasné, co máš za problém. Jediné, na co ti můžu odpovědět, je, že přes odkaz <a href="..."> nemůžeš nic posílat metodou POST, od toho jsou formuláře.
pcmanik
Profil
Takisto chybu nevidim, a naviac je tam zly navrch databazy... Preco vsetky stlpce zacinaju clanek...
AM_
Profil
pcmanik:
zly navrch databazy... Preco vsetky stlpce zacinaju clanek...
toto je opravdu ten nejmenší problém v návrhu databáze. Pokud jí má rozumně namodelovanou, je opravdu jedno, jak se sloupce jmenují. Je sice myslím si zbytečné je prefixovat názvem tabulky, ale rozhodně to není chyba, která by stála za zmínku (spíš námět do diskuse proč to (ne)dělat).
pcmanik
Profil
Nj, ale podla mna je to zbytocne, samozrejme ze to nieje fatalna chyba, ale myslim ze to zbytocne zneprehladnuje
AM_
Profil
pcmanik:
myslim ze to zbytocne zneprehladnuje
osobně s tím souhlasím, ale někomu to třeba vyhovuje. Původně jsi ale říkal, že to je špatně, a to rozhodně není.
Tori
Profil
Chápu správně, že místo voleb do <select>u chcete vygenerovat odkazy?
 
echo '<ul>';
while ($data = dbarray($result)) {
                
                $aktualni = false;
                // edit: trochu přehlednější podmínka. Díky použití intval() není potřeba kontrolovat vstup pomocí isnum().
                if (isset($_POST['clanek_id']) || isset($_GET['clanek_id'])) {
                    $clanek_id = isset($_POST['clanek_id']) ? intval($_POST['clanek_id']) : intval($_GET['clanek_id']);
                    $aktualni = ($clanek_id == $data['clanek_id']);
                }

                // titulek clanku
                echo '<li>' . ($aktualni ? '<b>' : '') . ($data['clanek_draft'] ? $jazyk['a3b']." " : "") . $data['clanek_titul'];
                // odkazy na editaci a smazani
                echo ' <a href="clanek_w.php?action=edit&id='.$data['clanek_id'].'">'.$jazyk['a8c'].'</a> ';
                echo ' <a href="clanek_w.php?action=delete&id='.$data['clanek_id'].'">'.$jazyk['a9c'].'</a>';
                echo ($aktualni ? '</b>' : '') . '</li>';
}
echo '</ul>';

Hodnoty parametru action si upravte jak potřeba.
NiiKUss
Profil
Děkuji mnohokrát Tori.
Jsem se poučil, že nemám zakládat témata ve 3 ráno, neboť to pak málo kdo pochopí.
Jinak diskuze na téma Návrh databáze: Mě to celkem vyhovuje, aspoň vím co přesně kde je, ale podle vás to bude spíše zlozvyk.

Ještě bych se rád zeptal, jak mám pozměnit podmínky:
 
// Obsah podmínky jsem vynechal.
if (isset($_POST['delete']) && (isset($_POST['clanek_id']) && isnum($_POST['clanek_id']))) {}

if ((isset($_GET['action']) && $_GET['action'] == "edit") && (isset($_POST['clanek_id']) && isnum($_POST['clanek_id'])) || (isset($_GET['clanek_id']) && isnum($_GET['clanek_id'])))
AM_
Profil
NiiKUss:
Ještě bych se rád zeptal, jak mám pozměnit podmínky:
a co na nich chceš měnit? pro začátek možná to, že funkce isnum() neexistuje - asi jsi myslel is_numeric.

Návrh databáze: Mě to celkem vyhovuje, aspoň vím co přesně kde je, ale podle vás to bude spíše zlozvyk.
opravdu to není špatně, neboj ;)
NiiKUss
Profil
AM:
Ten isnum jsem teď už nahradil za intval, jinak děkuji za obhajobu strukturování databáze :)

Tím pozměnit jsem myslel tak, aby to běhalo s php kódem od uživatele Tori.
Lépe řečeno aby se při požadavku article.php?action=delete&id=1 vykonala akce 'delete' pro 1 článek.
Vím že to co je v adresním řádku se kontroluje pomocí $_GET.
Zkouším to sesmolit, pokus omyl, ale zatím sem neměl to štěstí.
PHP se učím sám z literatury a internetu, někdy ty podmínky jsou pro mě záhadou. Jsem zvědav kdy se do toho zasvětím :/..
Tori
Profil
NiiKUss:
isnum jsem teď nahradil za intval.
Jestli isnum je totéž jako is_numeric, tak to má celkem jinou funkci: is_numeric($promenna) ověřuje, jestli je proměnná číslo nebo číselný řetězec (a vrací true/false), kdežto intval($promenna) vrací hodnotu proměnné, převedenou na celé číslo.

Rámcově by to mohlo být i takto:
// nastavím prázdné výchozí hodnoty akce a ID článku
$action = $clanek_id = '';

// Přišel požadavek na smazání/editaci článku?

// Uživatel kliknul na odkaz, nebo odeslal formulář (method="GET")
if (isset($_GET['action']))  {
  $action = $_GET['action'];
  $clanek_id = intval($_GET['id']);
}
// Uživatel odeslal formulář metodou POST
elseif (isset($_POST['action']))  {
  $action = $_POST['action'];
  $clanek_id = intval($_POST['id']);
}


if ($action == 'edit')  {
  // editace článku
}
elseif ($action == 'delete')  {
  // smazání článku
}
Z těch podmínek, co jste psal, jsem pochopila, že data můžou přijít i POSTem i GETem. Proto jsou tu řádky 6-15, kde se načtou všechny potřebné proměnné buď z POSTu nebo z GETu, a už nemusíte psát if (isset($_GET['neco']) || isset($_POST['neco'])).
Alphard
Profil
Tori:
Uživatel kliknul na odkaz, nebo odeslal formulář (method="GET")
Také máme $_REQUEST
Tori
Profil
Alphard:
Chtěla jsem se vyhnout $_COOKIE ... ale uznávám, že pro začátečníka by to asi bylo přehlednější.
NiiKUss
Profil
Funguje to jak má, paráda :).
Ještě kosmetická úprava co bylo třeba udělat aby se mi nevyskytoval
Undefined variable: action in .....
Přidat
action = "";

před podmínku s $_GET['action']

Mockrát děkuji všem co se účastnili, ale hlavně uživatelce Tori, ktéra vše rozluštila a vyřešila. ;)
Teď se pustím do hloubi mouder knížek než se pustím dál, jelikož vidím že je to opravdu potřeba. :)
A neb, učený z nebe nespadl.

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: