首页 > 解决方案 > 单击复选框并将它们保存到 MySQL 时检查其他复选框

问题描述

我正在使用 MySQL,当您单击复选框时,它们会将其数据/值 (tinyint(1)) 保存到数据库表中,因此它将显示为选中或未选中的复选框。

简单地说,现在我想举个例子:

我之前尝试过一些脚本,但是如果我点击例如 Grade 3,则会同时检查 Grade 1 和 Grade 2,但是当我刷新页面时,只有 Gradetwo 会发生变化。因此,无论我关闭浏览器,更改浏览器,复选框仍然按照我离开它们的方式进行检查。遗憾的是,我对解决此问题的编码知之甚少。

提供更多细节:我正在尝试制作设备跟踪器之类的东西?游戏。该游戏中有100多种武器,盔甲等,我将它们全部放入我的MySQL数据库中,它们都有一个唯一的ID,设备的名称和4个复选框,这将表明我是否获得了这个然后升级它们最高可达 3 级。

例如,表中的武器如下所示:https ://imgur.com/tIv5wSe

姓名 - [1]获得 - [2]1 年级 - [3]2 年级 - [4]3 年级

武器 01 - [1] - [2] - [3] - [4]
~
武器 04 - [X] - [X] - [X] - [X]
~
武器 07 - [X] - [X] - [ 3] - [4]

如果我要出售 3 级武器(例如武器 04),这意味着我将失去它并且必须重新获得它,因此通过单击操作 [1],它也会删除 [2][3][ 4]。

希望这是有道理的,并且有人可以帮助我。

下面是我目前正在使用的一些代码,希望能给你一些想法。

Index.php 的一部分

echo "<div id=msg_display></div>";

$q="
SELECT id,name
     , if( obtained=true,'checked','') as obtained
     , if( gradeone=true,'checked','') as gradeone
     , if( gradetwo=true,'checked','') as gradetwo
     , if( gradethree=true,'checked','') as gradethree
  FROM weapons
";


echo "<table class='table table-striped'> ";
$th="<tr class='info'> <th>Name</th><th>obtained</th><th>gradeone</th><th>gradetwo</th><th>gradethree</th></tr>";
echo $th; 
$i=1;
if ($result_set = mysqli_query($connection,$q)) {
while($row = $result_set->fetch_array(MYSQLI_ASSOC)){
echo "<tr><td>$row[name]</td>
<input type=checkbox data-column_name='obtained' data-id='$row[id]' $row[obtained]>
<input type=checkbox data-column_name='gradeone' data-id='$row[id]' $row[gradeone]>
<input type=checkbox data-column_name='gradetwo' data-id='$row[id]' $row[gradetwo]>
<input type=checkbox data-column_name='gradethree' data-id='$row[id]' $row[gradethree]>
</tr>";

";
$i=$i+1;
if(fmod($i,10)==0){//echo $th;
}
}
 $result_set->close();
}

Index.php 中的脚本

<script>
$(document).ready(function() {
////////////////////    
$('input[type="checkbox"]').change(function(){
var column_name=$(32).data('column_name');
var id=$(this).data('id');
$.post( "data-check.php", {"column_name":$(this).data('column_name'),"id":$(this).data('id')},function(return_data,status){
$("#msg_display").html(return_data);
$("#msg_display").show();
setTimeout(function() { $("#msg_display").fadeOut('slow'); }, 5000);
});
});
//////////////////////////
});
</script>

数据检查.php

<?php
$column_name=$_POST['column_name'];
$id=$_POST['id'];
if(!ctype_alpha($column_name)){
echo " Data error ";
exit;
}
include "config-mysqli.php"; // database connection details stored here
$q=" 
UPDATE weapons 
   SET $column_name = !$column_name 
 WHERE id=?
 ";
$stmt = $connection->prepare($q);
if($stmt){
$stmt->bind_param('i',  $id);
$stmt->execute();   
$msg="Data Updated for : $column_name ";    
}else {
$msg="No Data Updated for : $column_name ";     
}
echo "$msg";
?>

标签: javascriptphpmysqldatabasecheckbox

解决方案


考虑以下内容,如果没有别的,至少会证明我在编写代码方面很糟糕......

DROP TABLE IF EXISTS inventory;

CREATE TABLE inventory
(user_id INT NOT NULL
,weapon_id INT NOT NULL
,level_code TINYINT NOT NULL
,PRIMARY KEY(user_id,weapon_id)
);

INSERT INTO inventory VALUES (1,101,1),(1,102,2),(1,103,3);
INSERT INTO inventory VALUES (2,104,3);

DROP TABLE IF EXISTS weapons;

CREATE TABLE weapons
(weapon_id SERIAL PRIMARY KEY
,weapon_name VARCHAR(12) UNIQUE
);

INSERT INTO weapons VALUES
(101,'nudger'),
(102,'poker'),
(103,'blaster'),
(104,'pulverizer');

通过检查,我们可以看到用户 1 拥有除粉碎机之外的所有武器。

<?php

require('path/to/pdo/connection/statme.nts');

$query = "
SELECT w.weapon_id
     , w.weapon_name
     , COALESCE(i.level_code,0) level
  FROM weapons w
  LEFT
  JOIN inventory i
    ON i.weapon_id = w.weapon_id
   AND i.user_id = 1
 ORDER
    BY weapon_id;
";
$stmt  = $pdo->prepare($query);
$stmt->execute();
$data  = $stmt->fetchAll();

?>

<table>
   <tr>
    <th>weapon name</th>
    <th>Grade I</th>
    <th>Grade II</th>
    <th>Grade III</th>
    <th>Grade IV</th>
   </tr>

<?php

$flag1 =0;
$flag2 =0;
$flag3 =0;
$flag4 =0;

foreach( $data as $v ) {
if($v['level']>=1) {$flag1=1;} else {$flag1=0;}
if($v['level']>=2) {$flag2=1;} else {$flag2=0;}
if($v['level']>=3) {$flag3=1;} else {$flag3=0;}
if($v['level']>=4) {$flag4=1;} else {$flag4=0;}

  echo "<tr>
         <td>".$v['weapon_name']."</td>
         <td>$flag1</td>
         <td>$flag2</td>
         <td>$flag3</td>
         <td>$flag4</td>
        <tr>";
}
?>

</table>

输出:

weapon name Grade I Grade II Grade III Grade IV
nudger         1       0        0         0
poker          1       1        0         0
blaster        1       1        1         0
pulverizer     0       0        0         0

推荐阅读