Autor Zpráva
one
Profil
Zdravim,
Zase uz resim jeden trivialni problem a nemuzu s nim hnout.
Potřebuju při odhlášení uživatele v databázi nastavit online na 0 (při přihlášení se úspěšně nastaví na 1)

pokus 1)
function Logout($user) {
global $db;
$online = $db->sql_query("UPDATE account SET online='0' WHERE id='$userid'");
unset($user);
setcookie("user", false);
$user = "";
header("Location: users.php");
}

pokus 2)
$online = $db->sql_query("UPDATE account SET online='0' WHERE id='$userid'");
function Logout($user) {
if($db->sql_numrows($online) == 1){
global $db;
$online = Mysql_Query("UPDATE account SET online='0' WHERE id='$userid'");
unset($user);
setcookie("user", false);
$user = "";
header("Location: users.php");
}
}

kvuli memu zoufalstvi uz jsem zkousel opravdu vsechno, ale bohuzel, muzete mi prosim pomoct? diky ;)
Alphard
Profil
jaký datový typ má sloupec obline a id? je to určitě řetězac?
vypiš si mysql_error()
Mika
Profil
one
1. pokud ukladas neco do sloupce typu integer (číslo) - jako že by to tak mělo být, tak tam necpi apostrofy.


"UPDATE account SET online=0 WHERE id=".$userid


2.
funkci předáváš proměnnou $user, ale v databázi měníš hodnotu tam, kde se id= $userid, tu proměnnou ($userid) bereš odkud?
one
Profil
1. nepomohlo

2. ta promenna $userid se bere z cookie:
$cookie_read = explode("|", base64_decode($user));
$userid = $cookie_read[0];
....
Mika
Profil
one
Zkus teda te funkci predat 2 parametry


function Logout($user, $userid) {
global $db;
$online = $db->sql_query("UPDATE account SET online=0 WHERE id=".$userid);
...


a pri volani funkce musis vlozit oba parametry, $user i $userid

EDIT: hlavne si pohlídej to, aby sloupce id a online byli v databazi definovany jako int (ciselná hodnota)!
one
Profil
:(
zkusil jsem to presne jak jsi napsal, a nefunguje to, uz opravdu nevim cim to muze byt,
jinak v db mam online a id jako int
nightfish
Profil
one
$online = $db->sql_query("UPDATE account SET online=0 WHERE id=".$userid);
nahraď za
$online = $db->sql_query($q="UPDATE account SET online=0 WHERE id=".$userid);
echo $q;

a podívej se, jestli se do toho dotazu doplňuje správná hodnota $userid
a pro jistotu ještě error_reporting(E_ALL), aby ti to vypisovalo hlášení v případě přístupu k nedefinované proměnné apod.
one
Profil
tohle uz jsem prave zkousel, to take nejde, zacinam uvazovat o tom ze chyba bude nekde jinde
nightfish
Profil
tohle uz jsem prave zkousel, to take nejde
co jsi zkoušel a jak se projevuje to, že to nejde? co to píše? sorry, ale se svým přístupem se asi jen tak k řešení nedostaneš...
one
Profil
no jelikoz se s tim uz trapim skoro 2dny tak jsem se obratil na tuhle diskusi...
Prave ze to nedela nic, proste se to normalne odhlasi ale v databazi se nenastavi tomu uzivateli online na hodnotu 0
jinak zadne chybove hlasky to nepise
nightfish
Profil
tak mě napadá, že tenhle kus kódu (z původního pokusu 2) asi nebude úplně fungovat
$online = $db->sql_query("UPDATE account SET online='0' WHERE id='$userid'");

function Logout($user) {
if($db->sql_numrows($online) == 1){
global $db;

protože v té podmínce není proměnná $db definovaná...

prostě když máš podmínku, u které si nejsi jistý, zda-li projde nebo ne, dej si do ní třeba
echo "test"; a jakmile se ti to vypíše, tak víš, že podmínka byla splněna

EDIT: kdyžtak sem vlož aktuální kód, který nefunguje
one
Profil
takže pro test jsem to takto upravil:

function Logout($user) {
global $db;
$online = $db->sql_query("UPDATE account SET online=0 WHERE id=".$userid);
if($db->sql_numrows($online) == 1){
echo "funguje to!";
}else{
echo "nefunguje to!";
exit();
}
}

ale stale to pise ze to nefunguje, zatim budu jeste neco zkouset
nightfish
Profil
zkus to takhle:

function Logout($user) {

global $db;
global $userid;
$online = $db->sql_query($q="UPDATE account SET online=0 WHERE id=".$userid);
echo $q."<br>";
echo mysql_error()."<br>";
echo "Pocet ovlivnenych radku: ".mysql_affected_rows()."<br>";
if($db->sql_numrows($online) == 1){
echo "funguje to!";
}else{
echo "nefunguje to!";
exit();
}
}


co to vypíše?
one
Profil
UPDATE account SET online=0 WHERE id=
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Pocet ovlivnenych radku: -1
nefunguje to!
nightfish
Profil
one
hmm, takže celý problém spočívá v tom, že proměnná $userid nemá hodnotu, kterou by mít měla...
takže je potřeba to pošéfovat tak, aby se $userid nastavilo správně... mohla by pomoct část kódu z tvého příspěvku z 13:17
one
Profil
v tom bych problem nevidel, protoze promennou $userid pouzivam skoro v kazdem dotazu a zatim bez problemu az na tento pripad, tady dam pro priklad kus kodu prihlaseni:

.....
$sql = $db->sql_query("SELECT * FROM account WHERE username='$username' AND password='$md5_pass' and banned='0'");
$login_check = $db->sql_numrows($sql);

////////////////////////////////////////////////////////////////////// /
//jestliže jsou zadané informace v pořádku, hráč se přihlásí a nastaví se cookies
if($login_check > 0){

while($row = $db->sql_fetchrow($sql)){

$userid = $row['id'];
$username = $row['username'];
$password = $row['password'];
$ipaddress = $row['last_ip'];

$lastlogin = explode(" ", $row['lastlogin']);
$lastlogin_date = $lastlogin[0];
$lastlogin_time = $lastlogin[1];

$info = base64_encode("$userid|$username|$password|$ipaddress|$lastlogin_date| $lastlogin_time");
if (isset($remember)){
setcookie("user","$info",time()+1209600);
}else{
setcookie("user","$info",0);
}
$db->sql_query("UPDATE account SET last_ip='$REMOTE_ADDR', last_login=NOW(), failed_logins='0' online='1' WHERE id='$userid'");
....
nightfish
Profil
v tom bych problem nevidel
je mrzuté, že v tom problém nevidíš, i když tam opravdu je

pokud to správně chápu, mohlo by stačit do té funkce logOut přidat řádky
$cookie_read = explode("|", base64_decode($user));
$userid = $cookie_read[0];
(za předpokladu, že parametr $user obsahuje base64-enkódovaný obsah té cookie)

EDIT: nastuduj si něco o rozsahu platnosti proměnných (variable scope) - lokální, globální, superglobální - není to v tomto případě na škodu a pomůže ti to pochopit podstatu chyby
one
Profil
Dobry, uz jsem to konecne vyresil podle jineho identifikatoru, protoze nevim proc nefungovalo to userid
ted to delam podle ip a uz to funguje, mozna na to casem prijdu, kde byla chyba ;)
Toto téma je uzamčeno. Odpověď nelze zaslat.