Создавая подготовленные операторы для моего сайта, я обнаружил, что много избыточного кода можно перебирать. mysqli::prepare
было довольно простым для повторения, но когда я добрался до mysqli::bind_param
и mysqli::bind_result
, я столкнулся со следующей комбинацией проблем:
1) Я не знаю, сколько параметров в mysqli::bind_param
2) Использование extract(Array)
в аргументах mysqli::bind_param
не будет работать, так как аргументы для mysqli::bind_param
передаются по ссылке
3) Флаг EXTR_REF
на extract(Array)
также не поможет, поскольку значение передаваемого элемента само по себе не может быть ссылкой.
На данный момент, я сдался и использую eval()
.
$statements[
's_records_by_parent'=>[
'sql'=>
"select * from table where id=?",
'params'=>[
'"i"',
'$id'
]
],
];
foreach($statements as $name=>$statement){
if(!$name=$this->mysql->prepare(
$statement['sql']
))
{
echo"Error preparing statement $name.";
exit;
}
if(!eval("return \$name->bind_param(".implode(',',$statement['params']).");"))
{
echo"Error binding parameters for statement $name.";
exit;
}
}
Приведенный выше код делает именно то, что я хочу, за исключением наличия оператора eval()
, который в конечном итоге будет готовить операторы на основе пользовательского ввода, что касается меня.