2010-07-31 74 views
2

我试图把这个,MYSQL删除其中value =多个POST值

check_box=147&check_box=148&check_box=146 etc.. 

$delete_selected = $connection->real_escape_string($_POST['check_box']) 

$sql = "DELETE FROM categories WHERE cat_id = '$delete_selected'"; 

,但它只是删除第一check_box值。有没有办法循环所有的值?

+1

这是因为您的“check_box”变量e只有第一个选定的check_box作为值。我不太了解PHP,但如果这确实是PHP,那么答案就在那里。 – MPelletier 2010-07-31 15:48:34

+0

建议将所有传入的check_box值转换为“IN()”。任何答案与该解决方案将得到我的投票。 – 2010-07-31 15:49:35

+0

您对POST字段的名称有影响吗?即你可以让他们例如'check_box []'而不是'checkbox'? PHP会将前者解析为数组,而后者仅存储最后一个值。 – VolkerK 2010-07-31 15:54:53

回答

6

你需要改变你的POST变量有[],即checkbox[]=。一旦这是固定的,到后端...

考虑您neeed逃跑的每一个值,做这样的事情:

$clean_values = array(); 
foreach($_POST['check_box'] as $value){ 
    $clean_values[] = $connection->real_escape_string($value); 
} 

$sql = 'DELETE FROM categories WHERE cat_id in ('.implode(',',$clean_values).')'; 

BONUS PHP5.3答:

array_walk($_POST['check_box'],function(&item) use($connection){ 
    $item = $connection->real_escape_string($item); 
}); 
$sql = 'DELETE FROM categories WHERE cat_id in ('.implode(',',$_POST['check_box']).')'; 
+0

+1:'implode'在这里执行这项工作会减少代码! – 2010-07-31 16:04:12

+0

谢谢迈克!伟大的代码! – vii 2010-07-31 16:30:40

2

尝试

$sql = "DELETE FROM categories WHERE cat_id in '($delete_selected)'"; 

我可能搞砸了PHP。生成的查询应该liik像

DELETE FROM categories WHERE cat_id in ('cat1', 'cat2', ...) 
+0

+1:你说得对,但是OP还需要检查PHP以获取这些值来填充IN子句。 – 2010-07-31 15:51:35

1

自包含的示例...

<html> 
    <head><title>...</title></head> 
    <body> 
    <form method="post" action="?"> 
     <p> 
     <!-- php will parse post fields like check_box[]=xyz as an array, appending new elements to $_POST['check_box'] --> 
     <input type="checkbox" name="check_box[]" id="c1" value="140" /><label for="c1">140</label><br /> 
     <input type="checkbox" name="check_box[]" id="c2" value="141" /><label for="c2">141</label><br /> 
     <input type="checkbox" name="check_box[]" id="c3" value="142" /><label for="c3">142</label><br /> 
     <input type="checkbox" name="check_box[]" id="c4" value="143" /><label for="c4">143</label><br /> 
     <input type="checkbox" name="check_box[]" id="c5" value="144" /><label for="c5">144</label><br /> 
     <input type="submit" /> 
     </p> 
    </form> 
<?php 
if (isset($_POST['check_box']) && is_array($_POST['check_box'])) { 
    echo '<pre> _POST='; var_dump($_POST); echo '<pre>'; 

    // approach #1: treat ids as numbers. Keep the value range of php's integers and MySQL numeric fields in mind 
    // make sure the elements really are integers 
    $params = array_map('intval', $_POST['check_box']); 
    // join the elements to one string like "1,2,3" 
    $params = join(', ', $params); 
    // use the IN operator in your WHERE-clause 
    $sql = "DELETE FROM xyz WHERE cat_id IN ($params)"; 
    echo 'sql1 = ', $sql, "<br />"; 
    // mysql_query($sql, $mysql) or die(mysql_error()); 

    // approach #2: treat ids as strings. 
    // you need a database connection for mysql_real_escape_string() 
    $mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error()); 
    mysql_select_db('test', $mysql) or die(mysql_error()); 

    // each element has to be escaped and put into single quotes 
    $params = array_map(
    function($e) use ($mysql) { 
     return "'".mysql_real_escape_string($e, $mysql)."'"; 
    }, 
    $_POST['check_box'] 
); 
    // again join them, "'1','2','x'" 
    $params = join(', ', $params); 
    // IN operator in WHERE-clause 
    $sql = "DELETE FROM xyz WHERE cat_id IN ($params)"; 
    echo 'sql2 = ', $sql, "<br />"; 
    // mysql_query($sql, $mysql) or die(mysql_error()); 
} 
?> 
    </body> 
</html> 
+0

感谢您的详细示例!非常丰富 – vii 2010-07-31 16:32:29