2012-01-24 14 views
1

概要:複数のチェックボックスを使用しない削除および更新ステートメント

クエリに基づいて、複数のチェックボックスが動的に生成されます。各チェックボックスの値は、クエリの行のいずれかの文字列です。

フォーム提出時に、別のスクリプトが実行されました(del.php)。このスクリプトはチェックされたチェックボックスの配列を取得してループし、別の2つのクエリを実行することができます。これは削除クエリと更新クエリです。

これらは機能しません。 INSERTクエリを試してもうまくいきます。しかし、削除と更新は行いません。ここで

私のコードです:

のindex.php:

<?php 
$gettips = mysql_query('SELECT body FROM tips WHERE body!="" and approved!="yes" and approved!="no"')or die(mysql_error()); 
$i=0; 
while($tips = mysql_fetch_array($gettips)) 
{ ?> 
<input type="checkbox" name="checkboxes[]" value="<?php print $tips[0] ?>" /> 
<input type="checkbox" name="checkboxesno[]" value="<?php print $tips[0] ?>" /> 
<a class="names"> - <span><?php print $tips[0] ?></span></a><br /> 
<? $i++; 
} 
?> 

とdel.php:

foreach($_POST['checkboxes'] as $check) { 
mysql_query("INSERT INTO approved (body) VALUES ('$check') "); 
mysql_query("UPDATE tips SET approved='yes' WHERE body='$check'");  
} 
foreach($_POST['checkboxesno'] as $key) { 
mysql_query("DELETE FROM tips WHERE body='$key' ")or die(mysql_error()); 
} 

mysql_error()は、すべてのエラーをスローしません。データベース接続は両方のファイルで機能します。チェックボックスの値は文字列です。 POST $variableではなく、文字列自体をクエリに追加してレコードを削除できます。 (古いレコードは削除できず、新しく追加されたレコードのみを削除できます)。

UPDATE:

私はrow='string'が、少なくとも私の場合には、ベストプラクティスではありませんでしたレコードを削除しようとしていることに気づきました。だから、フォームのチェックボックスに文字列を値として渡す代わりに、テーブルのid値を与えることにしました。ここ

は新しいコードです:

<?php 
$gettips = mysql_query('SELECT id,body FROM tips WHERE body!="" and approved!="yes" and approved!="no"')or die(mysql_error()); 
$i=0; 
while($tips = mysql_fetch_array($gettips)) 
{ ?> 
<input type="checkbox" name="checkboxes[]" value="<?php print $tips[0] ?>" /> 
<input type="checkbox" name="checkboxesno[]" value="<?php print $tips[0] ?>" /> 
<a class="names"> - <span><?php print $tips[1] ?></span></a><br /> 
<? $i++; 
} 
?> 

と削除クエリ:

foreach($_POST['checkboxes'] as $check) { 
// echo "INSERT INTO approved (body) VALUES ('$check') <br>"; 
// echo "UPDATE tips SET approved='yes' WHERE body='$check'<br>"; 
mysql_query("INSERT INTO approved (body) VALUES ('$check') "); 
mysql_query("UPDATE tips SET approved='yes' WHERE body='$check'");  
} 

foreach($_POST['checkboxesno'] as $key) { 
// echo "DELETE FROM tips WHERE id=$key <br>"; 
mysql_query("UPDATE tips SET approved='no' WHERE id=$key");  
mysql_query("DELETE FROM tips WHERE id=$key ")or die(mysql_error()); 
} 

他の方法は働いていなかった理由はそこに誰かが持っているので、もし私はまだ、知りません説明するチャンス、それは素晴らしいだろう!

+0

代わりにprepared statementsを使用することをおすすめします。 –

答えて

1

あなたforloopsにいくつかのecho文を追加して、クエリをコメントアウトした場合、あなたは、MySQLに送信され、その後、あなたはあなたの問題を解決するより良いことができます正確に何を確認することができます。

foreach($_POST['checkboxes'] as $check) { 
    echo "INSERT INTO approved (body) VALUES ('$check') <br>"; 
    echo "UPDATE tips SET approved='yes' WHERE body='$check'<br>"; 
    //mysql_query("INSERT INTO approved (body) VALUES ('$check') "); 
    //mysql_query("UPDATE tips SET approved='yes' WHERE body='$check'");  
} 

foreach($_POST['checkboxesno'] as $key) { 
    echo "DELETE FROM tips WHERE body='$key' <br>"; 
    //mysql_query("DELETE FROM tips WHERE body='$key' ")or die(mysql_error()); 
} 
0

SQLインジェクションから自分自身を守ってください:http://php.net/manual/en/security.database.sql-injection.php、正確に生成されたSQLクエリを出力してください。エスケープされていないSQL文字列が原因です。

)(mysql_real_escape_stringのでエスケープしてください。