Autor Zpráva
leonek
Profil
Podmínkou balik != $balik chci zajistit aby se to neprovedlo podruhé když aktualizuji stránku. Ale nefunguje to:

mysql_query("UPDATE tabulka SET balik = '".$balik."' WHERE id = '".$id."' AND (balik != '".$balik."' OR balik is NULL) LIMIT 1");
pcmanik
Profil
leonek:
Dobre že si nám o tom dal vedieť.
leonek
Profil
pcmanik:
Pokud mi nechcete pomoct tak sem prosím nic nepište. Tohle není Facebook. Děkuji.

Nechápu, že když aktualizuji stránku a v proměnné $balik je to same jako v buňce tabulky se stejným názvem, že to projde. Jako by tam ten operátor != nebyl.
Radek9
Profil
leonek:
Pokud mi nechcete pomoct tak sem prosím nic nepište. Tohle není Facebook. Děkuji.
Tak se nauč rozumně vyjadřovat. Za prvé bys nám sem mohl poslat větší kus kódu, abychom věděli, kde se ty proměnné berou. Za druhé by bylo vhodné, abys nám popsal, co konkrétně se v DB děje a co by se nopak správně dít mělo. Ideálně nám poskytni nějaký výpis z DB. To, že řekneš, že to projde, úplně nestačí.
Tomášeek
Profil
leonek:
Pokud mi nechcete pomoct tak sem prosím nic nepište.
Formálně vzato, na nic jsi se nezeptal. Ani jsi nezvolil nejzdvořilejší formu, ptáš-li se.

Na první pohled v dotazu nic špatně nevidím, měl by fungovat. Když si ho vypíšeš echem, jak vypadá? Jakého typu je sloupec balik?
leonek
Profil
Všechno už jsem zkontroloval. Obsah proměnné je totožný s obsahem sloupce (což by mělo být jasné z toho, že se to do něj z té samé proměnné ukládá...).

Tomášeek:
Jakého typu je sloupec balik?
varchar(100), kodování UTF8_general_ci
Tomášeek
Profil
leonek:
Jak vypadá ten dotaz, když ho vypíšeš echem?
Kajman
Profil
leonek:
Moc netuším, jak detekujete, zda se to znovu provedlo či ne. Na konci by měla být vždy ve sloupci balik obsah proměnné $balik (pokud ji předtím dobře escapujete a do pole se vejde) bez ohledu na to, zda tam už dříve byla nebo ne. Není tedy spíše problém s nastavovaním a escapováním proměnné $balik? Zkuste si vypsat sestavený dotaz, jak radí Tomášeek.
leonek
Profil
UPDATE tabulka SET balik = 'CV029222553CZ' WHERE id = '154602' AND (balik != 'CV029222553CZ' OR balik is NULL) LIMIT 1
Tomášeek
Profil
leonek:
Dotaz je v pořádku, Kajman dobře nadnesl, jak jsi si jistý, že UPDATE proběhl znovu?

Pokud máš možnost testovat, když zadáš ručně do PMA

UPDATE tabulka SET balik = 'abc' WHERE id = '154602' AND (balik != 'CV029222553CZ' OR balik is NULL) LIMIT 1

uvidíš při pohledu do DB změnu? Neměl bys, dotaz by se vykonat neměl (stejně jako ten tvůj původní). Eventuálně za tebou položený dotaz vypsat affected_rows, měla by to být nula.
leonek
Profil
Tomášeek:
jak jsi si jistý, že UPDATE proběhl znovu?
Dotaz je v proměnné, kterou si nechám vypsat. Vypíše se vždy: 1

Pokud máš možnost testovat, když zadáš ručně do PMA
Stejný výsledek. Provedlo se to a obsah buňky se změnil na 'abc'.
Radek9
Profil
leonek:
Dotaz je v proměnné, kterou si nechám vypsat. Vypíše se vždy: 1
Myslíš výsledek funkce mysql_query? Tak ta nevrací počet řádků, které ovlivnila, ale true v případě úspěchu (i kdyby žádný řádek neovlivnil) a false v případě chyby. K počtu ovlivněných řádků je již zmíněná funkce mysql_affected_rows.

Další věc: nepoužívej mysql_* funkce. V rámci PHP 5.5 jsou zastaralé a v rámci PHP 7 již odstraněné. Podívej se na MySQLi nebo na PDO. Rovnou se vyhneš i té naprosto zjevné SQL injection.
leonek
Profil
Dobrá, přešel jsem na MySQLi a funguje to. Neřeší to ovšem absurdní nefunkčnost triviálního balik != $balik. Nicméně děkuji, byl jsem donucen přejít na novější standart, čemuž jsem se usilovně bránil, ale já se s tím poperu.
Lonanek
Profil
leonek:
Neřeší to ovšem absurdní nefunkčnost triviálního balik != $balik.
Jak víte, že je to nefunkční. Neregistruji odpověď na dotaz [#12] Radek9.
leonek
Profil
Lonanek:
Odpověď je druhá část [#11] leonek
Radek9
Profil
leonek:
Já bych opravdu rád věděl, jak ověřuješ, že se ten update provedl. Používáš k tomu výsledek funkce mysqli_query, nebo mysqli_affected_rows? Použití by mělo vypadat takhle:

$link = mysqli_connect();

$balik = mysqli_real_escape_string($link, $balik);
$id = mysqli_real_escape_string($link, $id);

mysqli_query($link, "UPDATE tabulka SET balik = '" . $balik . "' WHERE id = '" . $id . "' AND (balik != '" . $balik . "' OR balik is NULL) LIMIT 1");
echo mysqli_affected_rows($link); // Opravdu vypíše 1? Pochybuji.
leonek
Profil
Radek9:
Když se podíváš na původní dotaz, o kterém se celou dobu bavím tak ten je psán v MySQL. Jeho provedení jsem si jist tím, že jednoduše nechám vypsat obsah DB buňky balík do mého redakčního systému, po tomto dotazu:
UPDATE tabulka SET balik = 'abc' WHERE id = '154602' AND (balik != 'CV029222553CZ' OR balik is NULL) LIMIT 1

Ten by se správně provést neměl protože obsah buňky balik před provedením tohoto dotazu je 'CV029222553CZ'.
Kajman
Profil
V původním dotaze máte stejnou hodnotu v set a ve where. A stěžujete si, že se provede i podruhé po refreshi. Proto nás zajímá, jak detekujete, že poprvé se udpate provedl a podruhé také. Po obou volání by přeci měla být v databázi stejná hodnota bez ohledu na to, zda to voláte poprvé nebo podruhé (vzhledem k tomu, že tam máte statické stringy a nepoužíváte v dotaze např. předešlou hodnotu sloupce).

Nemáte v tom obsahu sloupce navíc nějaký bílý znak (mezera, enter), který pří výpisu do redakčního systému nevidíte?


Nejlepší bude, když nachystáte tabulku i s hodnotou problematického řádku např. na sqlfiddle.com a ukážete nefunkčnost dotazu tam. Do Vaší databáze ani do php kódu nevidíme a v uvedeném kousíčku kódu problém nebude.
Lonanek
Profil
leonek:
Zkušebně jsem provedl test obdobného dotazu v Admineru (obdoba PMA):
UPDATE pokus SET text1 = 'abc' WHERE id = '1' AND (text1 != 'CV123456xR' OR text1 is NULL)
Výsledek dotazu:
Příkaz proběhl v pořádku, bylo změněno 0 záznamů. (0.001 s)
Sloupec text1 obsahuje CV123456xR

Následně dotaz:
UPDATE pokus SET text1 = 'abc' WHERE id = '1' AND (text1 != 'CV123456x' OR text1 is NULL) tedy bez R na konci
Výsledek dotazu:
Příkaz proběhl v pořádku, byl změněn 1 záznam. (0.001 s)
Sloupec text1 obsahuje abc

Výsledkem je zjištění, že dotaz je v pořádku, což se Vám zde celou dobu všichni snažíme sdělit. Chyba je zjevně v jiné části kódu.
leonek
Profil
Dobře, ještě jednou. Jednoduchá otázka na ano nebo ne:
Když buňka tabulky balik (varchar 100 utf8_general_ci) obsahuje 'CV029222553CZ' a ja v PMA nechám provést tento dotaz:
UPDATE tabulka SET balik = 'abc' WHERE id = '154602' AND (balik != 'CV029222553CZ' OR balik is NULL) LIMIT 1

Příkaz proběhl s výsledkem jednoho ovlivněného řádku. Je to v pořádku?
Lonanek
Profil
NE.

Opravdu ID zmiňovaného záznamu je 154602? ID je číslo, nemusí tedy být v apostrofech.
leonek
Profil
V ID to není.
Lonanek
Profil
Viz poslední odstavec [#18] Kajman.
Takhle tady můžeme diskutovat do nekonečna. Prostě a jednoduše je to správně zapsané viz [#19] Lonanek
Keeehi
Profil
ideone.com/TvpCfs

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: