【发布时间】:2014-05-31 02:10:40
【问题描述】:
我有一个网页,用户可以在其中选择在某个日期他们是可用 (=1) (beschikbaar) 还是不可用 (=0),这些都以列表的形式提供。
不过,我正在使用单选按钮来确保用户无法在同一日期选择可用和不可用。只要用户实际输入他们是否可用,代码就可以正常工作。当用户不输入任何内容时,就会出现我的问题,因为那时,由于隐藏字段,列表中的所有空日期都将发送到值为 0 的数据库。
我需要隐藏字段来确保用户条目和日期实际匹配,但这似乎是上述问题的原因。有人可以说明我可以做些什么来解决这个问题吗?
文件代码:
<?php
if(isset($_POST['beschikbaarheid'])) {
mysql_connect("localhost", "****", "****")or die("cannot connect to server");
mysql_select_db("****")or die("cannot select db");
$UserID = $_POST['UserID'];
$beschikbaarheid = $_POST['beschikbaarheid'];
$Datum = $_POST['Datum'];
foreach ($_POST['Datum'] as $date){
$index = strftime('%d%m%y',strtotime($date));
$beschikbaarheid = (isset($_POST['beschikbaarheid'][$index]) && ($_POST['beschikbaarheid'][$index] == 1 ))?1:0;
mysql_query("INSERT INTO `Werkdagen` (`UserID`, `Datum`, `bevestigd`, `invuldatum`, `beschikbaarheid`) VALUES ('$UserID', '$date', FALSE, NOW(), '$beschikbaarheid')");
-
<?php
setlocale(LC_TIME, 'dutch');
date_default_timezone_set("Europe/Amsterdam");
$two = strtotime('+1 weeks'); $date = time(); while ($date <= $two) {
echo "<li class=".strftime('%A',$date) . "><input name='Datum[]' type='hidden' id='".strftime('%A %e %B %Y',$date) . "' value='".strftime('%Y-%m-%d',$date)."'><input name='beschikbaarheid[".strftime('%d%m%y',$date) . "]' type='radio' value='1'><input name='beschikbaarheid[".strftime('%d%m%y',$date) . "]' type='radio' value='0'>".strftime('%A %e %B %Y',$date) . "</li>";
$date += 86400;
}
【问题讨论】:
-
要么从预先选择的一个开始,要么使用一些验证来确保他们至少检查其中一个。
-
使用外部变量构建 SQL 语句会使您的代码容易受到 SQL 注入攻击。 此外,任何带有单引号的输入数据,例如“O'Malley”,都会被破坏提出您的查询。了解参数化查询,最好使用 PDO 模块,以保护您的 Web 应用程序。 This question 有很多详细的例子。另请参阅bobby-tables.com/php 以了解替代方案和对危险的解释。 运行使用外部数据构建的 SQL 语句就像吃用家门口的食材熬成的汤。
-
正如 Lester 所说,通过基于外部数据的条件生成内部数据的 SQL 语句,这样您就可以控制进入查询的内容。如果您必须使用外部数据,请在插入 MySQL 之前清理所有输入。
标签: php database radio-button