mysql_affected_rows有时会返回0而不是1

时间:2011-11-04 09:03:36

标签: mysql

我对php脚本有一个奇怪的问题 - mysql_affected_rows()有时会无缘无故地返回“0”。

有一个类似的问题@stackoverflow,这个问题的答案是:

如果在updat之前和之后会有明显的差异,MySQL实际上只会更新一行。

但这不是我的情况。例如,如果更新前的值为1320402744 且更新后的值为1320402944 ,则mysql_affected_rows()仍然返回“0”。这种差异不够明显吗?

以下是3个文件。如您所见,所有文件都包含文件“functions.inc.php”,它调用函数“online()”。

文件“ login.php ”工作正常。它正确地在“session”表中插入一个新行。

文件“ content.php ”工作正常 - 它显示内容并在“functions.inc.php”中正确运行“online()”函数。

然后我调用文件“ test.php ”。它正确删除了“某些东西”。然后它刷新自己(Header(“Location:/test.php”);)。刷新后我就注销了。

我将此添加到“online()”函数:

echo "affected_rows";

返回 0

我在“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;

结果是 1 0

我查了一下数据库。会话表中的“时间”字段已更新。

所以,我无法理解该行是如何存在的,它正确更新但是mysql_affected_rows();返回 0 ,以及为什么只有在刷新同一页面时才会发生这种情况。

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

    ?>

1 个答案:

答案 0 :(得分:1)

在您致电function.inc.php的{​​{1}}中 - 会话时间每秒都会更改一次。但是,你是否可以更快地在1秒之间切换页面(登录,内容,测试)?在这种情况下,时间会相同,并且因为未受影响的行而导致会话被破坏

修改

是。我想。

看看它是怎么来的:

您调用login.php:成功登录后,它会创建时间为online()的新会话。在此之后,您会立即重定向到content.php(时间仍为X),再次调用X。当然,当你立即重定向时 - 时间是一样的......所以在online会话点已经被破坏了,因为时间没有改变。