Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Zax 23 Října 2008, 23:26:20
-
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.
-
když následující změníte na třeba input type text tak se chyba také projevuje?
<textarea cols="20" rows="10" name="clanek"><?php echo $text; ?></textarea><br />
pokud ne, tak zkuste zase v původním znění s textarea třeba přes phpinfo() podívat co vlastně stránka předává. Mám takové mlhavé tušení že TinyMCE přes DOM nahrazuje právě textarea. Ale jestli to posílá v jiné proměnné nebo je potřeba updatovat nějak původní textareu netuším.
-
Zkusil bych jen tak rychle pro diagnostiku přejmenovat clanek na třeba l_clanek.
Jinak zatím jsem v tom chybu neuviděl... ::)
-
Děkuji všem za nápady, stačilo se jen pořádně vyspat a problém jsem našel ihned.
Problém byl v nastavení TinyMCE, na jednom řádku jsem měl
save_callback : 'parsehtml',
což mělo při odesílání obsahu textarey zavolat tuto funkci:
function parsehtml(html) {
html = html.replace(/<img(S)>/g,"<img$1 />");
return html;
}
Tento kus kódu by měl nahrazovat <img> tagy za xhtml <img /> (script jsem našel někde na internetu, nečekal jsem, že s ním bude problém).
-
Tak to potom jo... tak ať to má úspěch u zadavatele ;)