2012-09-07 28 views
0

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

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

您的查询也不是很清楚跟你提供,但这里有云中的数据:

$ 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日和2月份,即2月份。

最后的建议是(如果可能)使用日期时间控件,它可以有效地为您完成所有的辛苦工作。您只需将dob字符串传递给它,当用户更新他们的dob时,它会回传您应用可以轻松解析的数据,更重要的是这些日期将始终有效,即2月31日没有可能至少从用户界面。 Example

HTH。

+0

OP将三部分零件通过strtotime,然后通过date()重新格式化。它不是完全有效的,但它会产生某种合法的日期,即使它是'1970-01-01',因为strtotime barfed并返回一个布尔值false /零。 –