Autor Zpráva
roboti006
Profil *
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 ("<","&lt;",$text);
    $text = str_replace (">","&gt;",$text);
    $text = str_replace ("]",">",$text);
    $text = str_replace ("[","<",$text);
    $text = str_replace ("\n","<br/>",$text);
    $text = str_replace ("'","&quot",$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
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 *
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 *
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 ("<","&lt;",$text);
$text = str_replace (">","&gt;",$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 ("'","&quot",$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 ("<","&lt;",$text);
    $text = str_replace (">","&gt;",$text);
    $text = str_replace ("]",">",$text);
    $text = str_replace ("[","<",$text);
    $text = str_replace ("\n","<br/>",$text);
    $text = str_replace ("'","&quot",$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 *
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 *
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 *
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 *
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 *
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
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 *
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
Pro PHP stačí použít jednoduchou funkci highlight_string()
např.:
<?php
highlight_string('
    <?php
        echo "Ahoj";
        $promenna = "neco";
    ?>
');
?>

Vyzkoušej si.
roboti006
Profil *
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
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>
Kde je problém?
roboti006
Profil *
Furt je tady:
Když dám do DB kód PHP, třeba to tvoje:
<?php 
highlight_string('
    <?php
        echo "Ahoj";
        $promenna = "neco";
    ?>
');
?>
a potom to budu načítat z DB jako proměnnou, tak by se
kód neměl vůbec vykonat... nebo snad jo?
Someone
Profil
roboti006:
nebo snad jo?
Jistě že ne, pokud texty taháš z DB, tak to takto udělat nelze.
roboti006
Profil *
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...

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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