سؤال

أحاول معرفة كيف يمكنني حذف سجلات متعددة باستخدام خانات الاختيار. لدي جدول على صفحتي تحصل على البيانات من قاعدة البيانات. يحتوي العمود الأول لكل صف على خانة اختيار يشبه ما يلي:

<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;
}
?>

مشكلة: بطبيعة الحال هذا لا يعمل. هذه هي المرة الأولى التي أحاول فيها القيام بذلك.

سؤال: هل أنا على الطريق الصحيح مع هذا؟ كيف أحتاج إلى تعديل هذا لجعله يعمل؟

هل كانت مفيدة؟

المحلول

هذا سيؤدي إلى خطأ:

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

لان array_map يريد رد الاتصال باعتباره الأول ، وصفيف كحجة ثانية. ما تبقى من الإعداد جيد جدا ، ولكن كما mysqli_real_escape_string يحتاج إلى اتصال ، array_map أو array_walk غير مريح ، قد تجرب طبيعية foreach عقدة. بدلاً من ذلك ، إذا كان الهوية دائمًا أعداد صحيحة:

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

... وإسقاط عروض الأسعار حول القيم في عبارة الانفصال (حاول إطعام أعداد صحيحة MySQL لأعمدة عدد صحيح ، وسلاسل لأعمدة أخرى (char/date/blob/text)).

نصائح أخرى

ما عليك سوى التحقق من أن كل عنصر من عناصر الصفيف الخاص بك هو عدد صحيح (مع ctype_digit ()) على سبيل المثال ، وبعد ذلك يمكنك استخدام الانفصام بدون علامات اقتباس ، مثل هذا:

$list = implode(", ", $checked);

مع 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);
}

أو مجرد حلقة يدوي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top