Динамическая привязка параметров с использованием подготовленных операторов - PullRequest
0 голосов
/ 14 января 2019

Создавая подготовленные операторы для моего сайта, я обнаружил, что много избыточного кода можно перебирать. 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(), который в конечном итоге будет готовить операторы на основе пользовательского ввода, что касается меня.

1 Ответ

0 голосов
/ 14 января 2019

Это код, использующий call_user_func_array():

$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;
    }
    foreach($statement['params']as$k=>$param)
         if($k)$statement['params'][$k]=&$$param;

    if(!call_user_func_array([$name,'bind_param'],$statement['params']))
    {
        echo"Error binding parameters for statement $name.";
        exit;
    }
}
...