/ / mysql_affected_rows czasami zwraca 0 zamiast 1 - mysql

mysql_affected_rows czasami zwraca 0 zamiast 1 - mysql

Mam dziwny problem ze skryptami php - mysql_affected_rows () czasami zwraca "0" bez powodu.

Jest podobne pytanie @ stackoverflow, a odpowiedź na to pytanie brzmi:

MySQL tylko aktualizuje wiersz, jeśli wystąpi zauważalna różnica przed aktualizacją i po aktualizacji.

Ale to nie jest mój przypadek. Na przykład, jeśli wartość przed aktualizacją to 1320402744 i wartość po aktualizacji to 1320402944 mysql_affected_rows () w każdym razie zwraca "0". Czy ta różnica nie jest wystarczająca?

Poniżej znajdują się 3 pliki. Jak widać, wszystkie pliki zawierają plik "functions.inc.php", który wywołuje funkcję "online ()".

Plik "login.php"działa poprawnie, wstawia nowy wiersz w tabeli" sesja "poprawnie.

Plik "content.php"działa poprawnie - wyświetla zawartość i poprawnie działa funkcja" online () w "functions.inc.php".

Potem nazywam plik "test.php"Usuwa" coś z cokolwiek odpowiedniego ", a następnie odświeża się (Nagłówek (" Location: / test.php ");) Po odświeżeniu jestem wylogowany.

Dodałem to do funkcji "online ()":

echo "affected_rows";

Powraca 0.

Dodałem więcej kodu do funkcji "online ():

$checkuser = mysql_query("SELECT userid FROM session WHERE userid = "" . $_SESSION["id"] . """) or die("Error");
$found = mysql_num_rows($checkuser);

echo $found;

$result = mysql_query("UPDATE session SET time="$ctime" WHERE userid="".$_SESSION["id"].""") or die("Error");
$affected_rows = mysql_affected_rows();
if ($affected_rows != 1) @session_destroy();

echo $affected_rows;

Wynik to 1 i 0.

Sprawdziłem bazę danych. Pole "czas" w tabeli sesji zostało zaktualizowane.

Więc nie mogę zrozumieć, jak to możliwe, że wiersz istnieje, aktualizuje się poprawnie, ale mysql_affected_rows (); 0i dlaczego dzieje się tak tylko wtedy, gdy ta sama strona została odświeżona.

functions.inc.php

<?php
@ob_start();@session_start();
@mysql_connect(C_HOST, C_USER, C_PASS) or die("Cant connect");
@mysql_select_db(C_BASE) or die("Cant select DB");

function online() {
$ctime = time()+1800;

if((isset($_SESSION["id"]))&&(is_numeric($_SESSION["id"]))) {

$query = mysql_query("UPDATE session SET time="$ctime2" WHERE userid="".$_SESSION["id"].""") or die("Error");
$affected_rows = mysql_affected_rows();
if ($affected_rows != 1) @session_destroy();
}
}

//many other functions go here

online();
?>

login.php

<?php
include_once "configuration.inc.php";
include_once "functions.inc.php";

//many things go here

$upd = mysql_query("INSERT INTO session VALUES ("" . $i["id"] . "","$ctime")") or die("Error2");
Header("Location: /content.php?justlogged=1");
die;
?>

content.php

<?php
include_once "configuration.inc.php";
include_once "functions.inc.php";
//many thing go here
echo "content";

?>

test.php

    <?php
include_once "configuration.inc.php";
include_once "functions.inc.php";

if (isset($_GET["tid"])&&(is_numeric($_GET["tid"]))){
$result = mysql_query("delete from some_table where something = "" . $_GET["tid"] . """) or die("Error123a");
Header("Location: /test.php");
die;
}

//file content

?>

Odpowiedzi:

1 dla odpowiedzi № 1

W Twoim function.inc.php ty dzwonisz online() - czas sesji zmienia się co sekundę. Ale czy to możliwe, że przełączasz się pomiędzy stronami (logowanie, zawartość, test) szybciej niż 1 sekunda? W takim przypadku czas byłby taki sam, a sesja zostanie zniszczona z powodu nienaruszonych wierszy

Edytować:

Tak. Tak jak myślałem.

Zobacz, jak to jest:

wywołujesz login.php: po pomyślnym zalogowaniu tworzy nową sesję z czasem X. Po tym nastąpi natychmiastowe przekierowanie do content.php (czas się kończy X), który dzwoni online jeszcze raz. I oczywiście, jak przekierowałeś natychmiast - czas jest taki sam ... więc już w punkcie content.php sesja jest już zniszczona, ponieważ czas się nie zmienił.