0

在用户输入出生日期后,我可以从数据库中检索出生日期并将其填充到选项标签中。但是,如果用户更新表单中的任何其他内容,则选项值开始使用错误的出生日期更新数据库。由于某种原因,它似乎在倒数。我该如何解决这个问题?

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>
4

1 回答 1

0

您提供的数据对您的查询不是很清楚,但这里是:

$dob 是我理解的字符串,格式为 YYYY-MM-DD。updateProfile 似乎没问题,但我不知道 $udata 来自哪里。如果您发布的是完整功能,则 $udata 始终为空并且您返回空。

至于模板,我不知道您如何为选项按钮生成 HTML。但是,您似乎确实可以覆盖现有选项,即如果该月份选择用户在二月出生怎么办。第一行将与第三行重复:

<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 作为月份,即二月。

最后的建议是(如果可能的话)使用可以有效地为您完成所有艰苦工作的日期时间控件。您所要做的就是将 dob 字符串传递给它,当用户更新他们的 dob 时,它会发回您的应用可以轻松解析的数据,更重要的是日期将始终有效,即不可能在 2 月 31 日至少来自用户界面。例子

HTH。

于 2012-09-07T19:59:28.113 回答