@BusterX

Как использовать bind_param в цикле?

Имеется универсальный класс для импорта данных из разных источников. Собранные данные сохраняются в MySQL. Для работы с БД используются подготовленные запросы (Stmt), для удобства которые помещены в массив:
private $aStmt = array(
    'checking'  => array(
            'stmt'  => '',
            'query' => 'SELECT `id` FROM `books` WHERE `bookId` = ?',
            'paramsType' => 'i'),
     'add'    => array(
            'stmt'  => '',
            'query' => 'INSERT INTO `books` (`source`, `bookId`, `author`) VALUES (?, ?, ?)',
            'paramsType' => 'sis')
);

Раньше запросы подготавливались и параметры привязывались "вручную":
if(!$this->aStmt['checking']['stmt'] = $this->oDB->prepare($this->aStmt['checking']['query'])){
    //error
}elseif(!$this->aStmt['checking']['stmt']->bind_param(aStmt['checking']['paramsType'], $this->info['id'])){
    //error
}

Собственно, таких процедур было порядка трех, что не вызывало проблем.
Сейчас потребовалось добавить еще 3, 5, ... что привело к мысли о создании цикла подготовки запросов:
foreach($this->aStmt AS $name => $param){
    if(!$this->aStmt[$name]['stmt'] = $this->oDB->prepare($this->aStmt[$name]['query'])){
        //error
    }elseif(!call_user_func_array(array($this->aStmt[$name]['stmt'],'bind_param')($this->aStmt[$name]['params'])){
       //error
    }
}

Предварительно поместив в $aStmt[$name]['params'] массив ссылок на переменные.
private $aStmt = array(
    'checking'  => array(
            'stmt'  => '',
            'query' => 'SELECT `id` FROM `books` WHERE `bookId` = ?',
            'params' => array('i', &$this->info['id'])),
     'add'    => array(
            'stmt'  => '',
            'query' => 'INSERT INTO `books` (`source`, `bookId`, `author`) VALUES (?, ?, ?)',
            'params' => array('sis', &$this->info['base'], &$this->info['id'], &$this->info['author']))
);

Но увы, при создании объекта данного класа, появляется ошибка:
PHP Parse error: syntax error, unexpected '&', expecting ')'
Версия PHP Version => 5.6.31

Прошу совета по реализации задумки, либо наставления на путь истинный при неправильном подходе к решению данного вопроса.
  • Вопрос задан
  • 370 просмотров
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Самым простым решением будет переместить заполнение $aStmt в конструктор.

Отдельно хочу заметить, что код, в котором программист кланяется каждому столбу, проверяя на ошибки в каждую строчку, выглядит некрасиво. Код должен выдавать ошибки сам по себе, а обрабатываться они должны где-то еще. В частности для mysqli следует выставить режим выброса исключений и убрать все ручные проверки из кода.

Плюс сам код можно значительно упростить.
foreach($this->aStmt AS $name => $param){
    $this->aStmt[$name]['stmt'] = $this->oDB->prepare($param['query']);
    $this->aStmt[$name]['stmt']->bind_param($param['paramType']), ...$param['params']);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы