【问题标题】:How do I extract variables from dynamic array and create an update query?如何从动态数组中提取变量并创建更新查询?
【发布时间】:2013-11-06 19:52:30
【问题描述】:

我有一个基于多个 mysql 表动态创建的表单。此表单发送到外部页面进行处理。

这意味着我的 $_POST 数据总是不同的。我需要提取 post 数组,将其剥离并创建一个查询。

这是 Posted 数组的 print_r:

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

如您所见,这个用户 ID、modid 和 fid 分为三个部分。问题是,我可以传递我需要的 id 的唯一方法是命名这些字段。所以每个 modid 和 fid 都是 db 中的行。后面的数字就是需要更新的id,当然“on”是在复选框里。

所以最终结果会是这样的:

为了更好地了解我将如何正常编写查询

对于 modid1: UPDATE 表 SET var = var WHERE modid = 1

对于fid1 更新表 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>

我知道这是一团糟,我正在学习。如果有人能理解我的问题并指出正确的方向来完成我正在尝试的事情,我将不胜感激。

【问题讨论】:

  • 请记住,未选中复选框时不会返回复选框值。因此,您的代码可以在选中复选框时更新记录,但在取消选中时无法关闭它们。
  • 确实如此。我认为这种方法将是最好的选择。但是我认为这很复杂。从那以后,我将它们更改为收音机,并试图让我的代码使用它们来工作。我用那个方法以及你提供的其他方法做得更进一步。

标签: php mysql arrays dynamic


【解决方案1】:

首先要做的是存储旧值以及复选框(使用隐藏字段)。

我还建议至少在字段名称中使用固定字符作为分隔符,这样您就可以分解字段名称以轻松获取 id 部分。

还可以考虑使用连接,而不是围绕一个结果循环,并为每个结果执行另一个查询。

您的输出脚本将如下所示:-

<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 值放在表单中的某个位置(可能作为另一个隐藏字段),以便您拥有处理更新的值。

【讨论】:

  • Kickstart,感谢您的建议。我会尽我所能使用它们。话虽如此。我试了一下你的代码,它解决了一个问题。它不是循环遍历表中的所有行,而是只显示必须检查的行。我试图追查它的问题,但无法。话虽如此,我已经使用了您提供的代码元素,并且正在尝试一种更简单的方法来解决我的问题。
  • 循环隐藏字段,并为每个隐藏字段检查单选按钮/复选框的存在。如果找到你就知道它已经设置了,但是如果没有找到你就知道它没有设置。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多