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
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
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";
Jinak také nevidím důvod, proč by to nemělo fungovat. MySQL je hodně benevolentní vůči používání řetězců místo čísel.

Když ten dotaz zkopíruješ a spustíš manuálně v nějakém adminu, tak funguje?
Trax
Profil
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
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
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
Trax:
A co dotaz:
SELECT * FROM `slevy_en` WHERE `id` = 2

Máš tam opravdu záznam s id = 2?
Trax
Profil
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
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
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
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
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:
Nebolo by zlé tú situáciu nasimulovať. Pokiaľ dáš (1-`aktivni`) do zátvoriek, funguje to?
Trax
Profil
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
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.
Trax
Profil
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
Podle logu ohalíte, zda update proběhl 0x nebo 2x. Podle stavu databáze to nepoznáte.

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: