0

チェックボックスを使用して複数のレコードを削除する方法を見つけようとしています。データベースからデータを取得するテーブルがページにあります。各行の最初の列には、次のようなチェックボックスがあります。

<input type="checkbox" name="checked[]" value='.$row['UserId'].' class="checkbox" />

私のコードは次のようになります。

<?php
// get required includes
require_once(ROOT_PATH.'connections/mysql.php');
require_once(ROOT_PATH.'admin/controls/users_az/error_messages.php');

// declare variables
$msg = '';

// ------------------------------------------------------------------
// DELETE SELECTED USERS
// ------------------------------------------------------------------
if(isset($_POST['btnDeleteSelected']) && isset($_POST['checked']))
{
$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));
$list = "'" . implode("','", $checked) . "'";

$delete_selected = mysqli_query($conn, "DELETE FROM users WHERE UserId IN ($list)")
or die($dataaccess_error);

if($delete_selected)
{
    $msg = mysqli_affected_rows($delete_selected).' '.$msg_success;
}
}
elseif(isset($_POST['btnDeleteSelected']) && !isset($_POST['checked']))
{
$msg = $msg_error;
}
?>

問題:当然、これは機能しません。私がこれをやろうとしているのはこれが初めてです。

質問:私はこれで正しい道を進んでいますか?これを機能させるにはどうすればよいですか?

4

3 に答える 3

0

これにより、エラーが発生します。

$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));

array_map最初の引数としてコールバックが必要であり、2番目の引数として配列が必要なためです。残りのセットアップはかなり良いですがmysqli_real_escape_string、接続が必要なため、array_mapまたはarray_walkはそれほど便利ではないため、通常のforeachループを試すことができます。または、IDが常に整数の場合:

$checked = array_map('intval',$_POST['checked']);

...そして、implodeステートメントの値を引用符で囲みます(整数列にはmysql整数を、他の(char / date / blob / text)列には文字列をフィードしてみてください)。

于 2010-10-26T21:35:31.980 に答える
0

PHP> = 5.3では、無名関数を使用できます。

$checked = array_map(function($s) use ($conn) { return mysqli_real_escape_string($conn, $s); }, $_POST['checked']);

それ以外の場合は、ユーザー定義関数にコールバックすることができます。

$checked = array_map('myescape', $_POST['checked']);
function myescape($s)
{
    global $conn;
    return mysqli_real_escape_string($conn, $s);
}

または、手動でループします。

于 2010-10-26T22:06:08.600 に答える
0

たとえば、配列のすべての要素が整数(ctype_digit()を使用)であることを確認するだけで、次のように引用符なしでimplodeを使用できます。

$list = implode(", ", $checked);
于 2010-10-26T21:30:18.203 に答える