0

スポーツリーグのデータベースに備品を挿入するように設計されたフォームで問題が発生しています。

前のページには、_POST "area" / "division" / "season"を介して定義するフォームが含まれ、 "hometeam [$ i ] "、" awayteam[$i]"など。

フィクスチャの入力を処理するページで、フォームの個々の反復(つまり、「hometeam [1]」、「awayteam [1]」など)を$ _POST配列内からプルし、それをに挿入する必要があります。次のデータベースに移動する前のMYSQLデータベース。私はforeachとif句で完全に頭を悩ませているので、ここで質問するのが最善だと思いました。

<?php
$a=1;
while($a<11){
foreach($_POST as $key){
if(is_array($key))
{foreach($key as $value1=>$value2){
    if($value1=$a){
    if($_POST='hometeam')$home_id=$value2;
    else if($_POST='awayteam')$away_id=$value2;
    else if($_POST='day')$day=$value2;
    else if($_POST='month')$month=$value2;
    else if($_POST='year')$year=$value2;
    else if($_POST='hour')$hour=$value2;
    else if($_POST='mins')$mins=$value2;}
    $date = ($year . "-" . $month . "-" . $day);
    $time = (($hour) . ":" . ($mins) . ":00");
    $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id'";
    if($hour != "00"){
$enter_result = mysql_query($enter_query);
}}}

}
$a++;
}
?>

私がここで露骨に間違っているところを誰かが指摘できれば、私は非常に感謝するでしょう。これほど難しいことではないと思いますが、私は慌てて、入力した内容を超えて見ることができず、私の知識が現状のまま正確であるかどうかはわかりません。

配列でprint_rを実行すると、次の構造が得られます。

Array ( [area] => 1 [season] => 2 [division] => 1 [hometeam]
=> Array ( [1] => 17 [2] => 2 [3] => 12 [4] => 17 [5] => 17
[6] => 17 [7] => 17 [8] => 17 [9] => 17 [10] => 17 ) [awayteam]
=> Array ( [1] => 6 [2] => 4 [3] => 10 [4] => 17 [5]

ここで、同じ10倍の構造が続き、配列はhometeam、awayteam、day、month、year、hour、minsとしてインデックス付けされます。

4

2 に答える 2

0

$_POSTは連想配列であるため、その値はキー名を介してアクセスされます。たとえば、$_POST['hometeam']。これには、各値の配列が含まれhometeam[]ます。

次に、=演算子は値を割り当てるためのものであり、==は比較のためのものであることを覚えておく必要があります。したがって、($ value = $ a)が$aを$valueに割り当て、その結果を返す場合、論理テストではありません。

if/elseの大きなチェーンをselectブロックに置き換えることを検討する必要があります。しかし、それはオプションであり、あなたの例からそのままにしておきます。

私の最後の提案は、空白を使用する必要がないということです。これにより、コードが正しく機能していないときにコードを確認するのがはるかに簡単になります。

私はこのコードをテストしていませんが、これは私があなたが持っているものを作り直す方法です。

<?php
    $a=1;
    while ($a<11) {
        foreach ($_POST as $key => $value) {
            if (isarray($value)) {
                foreach ($value as $value1 => $value2) {
                    if ($value1 == $a){
                        if ($key == 'hometeam') { $home_id = $value2; }
                        else if($key == 'awayteam') { $away_id = $value2; }
                        else if($key == 'day') { $day = $value2; }
                        else if($key == 'month') { $month = $value2; }
                        else if($key == 'year') { $year = $value2; }
                        else if($key == 'hour') { $hour = $value2; }
                        else if($key == 'mins'){ $mins = $value2;}
                        $date = ($year . "-" . $month . "-" . $day);
                        $time = (($hour) . ":" . ($mins) . ":00");
                        $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id')";
                        if ($hour != "00"){
                            $enter_result = mysql_query($enter_query);
                        }
                }
            }

        }
        $a++;
    }
?>

これで少なくとも正しい方向に進むことを願っています。

編集:私はこれを少しリファクタリングしました。フォームに何が返されるか(これはセキュリティの問題です)のチェックは行いませんが、それはこの質問の範囲外です。

<?php
    $a=1;
    while ($a<11) {

        $date = ($_POST['day'][$a] "-" . $_POST['month'][$a] . "-" . $_POST['day'][$a]);
        $time = ($_POST['hour'][$a] . ":" . $_POST['mins'][$a] . ":00");
        $hometeam = $_POST['hometeam'][$a];
        $awayteam = $_POST['awayteam'][$a];
        $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$hometeam', '$awayteam', '$date', '$time', '$league_id')";
        if ($_POST['hour'][$a] != "00"){
            $enter_result = mysql_query($enter_query);
        }
        $a++;
    }
?>

League_idがどこから来たのかわかりません。$ _POSTの一部である場合は、同じ方法で参照できます(配列でない場合は、[$ a]を使用しないでください)。

于 2012-08-02T03:27:05.823 に答える
0

php変数を使用して、他のphp変数を作成することもできます。
したがって、post変数を対応する変数に変換するには、変数を「$ {$ variable}」内に配置します。 可能であれば、年、月、日を任意の日付文字列として渡し、 date(」を 使用する

こともお勧めします。 Ymd "、strtotime($ dateStr))でフォーマットします。 date( "H:i:00"、mktime($ hour、$ mins)) ; を連結する代わりに、phpdateとmktimeを使用して時刻をフォーマットすることもできます 。 また、出力をサニタイズするようにして くださいhttp://www.php-developer.org/best-practices-when-sanitizing-post-to-prevent-mysql-and-xss-attacks/




for ($ix=0; $ix<11; $ix++) {
    foreach ($_POST as $key=>$stat) {
        // If it is an array, extract value according to index ($ix)
        /* Update
        if(is_array($stat))
            ${$key}=sanitize_str($key[$stat][$ix]);
        else
            ${$key}=sanitize_str($key[$stat]);
        */
        //UPDATE!
        if(is_array($stat))
            ${$key}=sanitize_str($stat[$ix]);
        else
            ${$key}=sanitize_str($stat);
    }
    // If you pass date as separate values
    $date = $year."-".$month."-".$day;
    // If you pass date as a sting, use
    // $date=date("Y-m-d",strtotime($date));
    $time = $hour.":".$mins.":00");

    $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) 
                VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id')";
    if($hour != "00"){
        $enter_result = mysql_query($enter_query);
    }
}

function sanitize_str($data){
    $data=trim($data);
    $data=htmlspecialchars($data);

    $data = mysql_real_escape_string($data);
    return $data;
}

私はまだこれを完全にテストしていませんが、動作するはずです。
$ {$ key}行で、$keyが値"hometeam"の場合、$ {$key}は${hometeam}になります。これは、$hometeamと言うのと同じことです。

于 2012-08-02T03:52:03.250 に答える