0

我正在制定一个清单,用户可以在点击它的同时设置 4 个不同的选项。当您单击一次时,它是绿色并显示“ok”,再次显示灰色和“N/A”,然后是白色和空白。在它再次开始变为绿色和“OK”之后,每次我用值 1、2、3 或 0 更新我的数据库时,每种可能性。javascript 工作得很好,每次我点击 For the update of the database 时,所有浏览器中的颜色和文本都会正确更新,它也可以正常工作,直到我回到数据库中的白色或 0。我单击,它更新为 1,然后是 2,然后是 3,然后是 0,然后当你应该得到 1 时它不再更新它了。我的chrome没有这个问题。

这是Javascript代码:

function CheckLog(TDCheck,ID){ 
var url;
var Color;
var Status;
var Text;
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null)
 {
 alert ("Browser does not support HTTP Request");
 return;
 }
 var TD = document.getElementById("TDCheck"+TDCheck);
 if(TD.style.backgroundColor == "white"){
    Color = "green";
    Status = "1";
    Text = "OK";
 }
 else if(TD.style.backgroundColor == "green"){
    Color = "grey";
    Status = "2";
    Text = "N/A";
 }
 else  if(TD.style.backgroundColor == "grey"){
    Color = "red";
    Status = "3";
    Text = "KO";
 }
 else  if(TD.style.backgroundColor == "red"){
    Color = "white";
    Status = "0";
    Text = "";
 }

url="Checklist/checklog.php";
url=url+"?ID="+ID+"&TDCHECK="+TDCheck+"&Status="+Status;
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open("GET",url,false);
xmlHttp.onreadystatechange = function()
{
       if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
                  alert(xmlHttp.responseText);
         }
      }

xmlHttp.send(null);
document.getElementById("TDCheck"+TDCheck).style.backgroundColor=Color;
document.getElementById("TDCheck"+TDCheck).innerHTML=Text;
}

检查日志.php:

<?php
try
    {
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
        $bdd = new PDO('mysql:host=localhost;dbname=dbname', 'database', 'password');

    }
        catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }

if(isset($_GET["TDCHECK"]))
{
    $bdd->exec("update ChecklistNew SET ".$_GET["TDCHECK"]." = '".$_GET["Status"]."' WHERE ID = '".$_GET["ID"]."'");
}   

?>      

我已经删除了 PDO,以防万一它是问题并使用 mysql_connect,但仍然相同。通过使用响应文本,我监控我的 sql 请求,我可以看到一件事:

我先点击,查询如下:

update ChecklistNew SET A2 = '1' WHERE ID = '4'
then 
update ChecklistNew SET A2 = '2' WHERE ID = '4'

然后,如果我用“更新 ChecklistNew SET TD = number WHERE ID= 'Idnum'”更新 php 文件(我在 arround 周围添加了引号ID

update ChecklistNew SET A2 = '4' WHERE `ID` = '4'
then 
update ChecklistNew SET A2 = '0' WHERE `ID` = '4'
then
update ChecklistNew SET A2 = '1' WHERE ID = '4'
then 
update ChecklistNew SET A2 = '2' WHERE ID = '4'

请注意,它保留了先前的查询。:)...我认为那里有些东西。

我将不胜感激任何帮助!

4

2 回答 2

2

IE 缓存了使用 GET 方法的 XMLHttpRequest,所以就是这样。

你可以做很多事情之一,最简单的是:

  • 不要使用 GET 进行更新;切换到 POST 将解决您的问题;使用 send("POST", ...) 而不是 send("GET", ...),您不需要在 PHP 端更改任何内容(因为即使对于 POST 请求,$_GET 也会填充查询参数);
  • 将随机任何内容添加到 URL。它可以像带有随机数的未使用参数一样简单。比如:url=url+"?ID="+ID+"&TDCHECK="+TDCheck+"&Status="+Status + "&random=" + Math.random()

警告:您的 PHP 脚本非常不安全,它有多个 SQL 注入漏洞。立即修复。 (另请参阅如何防止 PHP 中的 SQL 注入?

于 2013-02-13T11:44:46.660 回答
1

很简单,您的浏览器正在缓存结果。

即,如果您Checklist/checklog.php?check=2稍后调用并执行相同的调用(第二次执行或某事)。您的浏览器实际上不会触发服务器端脚本,因为他已经知道结果。(缓存)。因此,您的服务器端逻辑不会被执行。

作为一种解决方案,将时间戳与您的 Ajax 调用一起传递。

url="Checklist/checklog.php";
url=url+"?ID="+ID+"&TDCHECK="+TDCheck+"&Status="+Status + "r=" + (new Date().getTime());

这会导致每次调用的 URL 不同,并且不会缓存任何内容。(或者至少缓存没有被重用)

但请记住,您应该在执行请求之前创建随机部分 RIGHT。如果您将 URL 保存在代码中的某个位置,并重用该 URL,您将遇到同样的问题,因为它再次相等。

于 2013-02-13T11:46:18.840 回答