2012-10-25 32 views
0

我有下面的代碼,它向我的服務器上的php文件發送一個AJAX POST,以將一行添加到MySQL表中。當用戶標記的項目是他們最喜歡這一功能獲取運行: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更改爲無。如果我然後標記不同的項目,它將更改爲該項目。 IF,但是,我嘗試將第一個項目標記爲最愛,它不會更新,但會保留最後一次更改。

因此,它似乎只是在每次發生新事情時才更新行,但如果該值已經存在,即使它不是當前存在的,也不會。

注:Token被索引爲UNIQUE PRIMARY

JS代碼,涉及到var school

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 
+1

而不是根據邏輯用戶操作來解釋這些,這些操作很難理解您的意思,請給我們提供您調用腳本的確切參數以及結果(包括腳本輸出)的示例。向我們展示您調用腳本的示例,並獲得與您想要的結果不同的結果。 –

+0

腳本輸出總是正確的輸出'2012-10-24 22:04:00.693下雪天[1651:907] [INFO] TOKEN,SCHOOL =成功',其中TOKEN和SCHOOL是實際值。 JS被稱爲你如何看待它。當你點擊'div'時,它會運行第一個腳本,發送請求,然後將它添加爲收藏夾。然後再次點擊將其刪除,並運行JS的第二部分,將SCHOOL設置爲無。它全部發布到PHP腳本,它返回上面的輸出。就像我說的那樣,一旦它被更新爲先前的值,它就不會更新該行。 – Charlie

+0

我們需要看看變量'school'是如何在JS中定義的。它從哪裏收集,以及它可能遇到什麼潛在的碰撞。 –

回答

1

我計算出來。

該問題似乎與Phonegap緩存AJAX請求。然後我想如果我將cache: false,添加到AJAX請求中,它會解決它,但是再一次,沒有骰子。

我再繞了一下Google搜索,發現了一段代碼,使得它的工作:

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("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"); 

原來上面的眼前是不是nescesary,但它可以幫助別人,我會離開這裏的情況。