SQL, вставить в таблицу при расчете разницы между двумя - PullRequest
0 голосов
/ 23 января 2020

В настоящее время я использую fullcalendar, чтобы сделать простой календарь. В моей базе данных есть три даты-времени:

start 
end
total

Что мне нужно, так это программа, которая вставляет дату, чтобы вычислить разницу между началом и концом и добавить ее к итогу. Это мой SQL код для вставки:

Я использую InnoDB в MySQL.

session_start();

include_once './conexao.php';

$dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);

//Converter a data e hora do formato brasileiro para o formato do Banco de Dados
$data_start = str_replace('/', '-', $dados['start']);
$data_start_conv = date("Y-m-d H:i:s", strtotime($data_start));

$data_end = str_replace('/', '-', $dados['end']);
$data_end_conv = date("Y-m-d H:i:s", strtotime($data_end));

$query_event = "INSERT INTO events (title, name, color, start, end, total) "
        . "VALUES (:title, :name, :color, :start, :end) "
        . "SELECT DATEDIFF(':start', ':end') AS total";

$insert_event = $conn->prepare($query_event);
$insert_event->bindParam(':title', $dados['title']);
$insert_event->bindParam(':name', $dados['name']);
$insert_event->bindParam(':color', $dados['color']);
$insert_event->bindParam(':start', $data_start_conv);
$insert_event->bindParam(':end', $data_end_conv);

if ($insert_event->execute()) {
    $retorna = ['sit' => true, 'msg' => '<div class="alert alert-success" role="alert">Evento inserido com sucesso!</div>'];
    $_SESSION['msg'] = '<div class="alert alert-success" role="alert">Evento inserido com sucesso!</div>';
} else {
    $retorna = ['sit' => false, 'msg' => '<div class="alert alert-danger" role="alert">Erro: Evento não foi inserido com sucesso!</div>'];
}


header('Content-Type: application/json');
echo json_encode($retorna);```


Ответы [ 3 ]

2 голосов
/ 23 января 2020

Я просто вижу, что вы столкнулись с синтаксической ошибкой SQL - вы не можете использовать синтаксис INSERT...VALUES и INSERT...SELECT в одном запросе - вы должны использовать один или другой. Но вам не нужно SELECT здесь, вы можете просто поместить функцию DATEDIFF в качестве одного из значений. Вам также не нужны кавычки вокруг параметров, которые вы передаете в DATEDIFF.

Вы также не можете использовать одно и то же имя параметра дважды в PDO.

Это должно работать лучше, я думаю (хотя Я не могу проверить это, очевидно):

$query_event = "INSERT INTO events (title, name, color, start, end, total) "
        . "VALUES (:title, :name, :color, :start, :end, DATEDIFF(:start2, :end2))";

$insert_event = $conn->prepare($query_event);
$insert_event->bindParam(':title', $dados['title']);
$insert_event->bindParam(':name', $dados['name']);
$insert_event->bindParam(':color', $dados['color']);
$insert_event->bindParam(':start', $data_start_conv);
$insert_event->bindParam(':end', $data_end_conv);
$insert_event->bindParam(':start2', $data_start_conv);
$insert_event->bindParam(':end2', $data_end_conv);

PS Если при запуске кода все еще есть другие проблемы, вам нужно будет объяснить это специально, так как вы не упомянули их на начать.

0 голосов
/ 23 января 2020

Не смешивайте предложение Values ​​и предложение Select в одном операторе вставки. У вас есть две альтернативы:

$query_event = "INSERT INTO events (title, name, color, start, end, total) "
        . "VALUES (:title, :name, :color, :start, :end, DATEDIFF(':start', ':end')) "
$query_event = "INSERT INTO events (title, name, color, start, end, total) "
        . "SELECT :title, :name, :color, :start, :end, DATEDIFF(':start', ':end') AS total from dual";
0 голосов
/ 23 января 2020

[РЕДАКТИРОВАТЬ] Я думаю, что это может сделать это:

INSERT INTO events (title, name, color, start, end, total) 
SELECT :title, :name, :color, t.start, t.end, DATEDIFF(t.start, t.end) )
FROM ( SELECT :start, :end) AS t

Но вам нужно быть уверенным.

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