Попытка выполнить запрос на обновление / вставку с использованием подготовленного оператора php и mysqli, но безрезультатно - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь выполнить следующий код как подготовленный оператор с использованием PHP:

private function prepQuery(){
$this->prepSQL = $this->con->prepare('
    IF EXIST(SELECT * FROM tablename WHERE reference=?)
        UPDATE tablename
            SET
                column1=?,
                column2=?,
                column3=?
            WHERE reference=?
    ELSE
        INSERT INTO tablename(
            column1,
            column2,
            column3,
            column4
        ) VALUES(?, ?, ?, ?);
');}

Код выполняется в контексте объекта, где объект соединения является переменной частного поля в классе. Функция должна инициализировать переменную поля $ prepSQL как объект, но я получаю следующую ошибку:

Неустранимая ошибка: необученная ошибка: вызов функции-члена bind_param () для логического значения

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

Однако он не завершается, так как говорит, что переменная $ prepSQL является логическим значением и не может вызвать для него метод bind_param.

Я попытался выполнить sql вручную, и это прекрасно работает. Если я использую нормальный оператор вставки в коде, он работает нормально. Но при запуске, как показано ниже, это не работает. Я действительно не уверен, что я делаю не так здесь.

1 Ответ

0 голосов
/ 03 июля 2018

Ваш запрос содержит ошибку. И вы пытаетесь запустить bind_param на том, что не сработало.

Вы, вероятно, делаете:

$this->prepSQL = $this->con->prepare('...');
$this->prepSQL->bind_param()

Метод prepare () может возвращать false, и вы должны проверить это. Что касается того, почему он возвращает false, возможно, имя таблицы или имена столбцов (в предложении SELECT или WHERE) неверны?

Кроме того, рассмотрите возможность использования чего-то вроде $ this-> db-> conn-> error_list для проверки ошибок, возникших при разборе SQL. (Я буду время от времени выводить фактические строки операторов SQL и вставлять в phpMyAdmin для проверки, но там определенно что-то не получается.)

Это сказанное, хотя и не является ответом на фактический вопрос DO , послушайте, что сказали другие комментарии:

Использование INSERT INTO ... ON DUPLICATE KEY UPDATE ... намного проще, чем утверждение IF ELSE.

https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...