我使用PostgreSQL进行测试,我设置了一列start_dte
作为日期数据类型,而scheduled_time
和sla_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)。使用库来处理数据库连接和查询是一个好主意。