Как связать значения PDO для запросов, включающих MySQL типы даты и времени - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть БД с двумя соответствующими таблицами для ДАТ. , .

CREATE TABLE `dates` (
     `did` int(11) NOT NULL,
     `date` date NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

и РАЗ. , .

CREATE TABLE `times` (
  `tid` int(11) NOT NULL,
  `time` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Я пытаюсь привязать значения даты и времени, полученные из HTML полей ввода даты / времени, к запросам, которые проверят, существует ли соответствующая дата / время в своей таблице. Если это не так, мой код выполняет другой запрос, который вставляет указанную дату / время в соответствующую таблицу.

$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

$date = isset($data['date']) ? $data['date'] : NULL;
$time = isset($data['time']) ? $data['time'] : NULL;

If(isset($date)){
    $sqlDs = "SELECT * FROM `dates` WHERE date=:date";
    $stDs = $conn->prepare ( $sqlDs );
    $stDs->bindValue(':date', $date);
    $stDs->execute();
    $rDs = $stDs->fetch(PDO::FETCH_ASSOC);
    If(! $rDs ){
        $sqlDi = "INSERT INTO `dates` (date) VALUES (:date)";
        $stDi = $conn->prepare ( $sqlDi );
        $stDi->bindValue(':date', $date);
        If ($stDi->execute()){
            $dCode = $conn->lastInsertId();
            $msg['temp'] = 'success';
            $msg['body'] = $msg['body'].$date.' added to Dates.';
        }Else{
            $msg['temp'] = 'error';
            $body = isset($msg['body']) ? $msg['body'] : '';
            $msg['body'] = $body.'Date at '.$date.' didn`t work.';
        }
    }Else{
        $dCode = $rDs['did'];
        }
    }

    If(isset($time)){
        $sqlTs = "SELECT * FROM `times` WHERE time=:time";
        $stTs = $conn->prepare ( $sqlTs );
        $stTs->bindValue(':time', $time);
        $stTs->execute();
        $rTs = $stTs->fetch(PDO::FETCH_ASSOC);
        If(! $rTs ){
            $sqlTi = "INSERT INTO `times` (time) VALUES (:time)";
            $stTi = $conn->prepare ( $sqlTi );
            $stTi->bindValue(':time', $time);
            If ($stTi->execute()){
                $tCode = $conn->lastInsertId();
                $msg['temp'] = 'success';
                $msg['body'] = $msg['body'].$time.' added to Times.';
            }Else{
                $msg['temp'] = 'error';
                $body = isset($msg['body']) ? $msg['body'] : '';
                $msg['body'] = $body.'Time for '.$time.' didn`t work.';
            }
        }Else{
            $tCode = $rTs['tid'];
        }

    }

Не могу понять, как правильно связать эти значения с правильным форматом для MySQL. Никакой синтаксис strtotime () или что-либо еще, с чем я сталкивался до сих пор, не сработал. Возможно, я что-то упускаю? Я знаю, что должен сам разобраться, но я подхожу к концу этого проекта, и я так устал от борьбы с ним.

ОБНОВЛЕНИЕ: Я забыл выполнить запросы SELECT. Этот код работает сейчас.

1 Ответ

0 голосов
/ 14 февраля 2020
    $sqlDi = "INSERT INTO `dates`(:date)";

Это неправильный синтаксис для оператора INSERT.

Правильный синтаксис:

INSERT INTO tablename (col1, ...) VALUES (value, ...)

MySQL поддерживает альтернативный (нестандартный) синтаксис, который Я нахожу немного проще:

INSERT INTO tablename SET col1 = value1, col2 = value2, ...

Вы не можете использовать параметры связывания для имен столбцов, только для значений. INSERT INTO dates (:date) неверно по этой причине, так как список в скобках после имени таблицы предназначен для имен столбцов.

Другой совет, который я хотел бы получить, - проверить возвращаемое значение prepare(), прежде чем считать, что разбор запроса прошел успешно. Если бы вы сделали это, вы бы знали, что у вас есть синтаксическая ошибка.

 $stDi = $conn->prepare ( $sqlDi );
 if ($stDi === false) {
     error_log(print_r($conn->errorInfo(), true));
     error_log("SQL = [$sqlDi]");
     die("A database error occurred, please report to the site administrator");
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...