使用复选框从 MySQL 中的多个表中选择数据,并根据复选框显示表字段
Posted
技术标签:
【中文标题】使用复选框从 MySQL 中的多个表中选择数据,并根据复选框显示表字段【英文标题】:Select data from multiple tables in MySQL using check boxes and show the table field according to checkbox 【发布时间】:2016-05-25 03:56:59 【问题描述】:我的用户数据库中有两个表。
第一个表包含用户唯一 ID、姓名、联系电话和其他个人信息。
第二个表包含来自第一个表的用户的唯一 ID 和设备信息,例如他的第一台机器号、第二台机器号等等。
我的表 2 结构是..
在报告页面上,我使用这个以表格形式显示所有信息
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
$result = $conn->query($sql);
if ($result->num_rows>0) ?>
<table ><tr><td> Uid</td><td> Name</td>
<td> Micro Atm</td>.......and all column of both tables </tr>
<?php while($row = $result->fetch_array())
echo "<td>". $row['uid']. "</td>";
echo "<td>". wordwrap($row['name'],15,"\n",1). "</td>"; ....and all
echo "</table>";
它工作正常。但我想显示一个定制的报告。这意味着我想为表格字段的用户提供复选框/单选按钮。如果他选择字段使用复选框,那么它只显示那些复选框/单选按钮被选中的值。它喜欢用户选择三个复选框/单选按钮,如 Uid、名称、m_atm。它仅显示两个表中三列的详细信息,并相应地显示这些列的表视图。
【问题讨论】:
您需要通过 SQL 查询选择此字段还是只显示选定的字段? .. 您可以按原样使用您的查询,但使用选定的列分析 POST/GET 查询并仅显示该字段,即不要触摸 sql,而是更改视图。 【参考方案1】:如果我不了解你,你需要添加到ON d.uid=e.uid"
这样的ON d.uid=e.uid" AND Uid=$id AND name=$name And m_atm=$atm
,或者添加到哪里(到where
我的东西不好)
例如
html:
<form method="get" action="/a.php">
<input type="checkbox" name="check1" value="text1"/>
<input type="checkbox" name="check2" value="text2"/>
<input id="submit" onclick="f();return false;" type="button" value="ok"/>
</form>
PHP (test.php)
if(isset($_GET['check1'])) $id=" AND Uid='$_GET[check1]'"; //if is checked first
if(isset($_GET['check2'])) $name=" AND name='$_GET[check2]'"; //if is checked second
/* . . . */
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON (d.uid=e.uid $id $name )";
var_dump($sql);
JS:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
function f()
var url;
var xmlhttp,
url="/text.php?"+$('form').serialize(); //change text.php
if (window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if (window.ActiveXObject)
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
xmlhttp.open('GET', url, true);
xmlhttp.onreadystatechange = function()
if (xmlhttp.readyState == 4)
myfunction(xmlhttp.responseText);
xmlhttp.send(null);
function myfunction(response) alert(url+' '+response);
//do something
</script>
那个php代码很简单,但是你可以使用循环和键值来让它看起来更好
例如,您可以对所有 ckeckboxes 元素使用 <input name=text[]>
并执行此操作
foreach ($_GET['text'] as $key => $value)
if($key==0) $key='uid'; else
if($key==1) $key='name'; else
if($key==2) $key='m_atm';
$q.="$key='$value' AND ";
$q=substr($q,0,strlen($q)-5);
$sql2 = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON (d.uid=e.uid $q )";
var_dump($sql2);
【讨论】:
我只想显示用户以表格格式选择的复选框的这些字段。我该如何显示这个 我写信给你,将 chechboxex 放在表单上并提交按钮,在获取复选框后,将其命名为 $_GET 或 $POST 并查看是否已检查(如果 isset 则检查,如果未检查,则检查 iiset 未检查) ,并且如果像我写的那样被检查到ON
。当您打印表格时,例如 if($row['uid'])!='' echo "<td>$row['uid']</td>";
如果您不会使用ajax,请添加到复选框onclick="f();return false;"
并在js 函数f()
中生成,这将使用ajax 提交数据而不刷新所有页面
大体思路是对的,但是这段代码有语法错误。此外,复选框示例没有 value="text"
属性,因此 $_GET['check1']
不会包含任何对 mysql 有用的内容。【参考方案2】:
当您想显示具有动态列的表时,如果您确切知道查询检索的列数,则可以使用if....else
循环。与您的问题类似,我创建了 2 个表。首先是 employee
eId、姓名、地址
第二个是job
jobId,eId,postName,Skill
检索数据的查询是:
$query="SELECT e.Name,e.Address,j.postName,j.Skill FROM employee AS e INNER JOIN job AS j ON e.eId=j.eId";
每一列都有一个复选框
<input type="checkbox" name="chkName"/>
<input type="checkbox" name="chkAddress"/>......for all columns.
GET
值将与相应的列进行比较。
使用checkbox
动态显示上述查询的列:
$checkArray=array();
if(isset($_GET['chkName']))
$checkArray[0]=1;
else
$checkArray[0]=0;
if(isset($_GET['chkAddress']))
$checkArray[1]=1;
else
$checkArray[1]=0;
if(isset($_GET['chkPost']))
$checkArray[2]=1;
else
$checkArray[2]=0;
if(isset($_GET['chkSkill']))
$checkArray[3]=1;
else
$checkArray[3]=0;
$query="SELECT e.Name,e.Address,j.postName,j.Skill FROM
employee AS e INNER JOIN job AS j ON e.eId=j.eId";
$result = $con->query($sql);
if ($result->num_rows>0)
?>
<table >
<tr>
<?php
if($checkArray[0]==1)
?>
<td> Name</td>
<?php
if($checkArray[1]==1)
?>
<td> Address</td>
<?php
if($checkArray[2]==1)
?>
<td> Post</td>
<?php
if($checkArray[3]==1)
?>
<td>Skioll</td>
<?php
?>
</tr>
<?php
while($row = $result->fetch_array())
echo "<tr>";
if($checkArray[0]==1)
echo "<td>". $row[0]. "</td>";
if($checkArray[1]==1)
echo "<td>". $row[1]. "</td>";
if($checkArray[2]==1)
echo "<td>". $row[2]. "</td>";
if($checkArray[3]==1)
echo "<td>". $row[3]. "</td>";
echo "</tr>";
【讨论】:
【参考方案3】:希望这会有所帮助。创建一个变量,例如:$condition
并像
$condition = "";
if($check1)
$condition = " AND Uid=$id";
if($check2)
$condition = " AND name=$name";
并在您的查询中附加此 $condition 变量。您将获得动态值。显示结果的简单方法是在选中的复选框上使用 AJAX。
【讨论】:
【参考方案4】:您可以在页面中按以下方式简单地使用复选框
mypage.html
<form>
<input class="form-check" type="checkbox" name="checkName"><label class="form-label">Name</label>
<input class="form-check" type="checkbox" name="checkMicroATM"><label class="form-label">MicroATM</label>
<!--and so on for each field-->
</form>
<div id="dataTable">
<!--Here your table will be displayed-->
</div>
myquerypage.php
if($_POST)
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
$result = $conn->query($sql);
$displayColCount=0; // maintain the count of columns to be displayed
$displayCol=array(); // contains the database column names to be displayed on the page
echo '<div id="dataTable">'; // very useful for replacing the content using ajax call if required
echo '<table>';
echo '<tr>';
if(isset($_POST['checkName']))
$displayCol[$displayColCount++]='name';
echo '<th>Name</th>';
if(isset($_POST['checkMicroATM']))
$displayCol[$displayColCount++]='m_atm';
echo '<th>MicroATM</th>';
.
.
// and so on for each column
echo '</tr>';
while($row = $result->fetch_array())
echo '<tr>';
$i=0;
while($i< $displayColCount)
echo "<td>". $row[displayCol[i++]]. "</td>";
echo '</tr>';
echo '</table>';
echo '</div>';
你可以使用ajax as调用上面的页面
$('.form-check').change(function (e)
var form=this.form;
var formData = $('form').serialize();
$.ajax(
type: 'POST',
url: 'myquerypage.php',
data: formData,
cache: false,
success: function (html)
$("#dataTable").html(html);
,
error: function (xhr, ajaxOptions, thrownError)
alert(xhr.status);
alert(thrownError);
);
);
希望对你有帮助。
【讨论】:
【参考方案5】:我想我明白你的意思。以下代码可以在同一个文件中使用,但出于显而易见的原因,最好将它们分开。
我做了什么,我有一个基于你在数据库中的字段的复选框列表。
发布这些字段并运行查询以获取仅发布的这些字段的数据。
在我生成有关已发布字段和数据的 html 代码/表之后
<?php
$result = [];
$fields = [];
$dbFields = [];
$sql = "";
$fieldsNameMapping = [
'e.uid' => 'Uid',
'd.block' => 'Blocked',
'd.m_atm' => 'Atm',
'd.uid_name' => 'Name'
];
if (isset($_POST))
// build query based on the posted fields
if (isset($_POST['fields']) && !empty($_POST['fields']))
$sql = "SELECT ";
foreach ($_POST['fields'] as $fieldValue)
$sql .= $fieldValue . ", ";
// get field names
$fields[] = $fieldsNameMapping[$fieldValue];
// mapping db field names, remove first two characters
$dbFields[] = substr($fieldValue, 2);
// remove last comma
$sql = substr($sql, 0, -2);
$sql .= " FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
// get result
$result = $conn->query($sql);
?>
<form method="post">
<input type="checkbox" name="fields[]" value="e.uid" /> Uid<br />
<input type="checkbox" name="fields[]" value="d.block" /> Blocked<br />
<input type="checkbox" name="fields[]" value="d.m_atm" /> Atm<br />
<input type="checkbox" name="fields[]" value="d.uid_name" /> Name<br />
<input type="submit" value="Show Result" />
</form>
<?php if (!empty($fields)) ?>
<table>
<thead>
<tr>
<?php foreach($fields as $fieldName) ?>
<th><?php echo $fieldName ?></th>
<?php ?>
</tr>
</thead>
<?php if (!empty($result) && $result->num_rows > 0) ?>
<tbody>
<?php while($row = $result->fetch_array()) ?>
<tr>
<?php foreach($dbFields as $fieldDbName) ?>
<td><?php echo $row[$fieldDbName] ?></td>
<?php ?>
</tr>
<?php ?>
</tbody>
<?php ?>
</table>
<?php ?>
【讨论】:
以上是关于使用复选框从 MySQL 中的多个表中选择数据,并根据复选框显示表字段的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用连接/子查询从多个表中选择数据? (PHP-MySQL)
如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零
如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?