繁体   English   中英

使用复选框从MySQL的多个表中选择数据,并根据复选框显示表字段

[英]Select data from multiple tables in MySQL using check boxes and show the table field according to checkbox

我的用户数据库中有两个表。

第一个表包含用户唯一ID,姓名,联系电话和其他个人信息。

第二个表包含第一个表中用户的唯一ID和设备信息,例如用户的第一台机器编号,第二台机器编号以及许多其他信息。

我的2号桌结构是..

表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" />&nbsp;Uid<br />
     <input type="checkbox" name="fields[]" value="d.block" />&nbsp;Blocked<br />
     <input type="checkbox" name="fields[]" value="d.m_atm" />&nbsp;Atm<br />
     <input type="checkbox" name="fields[]" value="d.uid_name" />&nbsp;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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM