2012-03-09 41 views
0

テーブルからMySQLデータを使用してhtmlフォームを作成しました。MySQLのDELETEクエリの異常な動作

私はこのテーブルにフォームを含めました。フォームを送信すると、MySQLテーブルからその行が削除されます。

これは、テーブルからMySQLデータを使用してテーブルを作成するコードです(db接続コードと他のコードとは無関係です)。

while($row_data=mysql_fetch_array($table_data)){ 
    echo "<tr>"; 
    echo "<td>" . $row_data['ID'] . "</td>"; 
    echo "<td>" . $row_data['Site'] . "</td>"; 
    echo "<td>" . $row_data['Date'] . "</td>"; 
    echo "<td>" . $row_data['Target_Site'] . "</td>"; 
    echo "<td>" . $row_data['Target_Contact_Email'] . "</td>"; 
    echo "<td>" . $row_data['Target_Contact_Name'] . "</td>"; 
    echo "<td>" . $row_data['Link_Type'] . "</td>"; 
    echo "<td>" . $row_data['Link_Acquired'] . "</td>"; 
    echo "<td>" . $row_data['Notes'] . "</td>"; 
    echo "<td>" . $row_data['Link_URL'] . "</td>"; 
    echo "<td></td>"; 
    echo "<td><form action='delete.php' method='post'><input type='hidden' name='delete_id' value=" . $row_data['ID'] . "><input type='submit' value='&#x2713;' name='delete' style='background:none;' /></form></td>"; 
    echo "</tr>"; 
    } 

あなたがそのコードに見ることができるように

は、フォームで終わり、上の表のデータがあり、クリックされた場合には、その特定の行を削除するためのものです。フォームからわかるように、アクションはdelete.phpです。

この

$ID = $_POST['delete_id']; 
$Delete = $_POST['delete']; 



if(isset($Delete)){ 

mysql_query("DELETE FROM link_building WHERE 'ID'=" . $ID); 

header("location:link_building.php?success2=1"); 
}else{ 
header("location:link_building.php?fail2=1"); 
} 

今(DB接続コードを逃した)、それは一種の動作しますが、唯一私がしようとするたびに、0のIDを持っているデータの行を削除delete.phpためのコードですたとえばIDが2のデータ行を削除すると、データが正常に削除されたと表示されますが、実際には削除されません。しかし、idが0の行でdeleteをクリックすると、その行だけでなくすべてのデータが削除されます。

+0

変数(文字列)でクエリをビルドして出力し、mysql_query&redirectをコメントアウトしてみてください。そして、この出力されたクエリを手動で実行してみてください(phpmyadmin)。これはおそらく何が間違っているのかを教えてくれるでしょう。 –

+0

@Ryan - あなたはどこで列名を引用しなければならないのですか?人々にそれを教えるチュートリアルや何かがあるなら、私は本当に興味があります。 –

+0

私は本当に正直であることを覚えていません。そのような小さなものがどのように大きな違いを生み出すことができるかという素晴らしいことです。 – RSM

答えて

6

あなたの問題は、'ID'を一重引用符で引用したことです。任意の文字列と比較される整数0はMySQLではTRUEに等しく、引用符付きの'ID'は列名ではなく文字列リテラルなので、ID = 0を渡すと削除されますが、他のすべての状況で失敗します。

IDから引用符を削除します。

mysql_query("DELETE FROM link_building WHERE ID=" . $ID); 
//------------------------------------------^^^^ 

をまた、あなたのコードは、SQLインジェクションの脆弱性です。 $IDの値を正しくフィルタリングしてください。

if (isset($_POST['delete_id']) && !ctype_digit($_POST['delete_id'])) { 
    // Non-integer value! error! bail out! 
} 
else { 
    $ID = $_POST['delete_id']; 
    // Do your query... 
} 

それは操作の残りの部分に進む前に$_POST['delete_id']の存在とその有効性をチェックすることで上記のコードは、あなたのオリジナルとは異なることに注意してください。あなたのオリジナルでは、$ID$Deleteの値をチェックせずに設定します。 $Deleteを確認する必要はありません。これは、他のフォーム入力が1つしかないためです。

最後の注記:このポストには認証コードはありませんが、フォーム入力からSQL削除を受け入れる場合は、削除する前に削除する行の権限をチェックするようにしてください。そうしないと、ユーザーは他のユーザーの行を削除するようにフォームを変更することができます(状況に該当する場合)。

関連する問題