【问题标题】:MySQLi update query issue [duplicate]MySQLi更新查询问题[重复]
【发布时间】:2011-11-16 01:25:06
【问题描述】:

我的页面设置signin_time 将其设置为NOW(),当用户成功登录页面时将logged_in 设置为1。我想做的是在用户注销时将signout_time 设置为NOW()。为此,我使用以下查询

$stmt = $db->prepare("UPDATE `ulog` SET `logged_in`=0, `signout_time`=NOW(),`ckey`= '', `ctime`= '' WHERE user_id=? AND logged_in=1") or die($db->error);

我试图执行这个查询。它没有返回任何错误消息,但我也没有注意到 db 表有任何变化,php 错误日志也没有显示任何内容。

也许我有语法错误(我正在设置logged_in=0 where logged_in=1)。我不知道该怎么做。也许我应该搜索signout_time=0 所在的行?有什么建议么?

更新

这是整个函数:

function logout() {
    global $db, $wsurl;
    if (isset($_SESSION['user_id'])) {
        $userid = $_SESSION['user_id'];
        $stmt = $db->prepare("UPDATE `ulog` SET `logged_in`=0, `signout_time`=NOW() WHERE user_id=? AND logged_in=1") or die($db->error);
    } else {
        $userid = $_COOKIE['user_id'];
        $stmt = $db->prepare("UPDATE `ulog` SET `logged_in`=0, `signout_time`=NOW(),`ckey`= '', `ctime`= '' WHERE user_id=? AND logged_in=1") or die($db->error);
    }

    $stmt->bind_param("i", $userid) or die($stmt->error);
    $stmt->execute() or die($stmt->error);
    $stmt->close();
    $_SESSION = array(); //destroy all of the session variables}
    session_destroy();
    foreach ($_COOKIE as $c_id => $c_value) {
        setcookie($c_id, '', 1, "/");
    }

    header("Location: " . $wsurl);
}

【问题讨论】:

  • 您是否尝试将其包装在 try/catch 中?也许你的$userid 没有设置好。试试var_dump($userid),让我知道你得到了什么。
  • 在绑定之前,您是否仔细检查了 $userid 中的值?查询本身似乎很好。
  • 你的$user_id喜欢什么?
  • 我回显了它给我的真实号码的用户 ID

标签: php mysql mysqli prepared-statement


【解决方案1】:

你必须执行查询。

$userId = 1; // some number
$stmt->execute(array($userId));

或者您可以使用方法链接将它们组合成一个:

 $db->prepare(
     "UPDATE `ulog` SET `logged_in`=0, `signout_time`=NOW(),
     `ckey`= '', `ctime`= '' WHERE user_id=? AND logged_in=1"
 )->execute(array($userId));

另外,请确保您的 $userid 已设置。在上面写一个var_dump(),看看你会得到什么。

【讨论】:

  • 更新问题。请看一下。当然我会绑定用户 ID
  • 我回显了它给我的真实号码的用户 ID。为什么要阵列?它是 1 也是唯一的数字
【解决方案2】:

您是否尝试过不同的准备/执行方法,似乎我的做法与您的略有不同......不是说它一定会奏效,但我想值得一试

function logout() {

    global $db, $wsurl;

    if (isset($_SESSION['user_id'])) {

        $userid = $_SESSION['user_id'];
        $stmt = $db->prepare("UPDATE `ulog`
                              SET `logged_in` = 0,
                                  `signout_time` = NOW()
                              WHERE `user_id` = :userid
                              AND `logged_in` = 1") or die($db->error);

    } else {

        $userid = $_COOKIE['user_id'];
        $stmt = $db->prepare("UPDATE `ulog`
                              SET `logged_in` = 0,
                                  `signout_time` = NOW(),
                                  `ckey` = '',
                                  `ctime` = ''
                              WHERE `user_id` = :userid
                              AND `logged_in` = 1") or die($db->error);

    }

    $dataArray = array(':userid' => $userid);

    $stmt->execute($dataArray);
    $stmt->close();

    $_SESSION = array();
    session_destroy();

    foreach ($_COOKIE as $c_id => $c_value) {
        setcookie($c_id, '', 1, "/");
    }

    header("Location: " . $wsurl);

}

【讨论】:

  • 我不使用bind_param,而是通过数组执行。就像我说的,它只是略有不同。我只是把它扔在那里作为一种你可以尝试的方式,以防万一它出于某种原因工作,对不起。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2023-03-16
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多