gpt4 book ai didi

php - MySQL 没有一致地更新行?

转载 作者:行者123 更新时间:2023-11-29 14:13:37 24 4
gpt4 key购买 nike

我有以下代码,它将 AJAX POST 发送到我的服务器上的 php 文件,以将一行添加到 MySQL 表中。当用户将某个项目标记为他们的最爱时,此函数就会运行:

$.ajax({
type: 'POST',
data: 'school='+school+'&token='+token,
url: 'http://www.codekraken.com/testing/snowday/database9.php',
success: function(data){
console.log(data);
},
error: function(){
console.log(data);
}
});

我还有一个类似的函数,当他们删除收藏夹时运行:

data: 'school=&token='+token,

这有效,但不一致。 PHP代码如下:

<?php
$server = "localhost";
$username = "";
$password = "";
$database = "";
$con = mysql_connect($server, $username, $password) or die ("Could not connect: " . mysql_error());

mysql_select_db($database, $con);

$token = $_POST["token"];
$school = $_POST["school"];

if (strlen($token) == 0){
die('Incorrect token');
}

if (strlen($school) == 0){
die('Invalid school name');
}

$sql = "INSERT INTO Snow (Token, School, Skip) ";
$sql .= "VALUES ('$token', '$school', '0') ON DUPLICATE KEY UPDATE School='$school'";

if (!mysql_query($sql, $con)) {
die('Error: ' . mysql_error());
} else {
echo "$token, $school = Success";
}

mysql_close($con);
?>

我所说的它不一致的意思是,如果我将一个项目标记为收藏夹,它将创建一行。如果我取消标记它,它会将 $school 更改为空。如果我随后标记不同的项目,它将更改为该项目。 如果,但是,我尝试将第一个项目标记为收藏夹,它不会更新,但会保留最后的更改。

因此,似乎它只是在每次发生新情况时更新该行,但如果该值已经存在,则不会更新该行,即使它当前不存在。

注意:Token被索引为UNIQUE PRIMARY

var school相关的JS代码:

function setFavorite() {
var threshold = {
x: 30,
y: 10
};
var originalCoord = {
x: 0,
y: 0
};
var finalCoord = {
x: 0,
y: 0
};

function touchMove() {
finalCoord.x = event.targetTouches[0].pageX;
changeX = originalCoord.x - finalCoord.x;
var changeY = originalCoord.y - finalCoord.y;
if (changeY < threshold.y && changeY > (threshold.y * -1)) {
changeX = originalCoord.x - finalCoord.x;
if (changeX > threshold.x) {
window.removeEventListener('touchmove', touchMove, false);
$(document).off("touchmove", ".row");
if ($(event.target).attr("class") === "row-inside") {
var element = $(event.target);
}
if ($(event.target).attr("class") === "row-l") {
var element = $(event.target).parent();
}
if ($(event.target).attr("class") === "row-r") {
var element = $(event.target).parent();
}
var text = $(element).find(".row-l").text();

var token = window.deviceToken;
var school = $(element).find(".row-l").text();

var favstatus = $(element).find(".row-r").text();
var thisStar = $(element).parent().find(".star-inside");
$(element).css("margin-left", "-75px");
if ($(thisStar).hasClass("favorite")) {
$.ajax({
type: 'POST',
data: 'school=&token=' + token,
url: 'http://www.codekraken.com/testing/snowday/database10.php',
success: function (data) {
console.log(data);
},
error: function () {
console.log(data);
}
});
$(".clear span").text("");
$(thisStar).removeClass("favorite");
localStorage.removeItem("favorite");
localStorage.removeItem("favorite-status");
} else {
$.ajax({
type: 'POST',
data: 'school=' + school + '&token=' + token,
url: 'http://www.codekraken.com/testing/snowday/database10.php',
success: function (data) {
console.log(data);
},
error: function () {
console.log(data);
}
});
$(".clear span").text("\"" + text + "\"");
localStorage.setItem("favorite", text);
localStorage.setItem("favorite-status", favstatus);
$(".star-inside").not(thisStar).removeClass("favorite");
$(thisStar).addClass("favorite");
}
setTimeout(function () {
$(element).css("margin-left", "0px");
}, 500);
setTimeout(function () {
$(document).on("touchmove", ".row", function () {
touchMove();
});
}, 800);
}
}
}

function touchStart() {
originalCoord.x = event.targetTouches[0].pageX;
finalCoord.x = originalCoord.x;
}
$(document).on("touchmove", ".row", function () {
touchMove();
});
$(document).on("touchstart", ".row", function () {
touchStart();
});
}

MySQL 输出:

CREATE TABLE `Snow` (
`Token` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`School` text COLLATE utf8_unicode_ci NOT NULL,
`Skip` int(1) NOT NULL,
PRIMARY KEY (`Token`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicod

最佳答案

我明白了。

问题似乎出在 Phonegap 缓存 AJAX 请求上。然后我想,如果我将 cache: false, 添加到 AJAX 请求中,就可以解决这个问题,但再一次,没有骰子。

然后我用谷歌搜索了一下,找到了让它工作的代码片段:

beforeSend: function(xhr) { xhr.setRequestHeader("Cache-Control", "no-cache"); xhr.setRequestHeader("pragma", "no-cache"); },

您将其放入 AJAX 请求中,因此它看起来像:

$.ajax({
cache: false,
beforeSend: function (xhr) {
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("pragma", "no-cache");
},
type: 'POST',
...
});
<小时/>

我不完全确定它是否可以在不设置 cache: false 的情况下工作,但我不想惹事生非。我还在我的 PHP 代码中指定了这些 header :

header("Expires: Tue, 01 Jul 2001 06:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

事实证明上面的内容是不必要的,但我会将其留在这里,以防对其他人有帮助。

关于php - MySQL 没有一致地更新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13060473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com