PHP + MYSQLI:المتغير المعلمة/نتيجة الربط مع بيانات معدة

StackOverflow https://stackoverflow.com/questions/12656

  •  08-06-2019
  •  | 
  •  

سؤال

في المشروع الذي أنا على وشك أن يختتم كتبت ونفذت كائن-relational mapping حل PHP.قبل المشككين الحالمين يصرخ "كيف على الأرض؟", الاسترخاء-أنا لم تكن قد وجدت طريقة لجعل أواخر ثابت ملزم العمل -- أنا فقط العامل من حوله في أفضل الطريقة التي يمكن ربما.

على أي حال, أنا لا تستخدم حاليا إعداد البيانات الاستعلام لأنني لا أستطيع الخروج مع وسيلة لتمرير عدد متغير من الحجج إلى bind_params() أو bind_result() الأساليب.

لماذا أحتاج إلى دعم عدد متغير من الحجج ، تسأل ؟ لأن الفائقة من نماذج (التفكير في الحل كما اخترق المتابعة PHP ActiveRecord المتمني) حيث الاستعلام عن تعريف و حتى طريقة البحث () ، على سبيل المثال ، لا أعرف كيف العديد من المعلمات سوف تحتاج إلى ربط.

الآن, لقد فكرت بالفعل في بناء حجة قائمة تمرير سلسلة eval(), ولكن أنا لا أحب هذا الحل كثيرا انا اريد ان مجرد تنفيذ بلدي الأمن الشيكات ونقل البيانات.

هل من أحد لديه أي اقتراحات (أو قصص النجاح) حول كيفية الحصول على هذا عمله ؟ إذا كنت يمكن أن تساعدني في حل هذه المشكلة الأولى ، ربما يمكننا معالجة ملزمة نتيجة تعيين (ما أظن سوف يكون أكثر صعوبة ، أو على الأقل الأكثر استهلاكا للموارد إذا كان ينطوي على استفسار أولي لتحديد بنية الجدول).

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

المحلول

في PHP يمكنك تمرير متغير عدد من الحجج إلى دالة أو طريقة باستخدام call_user_func_array.مثال عن طريقة ليكون:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

وظيفة سوف يطلق مع كل عضو في مجموعة مرت الخاصة الحجة.

نصائح أخرى

لديك للتأكد من أن $array_of_params هو مجموعة من روابط المتغيرات, لا القيم نفسها.يجب أن تكون:

$array_of_params[0] = &$param_string; //link to variable that stores types

ثم...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

وإلا (إذا كان صفيف من القيم) ستحصل على:

تحذير PHP:المعلمة 2 إلى mysqli_stmt::bind_param() من المتوقع أن يكون مرجعا


مثال آخر:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

و BOOOOOM:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

أنا لا يسمح تحرير, ولكن أعتقد في المدونة

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

الإشارة أمام $stmt ليست ضرورية.منذ $stmt هو كائن ، bindparams هو الأسلوب في هذا الكائن ، مرجع ليست ضرورية.ينبغي أن يكون:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

للحصول على مزيد من المعلومات ، راجع دليل PHP رد وظائف."

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

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

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top