我可以从数据库中检索出生日期,并在用户输入出生日期后将其填入选项标签中。但是,如果用户更新表单中的任何其他内容,则选项值将以错误的出生日期开始更新数据库。似乎它出于某种原因倒退了。怎么办我解决这个问题?
if($_POST){
$dob = date('Y-m-d',strtotime($_POST['year']."-". $_POST['month']."-".$_POST['day']));
$retur = $userObj->updateProfile($dob);
}
public function updateProfile($dob){
$db = db_mysql::getInstance();
$qr = $db->query("UPDATE ".USERS." SET dob = $dob WHERE id = '".$udata."'") or die(mysql_error());
return $udata;
}
<label>Date of Birth:</label>
<select style="background-color: #D6CFD4;" name="month">
<option value="{date('F',strtotime($udata.dob))}">{date('F',strtotime($udata.dob))}</option>
<option value="01">January</option>
<option value="02">Febuary</option>
<select style="background-color: #D6CFD4;" name="day">
<option value="{date('d',strtotime($udata.dob))}">{date('d',strtotime($udata.dob))}</option>
<option value="01">01</option>
<option value="02">02</option>
<select style="background-color: #D6CFD4;" name="year">
<option value="{date('Y',strtotime($udata.dob))}">{date('Y',strtotime($udata.dob))}</option>
<option value="2012">2012</option>
<option value="2011">2011</option>
答案 0 :(得分:0)
您提供的数据对您的查询不是很清楚,但请注意:
$ dob是我所理解的字符串,格式为YYYY-MM-DD。 updateProfile似乎没问题,但我不知道$ udata来自哪里。如果您发布的是完整函数,那么$ udata始终为空,您将返回空白。
至于模板,我不知道如何为选项按钮生成HTML。但是,你似乎可以覆盖现有的选项,即如果当月选择用户出生在2月份。第一行将与第三行重复:
<option value="{date('F',strtotime($udata.dob))}">{date('F',strtotime($udata.dob))}</option>
<option value="01">January</option>
<option value="02">Febuary</option>
一些建议:
您似乎没有检查输入。无论您认为您的应用程序有多安全,总会有人找到干扰它的方法。使用$ _POST ['year']等而不对它们进行消毒甚至将它们作为整数转换是不理想的。
您没有使用绑定参数,这是确保您不易受SQL注入攻击的必要条件。它可能是遥不可及的,但如果以某种方式,updateProfile将其收到$ dob:
$dob = "1;DROP users; --"
那你就麻烦了。
最后的建议是检查你的选择陈述。我会这样做:
<select style="background-color: #D6CFD4;" name="day">
<?php
for ($i = 1; $i < 32; $i++) {
$dob_day = (int) date('d', strtotime($udata.dob));
$selected = ($i == $dob_day) ? " selected='selected'" : '';
echo "<option value='{$i}'{$selected}>{$i}</option>";
}
?>
</select>
您可以重复月份和年份的过程。此过程虽然不一定会产生有效日期。例如,如果有人在当天选择31,而在月份选择02,即2月,那该怎么办。
最终建议是(如果可能的话)使用日期时间控件,这将有效地为您完成所有艰苦的工作。您只需将dob字符串传递给它,当用户更新其dob时,它将回发您的应用程序可以轻松解析的数据,更重要的是日期将始终有效,即2月31日的可能性至少从UI。 Example
HTH。