完成之前PHP重定向MySQL插入

时间:2017-10-28 12:29:28

标签: php mysql redirect race-condition

我在" insert.php":

上有这个代码
if ($stmt = $GLOBALS['mysqli']->prepare("INSERT INTO table1(iduser, title, msg, anonim, ip, iduniversity) VALUES (?,?,?,?,?,?)")) {
    $stmt->bind_param("issisi", $_SESSION['iduser'], $_POST['title'], $_POST['msg'], $anonim, getIP(), $_SESSION['iduniversity']);
    if ($stmt->execute()) {
        $idmsg = $GLOBALS['mysqli']->insert_id;
        $i = 0;
        $stmt2 = $GLOBALS['mysqli']->prepare("INSERT INTO tag(idmsg, tag) VALUES(?,?)");
        foreach ($tags as $tag) {
            if ($tag != '') {
                $stmt2->bind_param("is", $idmsg, $tag);
                if ($stmt2->execute()) {
                    $i++;
                }
            }
        }
        $stmt2->close();
        $stmt->close();
        mysqli_close($GLOBALS['mysqli']);
        sendFile($idmsg);
        header("Location: /public/watch_msg.php?idmsg=" . $idmsg);
        exit();
    } else {
        exit("Ops! Ocorreu algum erro. COD1370");
    }
} else {
    exit("Ops! Ocorreu algum erro. COD1371");
}

所以,一切都运行良好,除了有时当它重定向到" watch_msg.php"该消息似乎还没有出现在数据库中。当发生这种情况时,只要我刷新页面,一切都在那里!

我首先想到的是某个地方可能存在竞争条件,但我在另一个问题中读到PHP是顺序的,并且在重定向之前我关闭了两个语句和连接(以便使用的表应该被解锁),为什么我会在某些时候得到这个结果?我做错了什么?

此外,没有任何功能可以输出任何内容,但是" sendFile"如果用户发送图像,则保存图像,因此标题应该没问题(当我评论函数时,它也会给我错误。)

watch_msg上的代码:

$msg = NULL;
$tags = NULL;
$coments = NULL;
$data_high = date("Y-m-d H:i:s");
$iduser;

if ($loggedin) { //If logged in
    $idmsg = filter_input(INPUT_GET, 'idmsg', FILTER_SANITIZE_STRING);
    $iduser = $_SESSION['iduser'];
    $query = "SELECT * FROM table1 WHERE iduser = ? AND idmsg = ? AND datemsg < ?";
    $stmt = $GLOBALS['mysqli']->prepare($query);
    $stmt->bind_param("iis", $iduser, $idmsg, $data_high);
    if ($stmt->execute()) {
        $msg = mysqli_fetch_assoc($stmt->get_result());
        if ($msg === NULL) {
            exit('This message doesn\'t exists');
        }
        ...
    } else {
        echo "Error.";
    }
} 

0 个答案:

没有答案