Показать сообщение отдельно
  #1 (permalink)  
Старый 27.02.2019, 01:01
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Фокус с синтаксисом БД
Привет всем! Нужно через с помощью php добавлять в БД (MySQL) новые строки (работаю с MySQL 5.7 и PHP 7.1). Сделал функцию:
function add_task($link, array $post, array $files, int $user_id): bool {
    $name = $post['project'];
    $category_id = $post['name'];
    $expires_at = !empty($post['date']) ? date_format(date_create($post['date']), 'Y-m-d') : NULL;

    foreach($files as $file) {
        $file_path = $file['name'] ? __DIR__ . '\\'. $file['name'] : NULL;
    }

    $sql_add_task = "INSERT INTO tasks(user_id, category_id, name, expires_at, file_path) VALUES($user_id, $category_id, $name, $expires_at, $file_path)";

    $result = mysqli_query($link, $sql_add_task);

    if(!$result) {
        die("Ошибка MySQL: " . mysqli_error($link));
    }

    return $result;
}

А вот структура таблицы, куда нужно будет вставлять строки:
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
category_id INT,
name CHAR(128) NOT NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
done_at DATE NULL DEFAULT NULL,
status INT DEFAULT 0,
expires_at DATE NULL DEFAULT NULL,
file_path CHAR(128)
);

Проблема в строке с запросом INSERT. Он обёрнут в " ". В нём $category_id и $name обязательны, это строки. А $expires_at и $file_path - факультативны, если они есть - это строки, если нет - тогда NULL. Если в таком виде запустить функцию, то возникает ошибка:
Ошибка MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'народ с балкона золотыми монетами, 2019-02-28, W:\d' at line 2

var_dump выводит такую строку запроса:
string(251) "INSERT INTO tasks(user_id, category_id, name, expires_at, file_path) VALUES(1, 1, Осыпать народ с балкона золотыми монетами, 2019-02-28, W:\domains\216812-doingsdone\1024-31-snowpark.psd)"

Проблема в том, что переменные name, expires_at, file_path изначально типа string. А учитывая, что весь вопрос обёрнут тоже в " ", внутри кавычки вокруг значений, в которые превращаются переменные, я так понимаю, убираются. В итоге - ошибка.

Оборачивать переменные в ' ' - не выход, ибо вместо некоторых может быть NULL - опять ошибка. Подскажите, как быть в такой ситуации

Последний раз редактировалось Alessio18911, 27.02.2019 в 01:30.
Ответить с цитированием