如果使用一个查询而不是嵌套查询选中复选框,是否可以向表中添加新行?PHP,MySQL

如果使用一个查询而不是嵌套查询选中复选框,是否可以向表中添加新行?PHP,MySQL,php,mysql,Php,Mysql,经过一番努力,我终于让这个查询工作起来了——但它看起来很笨重,运行起来感觉很慢 我有一个名为UserTable的表,如果特定用户对该项说“是”,则会填充一个名为“Item”的字段。我只想在该实例中将该项的一行添加到UserTable中——换句话说,我不想在表中有太多的user\u ID/item/'no'关系,只想有user\u ID/item/'yes'响应 我构建了一些代码,向用户显示整个数据集,允许他们更改偏好,然后按update。当它们更新时,输出一个名为$checkbox的数组,其中包

经过一番努力,我终于让这个查询工作起来了——但它看起来很笨重,运行起来感觉很慢

我有一个名为UserTable的表,如果特定用户对该项说“是”,则会填充一个名为“Item”的字段。我只想在该实例中将该项的一行添加到UserTable中——换句话说,我不想在表中有太多的user\u ID/item/'no'关系,只想有user\u ID/item/'yes'响应

我构建了一些代码,向用户显示整个数据集,允许他们更改偏好,然后按update。当它们更新时,输出一个名为$checkbox的数组,其中包括项目编号,如1、3、6,它们已勾选为“是”。如果他们没有勾选任何内容,则$checkbox设置为

这里是相关的代码——正如我所说,它非常笨拙,在FOREACH中有一段时间,还有两个验证IF语句。我能摆脱一个或两个吗!并替换为“选择类型”命令

foreach($checkbox as $value)
    {if($value!="") {
        $sql=   "SELECT count(Item) as row_exists 
                FROM UserTable
                WHERE Item = '$value' and 
                User_ID = '$current_user_id'";

        $result = mysqli_query($mysqli,$sql) or die(mysqli_error($mysqli));

        while ($iteminfo = mysqli_fetch_array($result)) {
            If ((int)$iteminfo['row_exists']==0) { 
                    $sql = "INSERT INTO UserTable 
                            (User_ID,Item,Date) VALUES
                            ('$current_user_id','$value',now() )";
            $add_new_row = mysqli_query($mysqli,$sql) or die(mysqli_error($mysqli));
            } 
        }
    }
}

非常感谢。

您可以删除以下两种if语句:

在上筛选您的复选框阵列!=并循环这些结果。如果它检查到!=,就可以去掉第一个

扩充初始查询以包括行_exists=0,并迭代这些结果。这就排除了第二个if

事实上,您可能会将两条sql语句合并到一个复合条件插入中。允许您插入表单:

INSERT INTO table (SELECT ...)

因此,您可以考虑使用第一个查询并将其调整/替换为SELECT。。。以上查询的一部分,并将您的第二次插入和修改/替换为插入到。。。因此,如果一个用户可以与多个项目关联,那么您似乎应该对此进行规范化,并且可能有三个表—一个用于用户,一个用于项目,以及一个多对多表格,将用户与项目关联起来。

我不太理解您的问题简短版:我是否需要在循环中运行循环,或者是否有一种编码方法可以更快地运行?为什么不设置表格,使项目成为唯一字段??这样,你就不必检查它是否存在了。@craig1231-不确定我是否正确理解了你的意思,仍然在学习诀窍,但是同一个项目可以在UserTable中出现很多次,因为许多用户都可以选择它-这有意义吗?是的。您可以创建从项和用户id派生的唯一键。因此,单个用户可以有多个项,单个项可以有多个用户。但是表中只有一个Item和User_id的实例,如果这有意义的话?因此,如果密钥被复制,则插入将无声地失败,我想这就是您正在尝试的?嗨,user1161318,我喜欢您的2的声音,我更喜欢您最后一句的声音。。。我现在不知道该怎么做这两个n00b,我担心,但谢谢你的指点,我会带上我的思考帽!干杯。如果你需要更多的帮助,我们可以拿着这个聊天,我可以看看我能做些什么。再一次你好,我们上一次的帖子传过来了-看起来很理想,我会试试,让你知道结果如何。再次感谢,我的荣幸!如果合并查询,我会对您的性能非常感兴趣。