如何正确地发送和插入字段数据到“时间和日期”数据类型的列


How to properly send and insert a field data to a column of Time and Date data type

我使用PostgreSQL进行测试,我设置了一列start_dte作为日期数据类型,而scheduled_timesla_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]: Datatype mismatch:

所以我想知道以postgresql接受的方式格式化用户输入的正确方式是什么。列也是可空的,这意味着用户留下空白的空字段必须在插入时放置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>

这样,更容易操作它们:

$form_data = $_POST['form'];

我强烈建议您使用库来验证和清理最终用户提交的数据(symfony/validator可以完成这项工作,但还有许多其他库)。

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

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

直接使用PDO会在同一层代码中混合不同的关注点(how和what)。使用库来处理数据库连接和查询是一个好主意。

如果您想要数据库抽象,请使用Postgres或任何DBAL或ORM。