Zdravím,
dělám na zakázku jedny webovky, musím je mít co nejdřív, bohužel jsem se zasekl u programování administrace, kde mi nefunguje editace článků. Jsem si na 99% jistý, že jde o nějakou blbost (nebylo by to u mě poprvé - například jsem měl jednou v názvu konstanty pomlčku a divil jsem se, proč mi to nejede), bohužel tu blbost už druhý den hledám
Nebudu popisovat jak můj RS funguje, pouze to nejdůležitější, kde by mohl být problém:
Mám soubor index.php, který vypadá cca takto:
<?php
require "../scripty/funkce.php";
pripojit();
$akce = str_replace(".","",$_GET['akce']);
$akce = str_replace("/","",$akce);
$akce = str_replace("\\","",$akce);
if($akce!="")
{
if(file_exists("akce/$akce.php"))
include "akce/$akce.php";
}
// HTML
$modul = str_replace(".","",$_GET['modul']);
$modul = str_replace("/","",$modul);
$modul = str_replace("\\","",$modul);
if($modul!="")
{
if(file_exists("moduly/$modul.php"))
include "moduly/$modul.php";
}else
include "moduly/stat.php";
Princip velice jednoduchý - jsou dva parametry v url - modul a akce. Akce je v podstatě script, který se provede před výstupem textu na stránku, modul je to, co správce webu vidí a s čím pracuje - výpis článků, formuláře apod.
Dále mám dva soubory stranka-uprav.php, jeden je v adresáři moduly (index.php?modul=stranka-uprav), druhý v adresáři akce (index.php?akce=stranka-uprav.php). První má za úkol zobrazit formulář pro upravení stránky, druhý má za úkol změny zapsat do databáze.
/moduly/stranka-uprav.php:
<?php
$stranka = intval($_GET['stranka']);
$result = mysql_query("SELECT nadpis,text FROM stranky WHERE id = $stranka");
$row = mysql_fetch_row($result);
$nadpis = $row[0];
$text = $row[1];
?>
<h3>Úprava stránky</h3>
<form method="post" action="?akce=stranka-uprav">
<input type="hidden" name="id" value="<?php echo $stranka; ?>" /> <!-- napr ?modul=stranka-uprav&stranka=10 -->
<input type="text" name="nadpis" value="<?php echo $nadpis; ?>" /><br />
<textarea cols="20" rows="10" name="clanek"><?php echo $text; ?></textarea><br />
<input type="submit" name="upravit" value="Upravit" />
</form>
/akce/stranka-uprav.php:
<?php
$id = intval($_POST['id']);
$nadpis = escape($_POST['nadpis']);
$clanek = escape($_POST['clanek']);
mysql_query("UPDATE stranky SET nadpis = '$nadpis', text = '$clanek' WHERE id = $id");
header("location:index.php?modul=stranky");
?>
Soubor moduly/stranka-uprav.php pracuje správně, ovšem akce/stranka-uprav.php nikoliv - script zapíše do databáze správně pouze nadpis, do proměnné $clanek se vždy uloží hodnota "clanek" (bez uvozovek) nezávisle na tom, co chci doopravdy odeslat - když si nechám vypsat echo $_POST['clanek']; dostanu "clanek" (bez uvozovek).
Stránka neobsahuje žádný jiný element s názvem clanek. Stránka obsahuje editor TinyMCE, ve kterém ale chyba není, protože podobný script, který vytváří nové články, funguje správně. Kromě TinyMCE neobsahuje stránka žádný JavaScript. Funkce escape, která je využitá, vypadá takto:
function escape($string)
{ if(is_numeric($string))
return intval($string);
else
return mysql_real_escape_string($string);
}
Nejzajímavější je, že slovo "clanek" se nevyskytuje nikde jinde kromě názvu proměnné, není ani nastavené v databázi jako defaultní hodnota, prostě tato hodnota se proměnné přiřadí ihned po POSTnutí formuláře.
Zkoušel jsem už snad všechno možné od jiných názvů proměnných až po rozkouskování UPDATE dotazů do dvou.
Pozn.: v PHP nezačínám, pouze mám zvláštní schopnost dělat neobvyklé primitivní chyby, které se snadno přehlédnou a umí potrápit klidně na několik týdnů. Chyby si většinou hledám sám, tohle ale bohužel spěchá, proto to sem házím -> víc očí víc vidí, víc hlav víc ví.
Předem mockrát děkuji.