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 をどのように生成するのかわかりません。ただし、既存のオプションを上書きする可能性があるようです。つまり、ユーザーが 2 月に生まれた月を選択した場合はどうなるでしょうか。最初の行は 3 番目の行と重複します。

<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 月) として 02 を選択した場合はどうなるでしょうか。

最後の提案は、(可能であれば)すべての面倒な作業を効果的に行う日時コントロールを使用することです。dob 文字列を渡すだけで、ユーザーが自分の dob を更新しているときに、アプリが簡単に解析できるデータがポストバックされます。さらに重要なことに、日付は常に有効です。つまり、2 月 31 日である可能性はありません。少なくともUIから。

HTH。

于 2012-09-07T19:59:28.113 に答える