Я ищу лучший подход / шаблон / идиома для обработки аргумента переменной длины для метода mysqli bind_param
.
Я создал переменную функцию в PHP, которая похожа на mysqli_stmt::bind_param
. Таким образом, первый обязательный аргумент ожидает строку, остальные аргументы являются необязательными, но длина строки первого аргумента должна быть равна количеству необязательных аргументов.
Определение функции:
function bind_param_test($types, ...$args){
$typesArr = str_split($types);
foreach($args as $i => $n) {
switch ($typesArr[$i]) {
case 'd':
echo "Decimal: " . $n . '<br>';
break;
case 's':
echo "String: " . $n . '<br>';
break;
default:
break;
}
}
}
Теперь я пытаюсь использовать это.
// ------------- CASE 1 ---------------------------
// In this case I have 5 arguments. So I can do this:
$a = 10;
$b = 20;
$c = 'hello';
$d = 'cheese';
$e = 500;
if($a && $b && $c && $d && $e){
bind_param_test('ddssd', $a, $b, $c, $d, $e);
}
/* OUTPUT:
Decimal: 10
Decimal: 20
String: hello
String: cheese
Decimal: 500
*/
echo '<hr>';
Пожалуйста, смотрите случаи 2 и 3 ниже.
// ------------- CASE 2 ---------------------------
// I'm using 4 variables
$e = null;
if($a && $b && $c && $d && !$e){
bind_param_test('ddss', $a, $b, $c, $d);
}
/* OUTPUT:
Decimal: 10
Decimal: 20
String: hello
String: cheese
*/
echo '<hr>';
// ------------- CASE 3 ---------------------------
// 3 variables
$d = null;
$e = null;
if($a && $b && $c && !$d && !$e){
bind_param_test('dds', $a, $b, $c);
}
/* OUTPUT:
Decimal: 10
Decimal: 20
String: hello */
echo '<hr>';
Случаи 2 и 3 жестко запрограммированы и поэтому не СУХИЕ. Я хочу сделать СУХОЙ в случае 4. Пожалуйста, смотрите случай 4.
Случай 4: шаблон для обработки mysqli bind_param массивом
// ------------- CASE 4 ---------------------------
// I want to have a more generic approach.
$argumentList = array(
'a' => 10,
'b' => 20,
'c' => null,
'd' => null,
'e' => null,
);
$argumentList = array_filter($argumentList);
$actionStr = '';
foreach($argumentList as $k => $v){
if(is_numeric($v)){
$actionStr .= 'd';
}
if(is_string($v)){
$actionStr .= 's';
}
}
$varList = array_values($argumentList);
$param_arr = array();
$param_arr[] = $actionStr;
$param_arr = (array_merge($param_arr, $varList));
call_user_func_array('bind_param_test', $param_arr);
/* OUTPUT:
Decimal: 10
Decimal: 20 */
Вопрос: вы можете найти лучшие подходы, чем случай 4? Я спрашиваю, потому что я думаю, что случай 4 таинственный. Боюсь, что это может удивить других разработчиков.