Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL,在计算两次之间的差异时插入到表中_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php SQL,在计算两次之间的差异时插入到表中

Php SQL,在计算两次之间的差异时插入到表中,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我目前正在使用fullcalendar制作一个简单的日历。我的数据库有三个日期时间: start end total 我想要的是程序,当它插入日期时,计算开始和结束之间的差异,并将其添加到总数中。这是用于插入的SQL代码: 我在MySQL中使用InnoDB session_start(); include_once './conexao.php'; $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT); //Converter

我目前正在使用fullcalendar制作一个简单的日历。我的数据库有三个日期时间:

start 
end
total
我想要的是程序,当它插入日期时,计算开始和结束之间的差异,并将其添加到总数中。这是用于插入的SQL代码:

我在MySQL中使用InnoDB

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);```


[编辑] 我认为这可以做到:

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

但是您需要尝试确定。

我可以从查看中看出,您一定遇到了SQL语法错误-不能在同一查询中使用INSERT…VALUES和INSERT…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);

另外,如果在运行代码时还存在其他问题,则需要特别解释,因为您在开始时没有提到这些问题。

不要在一条insert语句中混合使用Values子句和Select子句。 你有两个选择:

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

在PDO中不能两次使用同一参数名。。。另外,你不打算解释一下为什么你的版本更好吗?这将是一个更有用的答案。@ADyson ah sh*最近做了太多PL,完全忘记了,谢谢。@ADyson优于?行动请求?它应该起作用;你的答案是什么?我不认为这更好,只是不同;我在SQL端增加了一点逻辑,而在PHP端增加了一点逻辑:没有太大的区别。我看不出有什么比OP的代码更有用的大答案了——也就是说,解释你改变了什么,以及为什么它能解决这个问题。代码转储本身对于一开始不理解错误的人来说是没有用的。。。我是在评论你的原始版本,别忘了,不是你修改过的SQL。你的代码是否比我的好是由OP决定的,不是我。我是说你的帖子的整体质量。我试图通过添加一些解释性说明来鼓励您使其更有用-这并不是为了批评它本身。感谢@Blag的评论,这段代码与Adyson的问题相同,可能与我设置JS代码的方式有关,我将进一步研究。运行这段代码时会发生什么?您有错误吗?我无法使用此代码插入任何内容,并且没有错误。这可能与我管理日历的JS脚本有关。这段代码:能够插入数据,是我在尝试计算差异之前所做的代码。如果您认为错误在JS端,则需要调试JS端,并检查它是否触发PHP执行。你没有表现出来,所以我帮不了你。但是这个答案应该可以解决PHP的问题。也许您应该使用PostMan之类的工具对PHP部分进行单元测试,以生成HTTP请求,然后在该测试正常后,您可以修复客户端代码,使其正确生成自己的请求。@Rui如果您认为此查询仍然存在错误,则需要对其进行调试。确保PDO设置为在发生错误时引发异常请参阅,确保PHP设置为记录和/或回显错误请参阅。设置它,然后再次运行代码,看看它会报告什么。这样你可能会对如何开始修复它有更好的想法。我不相信你真的需要这个专栏。可以随时使用已存储的起始值和结束值计算此值。关系数据库理论通常建议您不存储可以使用其他存储值计算的值,而是在需要查看数据时,在选择查询中按需执行计算。唯一的例外是,如果计算运行速度非常慢,尤其是对于大型数据集。但这不应该是一个很大的问题。感谢给我的时间在这里,我一定会设置错误处理,因为我确实忘记了这样做。我还将进一步研究SELECT查询,看看是否可以使用HTML表格进行计算。谢谢您的代码。我使用了第二个,它可以插入,但当类型设置为int时,它将total打印为0或空字符串。这也许和我的约会方式有关?设置如下:YYYY-MM-DD HH:MM:SSDatediff给出天数。这可以是0。您也可以使用timediff,它以小时为单位给出开始和结束之间的时间,这是正确的,但是假设开始=2020-02-10和结束=2020-02-15,时间差应该是5或-5,这取决于您如何设置代码。这不是我的情况,无论两个日期之间的长度差异如何,由于某种原因,结果总是0。我会进一步调查的,谢谢你给我时间!
$query_event = "INSERT INTO events (title, name, color, start, end, total) "
        . "SELECT :title, :name, :color, :start, :end, DATEDIFF(':start', ':end') AS total from dual";