0

複数の mysql テーブルに基づいて動的に作成されるフォームがあります。このフォームは、処理のために外部ページに送信されます。

これは、私の $_POST データが常に異なることを意味します。投稿配列を抽出し、それを削除して、クエリを作成する必要があります。

Posted 配列の print_r は次のとおりです。

Array ( [userid] => 1 [modid1] => on [fid1] => on [fid3] => on [fid5] => on [fid7] => on [fid8] => on [modid3] => on )

ご覧のとおり、この userid、modid、および fid には 3 つの部分があります。問題は、必要な ID を渡すことができる唯一の方法は、そのフィールドに名前を付けることです。したがって、各 modid と fid はデータベース内の行です。その後の数字は更新が必要なIDで、もちろん「オン」はチェックボックスからです。

したがって、最終結果は次のようになります。

より良いアイデアを得るために、通常のクエリの書き方を次に示します

modid1 の場合: UPDATE テーブル SET var = var WHERE modid = 1

for fid1 UPDATE テーブル SET var = var WHERE fid = 1

この配列を生成したコードは次のとおりです。

<form id="ajaxsubmit" method="post" action="modules/users/updaterights.php">
<?php
$modsql = mysql_query("SELECT * FROM modules")or die("Mod failed " .mysql_error());
while($row = mysql_fetch_array($modsql))
{
echo '<div class="rights">';
echo "<ul>";
$userid = safe($_POST['user']);
$id = $row['id'];
$sql = mysql_query("SELECT * FROM modpermissions WHERE userid = '$userid' AND modid =     '$id'")or die("Mod died " .mysql_error());
$sql2 = mysql_fetch_array($sql);
$modper = $sql2['modpermission'];
    if($modper == 1){
        echo '<li><input type="checkbox" name="modid'.$row["id"].'" checked>&nbsp;  <b>'.$row["name"].'</b></li>';
    }
    if($modper == 0){
        echo '<li><input type="checkbox" name="modid'.$row["id"].'">&nbsp;<b>'.$row["name"].'</b></li>';
    }
if($row['features'] == 1)
{
    echo "<ul>";
    $sql = mysql_query("SELECT * FROM features WHERE modid = '$id'")or die("Features  loop failed " .mysql_error());
    while($row2 = mysql_fetch_array($sql))
    {
        $userid2 = safe($_POST['user']);
        $id2 = $row2['id'];
        $sql3 = mysql_query("SELECT * FROM fpermissions WHERE userid = '$userid2' AND  fid = '$id2'")or die("features died " .mysql_error());
        $sql4 = mysql_fetch_array($sql3);
        $fper = $sql4['fpermission'];
            if($fper == 1){
                echo '<li><input type="checkbox" name="fid'.$row2["id"].'"  checked>&nbsp;'.$row2['feature'].'</li>';
            }
            if($fper == 0){
                echo '<li><input type="checkbox"  name="fid'.$row2["id"].'">&nbsp;'.$row2['feature'].'</li>';
            }
    }
    echo "</ul>";
}
echo "</ul>";
echo '</div>';
}
?>
<p><input type="submit" id="submit" value="Submit" class="button"> <input type="reset"  class="reset" value="Reset Form"> </p>
</form>

それは私が知っている混乱です、私は学んでいます。誰かが私の質問を理解し、私が試みていることを達成するために正しい方向に私を向けることができれば、私は感謝します.

4

1 に答える 1

0

最初に行うことは、(非表示フィールドを使用して) チェック ボックスを設定するだけでなく、古い値を保存することです。

また、少なくともフィールド名の区切り文字として固定文字を使用することをお勧めします。これにより、フィールド名を分解して ID の部分を簡単に取得できます。

また、1 つの結果をループするのではなく、結合を使用して、それぞれに対して別のクエリを実行することも検討してください。

出力スクリプトは次のようになります。

<form id="ajaxsubmit" method="post" action="modules/users/updaterights.php">
<?php
$userid = safe($_POST['user']);
$modsql = mysql_query("SELECT modules.id, modules.features, modules.name, modpermissions.modpermission 
                        FROM modules
                        LEFT OUTER JOIN modpermissions
                        ON modules.id = modpermissions.modid
                        AND modpermissions.userid = '$userid'")or die("Mod failed " .mysql_error());
$PrevModuleId = 0;
while($row = mysql_fetch_array($modsql))
{
    if ($PrevModuleId != $row['id'])
    {
        if ($PrevModuleId != 0)
        {
            echo "</ul>";
            echo '</div>';
        }
        echo '<div class="rights">';
        echo "<ul>";
        $PrevModuleId = $row['id'];
    }
    echo '<li><input type="checkbox" name="modid_'.$row["id"].'" '.(($row['modpermission'] == 1) ? "checked='checked'" : "").'><input type="hidden" name="modid_old_'.$row["id"].'" value="'.$row['modpermission'].'">&nbsp;  <b>'.$row["name"].'</b></li>';
    if($row['features'] == 1)
    {
        echo "<ul>";
        $sql = mysql_query("SELECT features.id, features.feature, fpermissions.fpermission 
                            FROM features 
                            INNER JOIN fpermissions 
                            ON features.id = fpermissions.fid
                            AND fpermissions.userid = $userid
                            WHERE modid = '$id'")or die("Features  loop failed " .mysql_error());
        while($row2 = mysql_fetch_array($sql))
        {
            echo '<li><input type="checkbox" name="fid_'.$row2["id"].'"  '.(($row2['fpermission'] == 1) ? "checked='checked'" : "").'><input type="hidden" name="fid_old_'.$row2["id"].'"  value="'.$row2['fpermission'].'">&nbsp;'.$row2['feature'].'</li>';
        }
        echo "</ul>";
    }
}
if ($PrevModuleId != 0)
{
    echo "</ul>";
    echo '</div>';
}
?>
<p><input type="submit" id="submit" value="Submit" class="button"> <input type="reset"  class="reset" value="Reset Form"> </p>
</form>

次に、$_POST 配列の各エントリをループし、_ 文字に基づいてキーを展開し、値がいつ変更されたかを確認し、必要に応じて更新を行うことができます。または、代わりに INSERT を使用できますが、ON DUPLICATE KEY 更新を使用します。型構文 (このようにして、さまざまな値で多くの行を簡単に更新できます)。

また、ユーザー ID 値をフォームのどこかに (おそらく別の非表示フィールドとして) 配置する必要があることに注意してください。これにより、更新で処理する値が得られます。

于 2013-10-28T10:36:10.743 に答える