我有一个包含5个文本框的HTML表单。点击提交按钮后,表单被提交到一个名为"admin.php"的页面
admin.php
<?php
include($_SERVER['DOCUMENT_ROOT'] . '/inc/init.php');
$reference_key = $_POST['reference_key'];
$success = false;
switch ($reference_key)
{
case 0: break;
case 2: {
$date = $_POST['date'];
$time = $_POST['time'];
$gym = $_POST['gym'];
$home = $_POST['home'];
$away = $_POST['away'];
$success = "";
try {
newGame($db7, $date, $time, $gym, $home, $away);
$success="index.php";
}
catch (Exception $e)
{
$success="/404";
}
//header("Location: " . $success);
} break;
default: break;
}
function newGame($db, $date, $time, $gym, $home, $away)
{
$db->addGameToSchedule($date, $time, $gym, $home, $away);
}
?>
提交表单时,会传递一个引用密钥。引用键的值为"2",正如您在上面admin.php的代码中所看到的,当键为2时,将执行一组特定的代码。如代码中所指出的,执行函数newGame
,该函数又调用函数addGameToSchedule
。
addGameToSchedule函数:
public function addGameToSchedule($date, $time, $gym, $home, $away) {
try {
print "Date: " . $date . "'nTime: " . $time . "'nGym: " . $gym . "'nHome: " . $home . "'nAway: " . $away;
$sth = $this -> db -> prepare("INSERT INTO schedule (date, time, gym, home, away) VALUES (':date', ':time', ':gym', ':home', ':away')");
$sth -> execute(array(':date' => $date, ':time' => $time, ':gym' => $gym, ':home' => $home, ':away' => $away));
} catch (Exception $e) {
header('Location: /404');
}
}
函数顶部的print
语句用于检查值是否正确传递。执行代码时,print语句会正确打印我输入的信息。然而,当我检查数据库中的新行值时,我只看到我插入的5列中的"0"
我做错了什么?如果我需要添加更多信息,请告诉我。
不要将参数占位符放在引号内。在引号中,任何不包含数字的文字字符串都将转换为0。就像SELECT 1 + 'abc'
返回1+0或1一样。
改为:
$sth = $this -> db -> prepare("INSERT INTO schedule (date, time, gym, home, away)
VALUES (:date, :time, :gym, :home, :away)");
来自@redolent:的重新评论
试试这个:
mysql> SELECT ':date' AS value;
+-------+
| value |
+-------+
| :date |
+-------+
带引号的字符串是文字,而不是参数占位符。在该示例中,它只是一个字符串文字。
如果我们强迫它被解释为一个数字:
mysql> SELECT 0 + ':date' AS value;
+-------+
| value |
+-------+
| 0 |
+-------+
1 row in set, 1 warning (0.04 sec)
Warning (Code 1292): Truncated incorrect DOUBLE value: ':date'
如果我们强制将其解释为日期:
mysql> SELECT DATE(':date') AS value;
+-------+
| value |
+-------+
| NULL |
+-------+
1 row in set, 1 warning (0.35 sec)
Warning (Code 1292): Incorrect datetime value: ':date'