计算每行中真实值的数量

时间:2016-05-22 10:04:53

标签: php html mysql optimization phpmyadmin

我使用PHPMyAdmin创建了一个MySQL数据库,它存储用户在网页上选择的数据。基本上,用户可以单击页面上的按钮,单击它们时,数据库中的相应列将从0更改为1.但是,我只希望每个用户最多可以选择6个选项。 例如:

ID OPT1 OPT2 OPT3 OPT4 opt5 opt6 opt7 opt8
1 0 1 0 0 0 1 1 0 3
2 1 1 1 1 0 1 0 1 6
3 1 0 0 0 0 0 0 0 1

'id'代表每个用户,'opt#'是他们选择的选项,'total'是所选选项的数量。

我用过的代码是

//$id is the id of the user that is logged in
$total=$row['total']; //Fetch data from column 'total' for logged in user
$choice=$_GET['opt']; //Set 'choice' variable to value submitted by button
$selected=$row[$choice]; //Fetch value of corresponding column

if ($total>= 6) {   
    echo "Too many selected";   
}
elseif (!$selected) {
    mysqli_query($con,"UPDATE `choices` SET `$choice` = '1', `total` = total+1 WHERE `choices`.`id` = '$id'");
}
else {
    echo "You have already selected this";
};

此代码工作正常并且在count等于6时阻止数据库更新,但我担心用户可能能够修改该值作为选择更多选项而不是它们应该,或者当我添加时可能只是一个问题允许用户取消选择选项的代码。

是否可以通过计算值为1的“opt#”列数而不是每次用户选择其他选项时添加1来自动更新“总计”列?我想它会涉及添加值,但由于我是PHP和MySQL的初学者,我不确定用什么代码来实现它。

希望我的问题不会太混乱(我很乐意澄清任何事情)。感谢。

2 个答案:

答案 0 :(得分:2)

如果您使用MariaDB(更好的MySQL),您可以创建一个包含6个字段之和的虚拟列。它会自动更新,您也可以在其上添加索引。

CREATE TABLE table1 (
     id INT NOT NULL,
     opt1 int DEFAULT '0',
     opt2 int DEFAULT '0',
     opt3 int DEFAULT '0',
     opt4 int DEFAULT '0',
     opt5 int DEFAULT '0',
     opt6 int DEFAULT '0',
     total INT AS (opt1+opt2+opt3+opt4+opt5+opt6) PERSISTENT);

参见手册:https://mariadb.com/kb/en/mariadb/virtual-computed-columns/

<强>示例

MariaDB [bb]> CREATE TABLE table1 (
    ->      id INT NOT NULL,
    ->      opt1 int DEFAULT '0',
    ->      opt2 int DEFAULT '0',
    ->      opt3 int DEFAULT '0',
    ->      opt4 int DEFAULT '0',
    ->      opt5 int DEFAULT '0',
    ->      opt6 int DEFAULT '0',
    ->      total INT AS (opt1+opt2+opt3+opt4+opt5+opt6) PERSISTENT);
Query OK, 0 rows affected (0.50 sec)

MariaDB [bb]> insert into table1 (opt3,opt4) VALUES (1,1);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [bb]> insert into table1 (opt3) VALUES (1);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [bb]> insert into table1 (opt1) VALUES (1);
Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [bb]> select * from table1;
+----+------+------+------+------+------+------+-------+
| id | opt1 | opt2 | opt3 | opt4 | opt5 | opt6 | total |
+----+------+------+------+------+------+------+-------+
|  0 |    0 |    0 |    1 |    1 |    0 |    0 |     2 |
|  0 |    0 |    0 |    1 |    0 |    0 |    0 |     1 |
|  0 |    1 |    0 |    0 |    0 |    0 |    0 |     1 |
+----+------+------+------+------+------+------+-------+
3 rows in set (0.04 sec)

MariaDB [bb]>

答案 1 :(得分:0)

这是真正的问题/解决方案吗?考虑以下事项......

您发布了自己的用户界面。很快,“用户”就会打电话给你抱怨:“我点击一个按钮但没有发生任何事情!”。首先,你盯着代码看看是否有什么东西坏了。然后你就会记住你的“6”限制并询问他们是否有6个。用户要么在UI上感到尴尬或生气,不要让它更明显。

然后你意识到你需要一个弹出窗口,或者有一个“总计= 6”的闪光灯,或其他什么东西,这样投诉就不会再次出现了。

换句话说,首先要建立一个友好的用户界面,然后才能看到需要的SQL。

完成后,您可以决定免除“总计”列。