Autor | Zpráva | ||
---|---|---|---|
roboti006 Profil * |
#1 · Zasláno: 17. 3. 2012, 20:29:35
Ahoj.
Mám takový problémek. Už jsem si zvykl na problémy s DB, nastávající mou neodborností, ale teď když jsem prolezl asi 16 témat ve kterých se vyskytovalo slova MySQL a UPDATE, a já svou sekretářku mysql_query :) nechal hodněkrát proběhnout k DB a zpět, mě to začalo dost zlobit, vzhledem i k tomu že už to asi týden zkouším zprovoznit... Jak někteří už slyšeli, snažím se občas napsat něco málo na své stránky, a po posledních dvou "článcích", kde se snažím vést co nejsrozumitelněji zápis toho jak jsem se naučil to co teď dělám se mi zdá že bych potřeboval někdy i poopravit drobnosti, nebo hrubky. Zkouším teď vyrobit podobným způsobem, jako skript pro zápis článků, něco co by mohlo upravit jejich obsah. Začal jsem vytvořením formuláře do kterého jsem (jako value="") načetl vybraný článek. Ten se zobrazí v textarei a dá mi možnost abych jej upravil. Potom metodou POST putuje do zpracování (str_replace ,mysql_real_escape_string), a pak s QUERY do DB. Až potud to jde výborně, ale nevím proč, se v DB neprovede UPDATE, a místo toho se provede INSERT (místo změny stávajícího obsahu, se vytvoří nový řádek). V PHP toto vše vypadá (samozřejmě vynechávám zabezpečovací řádky, které jsou, myslím, zbytečné) $idcln = $_POST['idclanku']; $text = $_POST['text']; $text = str_replace ("<","<",$text); $text = str_replace (">",">",$text); $text = str_replace ("]",">",$text); $text = str_replace ("[","<",$text); $text = str_replace ("\n","<br/>",$text); $text = str_replace ("'",""",$text); $text = mysql_real_escape_string($text); mysql_query("UPDATE `clanky` SET `text` = '$text' WHERE `idclanku` = '$idcln'"); Zkoušel jsem již mnoho změn, od změny ohraničení názvu sloupců a dat až ke změně pořadí príkazů, marně. Buďto to nedělalo nic, anebo to vytvořilo úplně nový článek, a já jej jako duplicitní článek hned vymazal. Ještě taková maličkost: Na pár minut jsem si stvořil takový malý prográmek pro přímou komunikaci s DB (textarea a query) tam jsem to zkoušel, a nechal si vypisovat data, a sledovat jak se tam nic nemění... Na jiném serveru, kde spravuju stránky našemu společenství, pomocí Drupalu, mají samozřejmě rychlejší a novější DB i MyAdmina, ale nemyslím že by to mělo nějak moc velký efekt, a tam to většinou v SQL řádce fungovalo... Nevíte co by s tím mohlo být? |
||
Someone Profil |
#2 · Zasláno: 17. 3. 2012, 20:38:39
SQL příkaz je dobře, je nybch upravil idclanku na WHERE clanky.idclanku = ...
Tím to nebude, důležité bude odkud bereš proměnnou $idcln. Chtělo by to i to HTML |
||
ahoj Profil * |
#3 · Zasláno: 17. 3. 2012, 20:50:30
roboti006:
> se v DB neprovede UPDATE, > a místo toho se provede INSERT Z toho plyne, že chyba je mimo ten kód, který jsi sem dal. Pravděpodobně v nějakém větvení. |
||
roboti006 Profil * |
#4 · Zasláno: 17. 3. 2012, 21:04:17
Dobře, prosím nesmějte se tomu uspořádání ;)
Celkově to vypadá takto: <?php session_start(); if(isset($_POST['odeslat']) && $_SESSION['logged'] == 1){ $con = mysql_connect("mysql.webzdarma.cz","#########","######"); mysql_select_db("#########", $con); $id = $_GET['id']; if($id == "clanek" && $_POST['nadpis']!=="" || $_POST['text']!=="" || $_POST['autor']!==""){ //zápis nového článku - Možná jedinné co by mohlo dělat problémy, ale je součástí elseifů //na stejné úrovni jako update, takže by neměl být vůbec spuštěn. $nadpis = $_POST['nadpis']; $text = $_POST['text']; $autor = $_POST['autor']; $kategorie = $_POST['kat']; $keywords = $_POST['kw']; $text = str_replace ("<","<",$text); $text = str_replace (">",">",$text); $text = str_replace ("]",">",$text); $text = str_replace ("[","<",$text); if (!$con) { die('Není možné se připojit k databázi' . mysql_error()); } $text = str_replace ("\n","<br/>",$text); $text = str_replace ("'",""",$text); $escnadpis = mysql_real_escape_string($nadpis); $esctext = mysql_real_escape_string($text); $escautor = mysql_real_escape_string($autor); $esckategorie = mysql_real_escape_string($kategorie); $esckeywords = mysql_real_escape_string($keywords); $sql = "INSERT INTO clanky (`nadpis`, `text`, `autor`, `kategorie`, `keywords`) VALUES ('$escnadpis', '$esctext', '$escautor', '$esckategorie', '$esckeywords')"; mysql_query($sql) or die(mysql_error() . '<br/>' . $sql); $ok = 1; }elseif($id == "clanekupd"){ $idcln = $_POST['idclanku']; $text = $_POST['text']; $text = str_replace ("<","<",$text); $text = str_replace (">",">",$text); $text = str_replace ("]",">",$text); $text = str_replace ("[","<",$text); $text = str_replace ("\n","<br/>",$text); $text = str_replace ("'",""",$text); $text = mysql_real_escape_string($text); mysql_query("UPDATE `clanky` SET `text` = '$text' WHERE `idclanku` = '$idcln'"); $ok = 1; }elseif($id == "game" && $_POST['jmenohry'] !== "" && $_POST['soubor'] !== ""){ //něco $ok = 1 } $zpet = $_SERVER["HTTP_REFERER"]; } if($ok == 1){header("Location: $zpet");}else{ echo '<script type="text/javascript>alert("Je mi líto, ale něco je špatně.");</script>"'; header("Location: $zpet"); } ?> |
||
ahoj Profil * |
#5 · Zasláno: 17. 3. 2012, 21:12:50
roboti006:
Podmínka na ř. 7 je splněna, takže proběhne větev na ř. 8-33 a pak pokračuješ až řádkem 50. |
||
roboti006 Profil * |
#6 · Zasláno: 17. 3. 2012, 21:30:13
Aá díky za postřeh, vypadá to žes to možná trefil
ale v tomto případě nesouhlasí v podmínce ID, které je clanekupd. Nebo stačí aby podmínka byla splněna jen v těch šesti písmenech? Já myslel že to bere úplně (stejně). Možná pomůže přidat ještě jedno = ?? if($id === "clanek" |
||
ahoj Profil * |
#7 · Zasláno: 17. 3. 2012, 21:41:55 · Upravil/a: ahoj
roboti006:
„Možná pomůže přidat ještě jedno = ??“ Ne, v tom to není. Nesnažím se chápat ty čtyři podmínky, co tam ověřuješ, ale myslím že problém bude v tom, že se ta kombinace AND a 2x OR chová jinak, než předpokládáš. Jde o logické operace stejné váhy, takže se asi vyhodnocují tak, jak jdou za sebou.. no nevím, ale než bych se namáhal nad tím uvažovat, radši závorkuju. Zazávorkuj si to taky, budeš mít jasno v tom, jak se to zpracovává. Jestli budu mít peníze a (budu mít hlad nebo budu mít žízeň), půjdu do hospody. => OK (Jestli budu mít peníze a budu mít hlad) nebo budu mít žízeň, půjdu do hospody. => Nesmysl Jestli budu mít peníze a budu mít hlad nebo budu mít žízeň, půjdu do hospody. => ? |
||
panther Profil |
ahoj:
„Jde o logické operace stejné váhy, takže se asi vyhodnocují tak, jak jdou za sebou“ plácáš. AND má před OR prioritu.
„(Jestli budu mít peníze a budu mít hlad) nebo budu mít žízeň, půjdu do hospody. => Nesmysl“ proč nesmysl? Logicky jsou ty závorky správně. „Jestli budu mít peníze a budu mít hlad nebo budu mít žízeň, půjdu do hospody. => ?“ žádný otazník, výsledek bude stejný jako u druhého tvrzení. roboti006: „Nebo stačí aby podmínka byla splněna jen v těch šesti písmenech?“ string a část stringu nejsou to samé. Toto je samozřejmě nesmysl. Nečetl jsem téma celé, ani jsem nezkoumal blíže ten tvůj kód, ale celá podmínka if($id == "clanek" && $_POST['nadpis']!=="" || $_POST['text']!=="" || $_POST['autor']!=="") je splněna tehdy, je-li:
- $_GET['id'] == 'clanek' nebo není prázdný POST['nadpis'] nebo - není prázdný POST['text'] nebo - není prázdný POST['autor'] Pokud je tedy vyplněn např. autor, podmínka je true .
Pravděpodobně jsi to chtěl zapsat takto: if($id == "clanek" && ($_POST['nadpis']!=="" || $_POST['text']!=="" || $_POST['autor']!=="")) , příp.
if($id == "clanek" && (!empty($_POST['nadpis']) || !empty($_POST['text']) || !empty($_POST['autor']))) |
||
ahoj Profil * |
#9 · Zasláno: 17. 3. 2012, 22:37:54
panther:
> „Jde o logické operace stejné váhy, takže se asi vyhodnocují tak, jak jdou za sebou“ > plácáš. AND má ped OR prioritu. No vida, tak to jsem nevěděl. V tom případě se omlouvám. > „(Jestli budu mít peníze a budu mít hlad) nebo budu mít žízeň, půjdu do hospody. => Nesmysl“ > proč nesmysl? Logicky jsou ty závorky správně. Nejsou. Když závorkuješ takhle, riskuješ, že půjdeš zbytečně, protože budeš mít žízeň, ale nebudeš mít peníze. |
||
roboti006 Profil * |
#10 · Zasláno: 18. 3. 2012, 12:54:07 · Upravil/a: roboti006
Takže by asi stačilo, abych nahradil || (nebo) s && (a), a tam dát isset(), nebo !empty(),
nebo, to uzavřít do závorky jako to udělal panther... [#8] panther Takže by asi stačilo, abych nahradil || (nebo) s && (a), a tam dát isset(), nebo !empty(), nebo, to uzavřít do závorky jako to udělal panther... [#8] panther |
||
panther Profil |
#11 · Zasláno: 18. 3. 2012, 12:58:59
roboti006:
„Takže by asi stačilo, abych nahradil || (nebo) s && (a)“ nestačilo (alespoň ne podle původní podmínky, resp. toho, jak jsem dotaz pochopil já). Ale zkusit jsi to mohl. „a tam dát isset(), nebo !empty(),“ tyto dvě podmínky nejsou stejné. Isset to bude vždy, pokud bude odeslán formulář, !empty to bude jen v případě, kdy bude vyplněna nějaká hodnota.
|
||
roboti006 Profil * |
#12 · Zasláno: 18. 3. 2012, 20:24:34
Aha :D no já jsem přidal ještě jednu podmínku !== "" a předělal || na && a už to jede... ;)
Ještě možná trochu mimo téma: Na stránkách využívám tag <pre> pro zobrazení zdrojových souborů,
ale když s textem v něm přesáhnu šířku nadřazeného prvku, normálně se píše... Jak je to možné, popř. je možné aby se nějak zalomily řádky samy i v tom PRE? A ještě jedna věc, hledám nějaký syntax highlighter, který by mi neznačil řádky, ani je nepočítal, jen by zvýraznil zápis... Existuje něco takového? Napadlo mě předělat nějaký highlighter, ale je to pro mně moc složité a asi ne moc legální... |
||
Someone Profil |
#13 · Zasláno: 18. 3. 2012, 20:31:34
Pro PHP stačí použít jednoduchou funkci highlight_string()
např.: <?php highlight_string(' <?php echo "Ahoj"; $promenna = "neco"; ?> '); ?> Vyzkoušej si. |
||
roboti006 Profil * |
#14 · Zasláno: 19. 3. 2012, 14:50:38
Tak díky všem moc! Už to funguje.
Someone: Je tady takový problém v použití highlight_string(), a to ten, že potřebuju aby se zvýraznil jen text v <pre> , a ne
celá proměnná (zápis z DB), napadlo mě použít regulérní výrazy, ale ty neovládám ani trochu, takže to by bylo nerealizovatelné. takže by bylo možná lepší použití JS než PHP... Tady to asi řešit nebudem, časem možná založím na toto další téma, pokud nenajdu řešení... :) |
||
Someone Profil |
#15 · Zasláno: 19. 3. 2012, 14:55:05
roboti006:
„a to ten, že potřebuju aby se zvýraznil jen text v <pre>“ <html> <head> nějaký obsah hlavičky bla bla bla </head> <body> nejspíš hlavička, menu atd atd.. obsah <pre> <?php highlight_string(' <?php echo "Ahoj"; $promenna = "neco"; ?> '); ?> </pre> </body> </html> |
||
roboti006 Profil * |
#16 · Zasláno: 19. 3. 2012, 15:45:52
Furt je tady:
Když dám do DB kód PHP, třeba to tvoje: <?php highlight_string(' <?php echo "Ahoj"; $promenna = "neco"; ?> '); ?> kód neměl vůbec vykonat... nebo snad jo? |
||
Someone Profil |
#17 · Zasláno: 19. 3. 2012, 15:48:41
roboti006:
„nebo snad jo?“ Jistě že ne, pokud texty taháš z DB, tak to takto udělat nelze. |
||
roboti006 Profil * |
#18 · Zasláno: 19. 3. 2012, 16:48:11
Tk v tom případě je to nesmysl, a já se musím porozhlédnout po lehce upravitelném, nebo
nějakém primitivnějším HighLighteru v JS ;) Díky všem... |
||
Časová prodleva: 12 let
|
0