Autor | Zpráva | ||
---|---|---|---|
Trax Profil |
Ahoj lidi,
už několik hodin sedím nad tímto problémem a nikde nevidím chybu. Prosím poraďte. Vypisuji položky z databáze a u každé položky mám odkaz s daným id. Po kliknutí na odkaz přecházím na stránku, kde mám následující problém: <?php $upravitslevu_escape_id = mysqli_real_escape_string($spojeni, $id_zaznamu); $vysledek_sleva_aktivni = mysqli_query($spojeni, "SELECT `aktivni` FROM `slevy_en` WHERE `id`='".$upravitslevu_escape_id."' LIMIT 1") or die(mysqli_error($spojeni)); $zaznam_sleva_aktivni = mysqli_fetch_array($vysledek_sleva_aktivni); if ($zaznam_sleva_aktivni["aktivni"]=="0") {$upravitslevu_aktivni = 1;} elseif ($zaznam_sleva_aktivni["aktivni"]=="1") {$upravitslevu_aktivni = 0;} $upravitslevu_escape_aktivni = mysqli_real_escape_string($spojeni, $upravitslevu_aktivni); $sql = "UPDATE `slevy_en` SET `aktivni`='".$upravitslevu_escape_aktivni."' WHERE `id`='".$upravitslevu_escape_id."' LIMIT 1"; mysqli_query($spojeni, $sql) or die(mysqli_error($spojeni)); echo ($sql); ?> echo vypisuje: UPDATE `slevy_en` SET `aktivni`='0' WHERE `id`='2' LIMIT 1 správné hodnoty (i obráceně), ale v DB se nic nezmění. Potřebuji, aby se mi u dané položky upravila hodnota v databázi ve sloupci aktivni z 1 na 0 a naopak. Jednoduše řečeno potřebuji, aby se po kliknutí na odkaz daná položka aktivovala (aktivni=1) nebo deaktivovala (aktivni=0). Je mi jasný, že chyba bude mezi klávesnicí a židlí, ale už jsem z toho zoufalej. Díky za pomoc. :) |
||
Fisir Profil |
#2 · Zasláno: 24. 5. 2015, 19:24:32
Reaguji na Traxe:
A připojení k DB v tom skriptu máš? (Jestliže sloupce aktivni a id jsou čísla, pak se okolo jejich hodnot nepíší uvozovky a pro jejich escapování stačí funkce intval() .)
|
||
juriad Profil |
#3 · Zasláno: 24. 5. 2015, 19:30:23
Trax:
Navíc vůbec není nutné pokládat napřed SELECT. Uvědom si, že pokud tam byla 1, tak 1 - aktivni bude 0 a naopak.
$sql = " UPDATE `slevy_en` SET `aktivni` = 1 - `aktivni` WHERE `id` = " . intval($id_zaznamu) . " LIMIT 1"; Když ten dotaz zkopíruješ a spustíš manuálně v nějakém adminu, tak funguje? |
||
Trax Profil |
#4 · Zasláno: 24. 5. 2015, 19:43:54
Fisir:
Přípojení je v pořádku, protože v určitých pokusech se mi podařilo změnit údaj. Tam problém nejspíš nebude. Ale děkuji za tip na intval() ani jsem si neuvědomil. :) juriad: $sql = "UPDATE `slevy_en` SET `aktivni` = 1 - `aktivni` WHERE `id`=".intval($id_zaznamu)." LIMIT 1"; mysqli_query($spojeni, $sql) or die(mysqli_error($spojeni)); echo ($sql); pochopil jsem to správně? (moc jsem to nepochopil) Protože ani tohle mi také nefunguje... |
||
juriad Profil |
#5 · Zasláno: 24. 5. 2015, 19:47:25
Trax:
Ano, takto. Co ta posdlední otázka? „Když ten dotaz zkopíruješ a spustíš manuálně v nějakém adminu, tak funguje?“ |
||
Trax Profil |
#6 · Zasláno: 24. 5. 2015, 19:55:08
juriad:
Když v Phpmyadminu dám sql dotaz UPDATE `slevy_en` SET `aktivni` = 1 - `aktivni` WHERE `id` = 2 LIMIT 1 tak mi to vyhodí "0 řádků ovlivněno" takže nefunguje |
||
juriad Profil |
#7 · Zasláno: 24. 5. 2015, 20:00:43
Trax:
A co dotaz: SELECT * FROM `slevy_en` WHERE `id` = 2 Máš tam opravdu záznam s id = 2? |
||
Trax Profil |
#8 · Zasláno: 24. 5. 2015, 20:09:38
juriad:
Tak se omlouvám, dotaz v adminu funguje... zapomněl jsem, že jsem mezi tím přidal nové záznamy a ty staré smazal. Nicméně z webu pořád nic. :/ |
||
Trax Profil |
#9 · Zasláno: 25. 5. 2015, 10:10:36
Zajímavé ale je, že když zapíšu dotaz tak jak doporučil juriad tedy:
$sql = "UPDATE `slevy_en` SET `aktivni`=1-`aktivni` WHERE `id`=".intval($id_zaznamu)." LIMIT 1"; mysqli_query($spojeni, $sql) or die(mysqli_error($spojeni)); tak se nic neděje.. záznam v DB se nezmění i když echo($sql) vypisuje správný zápis. Když ale vymění část `aktivni`=1-`aktivni` za `aktivni`=1 nebo za `aktivni`=0, údaj v DB se změní: $sql = "UPDATE `slevy_en` SET `aktivni`=1 WHERE `id`=".intval($id_zaznamu)." LIMIT 1"; mysqli_query($spojeni, $sql) or die(mysqli_error($spojeni)); |
||
Kajman Profil |
#10 · Zasláno: 25. 5. 2015, 10:46:43
Pokud v mysql dáte update na hodnotu 1 a ve sloupci je již hodnota 1, tak mysql zahlásí, že se nezměnily žádné řádky. (Některé jiné databáze to berou jako změnu.)
|
||
Trax Profil |
#11 · Zasláno: 25. 5. 2015, 14:00:54
Kajman:
Aha a jak tedy mohu tento problém vyřešit? Krom toho já měním hodnotu z 0 na 1 a naopak. |
||
Trax Profil |
#12 · Zasláno: 25. 5. 2015, 17:58:43
Také je divné, že když použiji následující kód:
$sql = "UPDATE `slevy_en` SET `aktivni`=1-`aktivni` WHERE `id`=".intval($id_zaznamu)." LIMIT 1"; mysqli_query($spojeni, $sql) or die(mysqli_error($spojeni)); echo($sql); (v databázi se nic nezmění) a výpis $sql pak zkopíruji do PhpMyAdmina, údaj mi to bez problému změní. Normálně bych si myslel, že je problém v připojení, ale jak jsem již psal: pokud zaměním: SET `aktivni`=1-`aktivni` za SET `aktivni`=1 (popř. 0), údaj se změní. V čem by tedy mohla být chyba? |
||
Kubo2 Profil |
|||
Trax Profil |
#14 · Zasláno: 27. 5. 2015, 07:56:46
Kubo2:
Rád bych, ale nějak se v tom prostředí nevyznám (http://sqlfiddle.com/#!9/c33a0/9). Krom toho jsem ještě zjistil, že když kliknu na onen odkaz, jenž odkazuje na stránku s daným skriptem, tak skript nic nevykoná, ale pokud na ten odkaz kliknu dvojklikem. Tak se údaj v DB změní. |
||
Kajman Profil |
#15 · Zasláno: 27. 5. 2015, 10:05:14
Zkuste si dát do toho php nějaké jednoduché logování do souboru, třeba čas. Ať odfiltrujete možnost, že se změna aktivity děje vícekrát, než si myslíte.
|
||
Časová prodleva: 6 dní
|
|||
Trax Profil |
#16 · Zasláno: 2. 6. 2015, 11:10:26
Kajman:
Nějak nerozumím důvodu, proč by to bylo dobré. Pokud se mi nezapisují data do databáze a do souboru si při každém takovém "zápisu" zapíši do souboru čas, v čem mi to pomůže? Resp. jak odhalím příčinu chyby? Děkuji. :) |
||
Kajman Profil |
#17 · Zasláno: 2. 6. 2015, 12:38:30
Podle logu ohalíte, zda update proběhl 0x nebo 2x. Podle stavu databáze to nepoznáte.
|
||
Časová prodleva: 10 let
|
0