Autor | Zpráva | ||
---|---|---|---|
leonek Profil |
#1 · Zasláno: 5. 2. 2017, 17:40:05
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 |
#2 · Zasláno: 5. 2. 2017, 18:00:21
leonek:
Dobre že si nám o tom dal vedieť. |
||
leonek Profil |
#3 · Zasláno: 6. 2. 2017, 09:09:56
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 |
#4 · Zasláno: 6. 2. 2017, 09:43:16
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 |
#5 · Zasláno: 6. 2. 2017, 09:45:27
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 |
#6 · Zasláno: 6. 2. 2017, 09:59:31
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 |
#7 · Zasláno: 6. 2. 2017, 10:03:34
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 |
#10 · Zasláno: 6. 2. 2017, 10:12:23
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 |
#11 · Zasláno: 6. 2. 2017, 10:18:43
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 |
#13 · Zasláno: 6. 2. 2017, 18:27:24
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 |
#14 · Zasláno: 6. 2. 2017, 18:56:58
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 |
#15 · Zasláno: 7. 2. 2017, 09:22:56
Lonanek:
Odpověď je druhá část [#11] leonek |
||
Radek9 Profil |
#16 · Zasláno: 7. 2. 2017, 09:57:45
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 |
#17 · Zasláno: 7. 2. 2017, 11:31:17
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 |
#18 · Zasláno: 7. 2. 2017, 12:43:06
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 |
#19 · Zasláno: 7. 2. 2017, 18:22:34
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) 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 |
#22 · Zasláno: 7. 2. 2017, 19:26:32
V ID to není.
|
||
Lonanek Profil |
|||
Keeehi Profil |
#24 · Zasláno: 7. 2. 2017, 19:39:37
|
||
Časová prodleva: 6 let
|
0