0

私はこれに何時間も費やしましたが、運がありませんでした。チェックボックスでマークされ、削除ボタンが押されたリスト要素を削除しようとしています。各チェックボックスには、実際の ID 列の値を関連付ける html id 属性があります。MySQLステートメントを使用して、適切なIDに基づいて行を削除しています(htmlから要素を削除できますが、MySQLテーブルからは削除できません)

"DELETE FROM todolist WHERE ID IN (".$_GET['id'].")"

例 id... id="456,444,454"

JavaScript は、チェックされたボックスの id 値を調べて、それらを php ファイルに送信します。この部分は問題ありません。アラートから、ステートメントが正しい ID を与えていることを確認できます。削除ボタンが押されたときに呼び出されるメソッドを次に示します。

function removeCheckedTask(){
var checkBoxes = $('toDoList').getElementsByClassName('box');
var deletedID = new Array(); var indexID =0;
for (var i = 0; i < checkBoxes.length; i++) {
  if (checkBoxes[i].checked){
        deletedID[indexID]=checkBoxes[i].getAttribute('id');indexID++;
        var par = checkBoxes[i].parentNode;
        $('toDoList').removeChild(par);
        i--;
        for(var a=i+1; a<checkBoxes.length; a++){//moves other elements
            par = checkBoxes[a].parentNode;
            par.style.top = (a*40)+"px";
        }
    }

}
if(deletedID.length>0){
    $('message').innerHTML = "Just a second..."
    // Set te random number to add to URL request
    nocache = Math.random();
    // Pass the login variables like URL variable
    var ids = 'id='+deletedID[0];
    for(var i=1; i<deletedID.length; i++){
        ids+= ',' + deletedID[i];
    }
    alert('removeTasks.php?'+ids);
    http.open('get', 'removeTasks.php?'+ids);
    http.onreadystatechange = deleteReply;
    http.send(null);
    }
    function deleteReply() {
    if(http.readyState == 4){ 
        var response = http.responseText;
        $('message').innerHTML = 'Task removed:'+response;
    }
}

resetIDs();//resets ids of list elements, don't worry about it

}

これは、接続のない私のphpコードです。is文にします。

if(isset($_GET['id'])){
   $q+="DELETE FROM todolist WHERE ID IN (".$_GET['id'].")"; //line 13
   mysql_query($q) or die(mysql_error());
echo "tried to delete stuff";
} else { 
echo("Bad delete");
}

$q 文字列に変更を加えたため、応答エコーは少し変化していますが、最近のこの単純なバージョンでは、MySQL エラーが出力されています。

注意: 未定義の変数: q in C:\xampp\htdocs\todo\removeTasks.php 行 13 SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、1 行目の「0」付近で使用する正しい構文を確認してください。

私が使用する場合

"DELETE FROM todolist WHERE ID IN ("+$_GET['id']+")"

エラーが表示されます- Notice: Undefined variable: q in C:\xampp\htdocs\todo\removeTasks.php 行 13 SQL 構文にエラーがあります。1行目の「457」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

457 は最初の ID でした。

ここと mysql が新しいので、何か省略した場合はお知らせください。

4

1 に答える 1

0

変数「q」が定義されておらず、それに何かを追加しようとしたため、通知が表示されます。また、「+」はjavascriptとは異なり、PHPでは数字を表すため、SQLエラーが発生します。したがって、SQL ステートメントはおそらくゼロに変換されるため、「0」エラーが発生します。正しい方法は次のとおりです。

$q .= "DELETE...";

また、各クエリを個別に呼び出すことをお勧めします。それぞれの結果 (またはエラー) を取得できるからです。

 $q = null;
 $ids = explode(",",$_GET["id"]);
 foreach($ids as $id) {
      $id = (int)$id; //VERY basic security thing
      $q = "DELETE FROM todolist WHERE ID = ".$id;
      mysql_query($q) or die(mysql_error());
 }

あなたはphpを学んでいますか、それとも実際のアプリケーションですか?誰かが前に言ったように、これはこれを行うには良い方法ではないからです。GET は、データに永続的な変更があるものには使用しないでください。リクエストが実際にそのフォームから来たかどうかを確認するには、POST フォームと隠しフィールドが必要です。また、クエリの後に何かを挿入できるため、mysql エスケープ関数を使用する必要があります。詳細については、mysql インジェクションを参照してください。

幸運を

于 2012-07-27T01:25:28.773 に答える