[英]Select data from multiple tables in MySQL using check boxes and show the table field according to checkbox
我的用户数据库中有两个表。
第一个表包含用户唯一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)一样。 它仅显示两个表中三列的详细信息,并相应地显示这些表的表视图。
如果我不了解您,则需要在ON d.uid=e.uid"
添加类似以下内容: ON d.uid=e.uid" AND Uid=$id AND name=$name And m_atm=$atm
,或者把它添加到(到where
我thinght不好)
例如
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);
当您想显示带有动态列的表时,如果您确切知道查询检索的列数,则可以使用if....else
循环。 与您的问题类似,我创建了2个表。第一个是employee
eId,名称,地址
其次是job
jobId,eId,postName,技能
用于检索数据的查询是:
$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>";
}
希望这会有所帮助。 创建一个变量,例如: $condition
并赋值,例如
$condition = "";
if($check1) {
$condition = " AND Uid=$id";
}
if($check2) {
$condition = " AND name=$name";
}
并将此$ condition变量附加到查询中。 您将获得动态值。 为了显示结果,简单的方法是在选中的复选框上使用AJAX。
您可以按以下方式在页面中简单地使用复选框
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作为调用上面的页面
$('.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);
}
});
});
我希望这可以帮助你。
我想我明白你的意思。 以下代码可以在同一文件中使用,但出于明显的原因,最好将它们分开。
我所做的事情,我有一个基于您在数据库中获得的字段的复选框列表。
发布这些字段并运行查询以仅获取发布的这些字段的数据。
在生成有关已发布字段和数据的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 } ?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.