Php 如何正确发送字段数据并将其插入到时间和日期数据类型的列中

Php 如何正确发送字段数据并将其插入到时间和日期数据类型的列中,php,postgresql,Php,Postgresql,我使用PostgreSQL进行测试,我将一列start\u dte设置为日期数据类型,而scheduled\u time和sla\u time都是时间数据类型。我已经创建了一个允许我插入新记录的表单 <form action="<?php $_SERVER['PHP_SELF'] ?>" method="POST"> <table border="0" cellspacing="10"> <tr> &

我使用PostgreSQL进行测试,我将一列start\u dte设置为日期数据类型,而scheduled\u time和sla\u time都是时间数据类型。我已经创建了一个允许我插入新记录的表单

<form action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
    <table border="0" cellspacing="10">
        <tr>
            <td>RID:</td> <td><input type="text" name="newrid" value=""></td>
        </tr>
        <tr>
            <td>Day:</td> <td><input type="text" name="newday" value=""></td>
        </tr>
        <tr>
            <td>Scheduled Time:</td> <td><input type="text" name="newsched" value=""></td>
        </tr>
        <tr>
            <td>SLA Time:</td> <td><input type="text" name="newsla" value=""></td>
        </tr>
        <tr>
            <td>Start Date:</td> <td><input type="text" name="newsd" value=""></td>
        </tr>
        <tr>
            <td><INPUT TYPE="submit" VALUE="Save" NAME="submit"></td>
        </tr>
</table>
下面的PHP代码如下所示:

<?php
    if(isset($_POST['submit'])) {
        $rid = $_POST['newrid'];
        $day = $_POST['newday'];
        $scheduled_time = $_POST['newsched'];
        $sla_time = $_POST['newsla'];
        $start_dte = $_POST['newsd'];
        $data = $dbh->prepare("INSERT into meta_auto_reports.frequency values ($rid, '$day', $scheduled_time, $sla_time, $start_dte)"); 
        $data->execute();
        echo "<h2>Inserted Successfully</h2>";
        $data = null;
    }
?>
这显示提交时出现错误:

致命错误:未捕获的异常“PDOException”带有消息 'SQLSTATE[42804]:数据类型不匹配:


因此,我想知道,以postgresql可以接受的方式格式化用户输入的正确方式是什么。这些列也可以为NULL,这意味着用户留下的空白字段在插入时必须为NULL。

关于此代码的几点注释:

表单值应存储在数组中:

<td>RID:</td> <td><input type="text" name="form[newrid]" value=""></td>
<td>Day:</td> <td><input type="text" name="form[newday]" value=""></td>
我强烈建议您使用一个库来验证和清理最终用户提交的数据symfony/validator完成这项工作,但还有许多其他库

现在,数据库部分。发送到数据库的数据需要转义,以保护应用程序不受SQL注入的影响。使用预处理语句是将数据作为参数传递的一种方法:

$stmt->prepare("INSERT into meta_auto_reports.frequency values (:id, :day, :scheduled_time …)");
$stmt->execute($form);

直接使用PDO确实会在同一层代码中混合不同的关注点,即how和what。使用库处理数据库连接和查询是一个好主意。Pomm,如果您想要数据库抽象,请特别使用Postgres或任何DBAL或ORM。

。。。剩下的错误是什么?
$stmt->prepare("INSERT into meta_auto_reports.frequency values (:id, :day, :scheduled_time …)");
$stmt->execute($form);