0

私はチェックリストに取り組んでいます。ユーザーはそれをクリックしながら4つの異なるオプションを設定できます。一度クリックすると、が緑色になり、「OK」、もう一度灰色、「N / A」、次に白で空になります。再び緑色になり、「OK」になり始めた後、データベースを更新するたびに、可能性ごとに値1、2、3、または0を使用します。javascriptはうまく機能し、[データベースの更新]をクリックするたびに、すべてのブラウザーで色とテキストが正しく更新されます。データベースの白または0に戻るまで、同様に機能します。クリックすると、1、2、3、0の順に更新され、1を取得する必要があるときに、それ以上更新されません。私はクロムでこの問題を抱えていません。

これが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;
}

Checklog.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リクエストを監視し、1つのことを確認できます。

最初にクリックすると、クエリは次のようになります。

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

次に、phpファイルを「updateChecklistNew SET TD = number WHERE ID='Idnum'」で更新すると(の前後に引用符が追加されます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メソッドを使用するXMLHttpRequestsをキャッシュするので、それだけです。

あなたは多くのことの1つをすることができます、最も簡単なことは:

  • 更新にGETを使用しないでください。POSTに切り替えると、問題が解決します。send( "GET"、...)の代わりにsend( "POST"、...)を使用すると、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(2回目の実行またはsth)。ブラウザは結果をすでに知っているため、実際にはサーバーサイドスクリプトをトリガーしません。(キャッシュ)。したがって、サーバーサイドロジックは実行されません。

解決策として、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 に答える