【问题标题】:Select data from multiple tables in MySQL using check boxes and show the table field according to checkbox使用复选框从 MySQL 中的多个表中选择数据,并根据复选框显示表字段
【发布时间】: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,而是更改视图。

标签: php mysql checkbox radio-button


【解决方案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 元素使用 &lt;input name=text[]&gt; 并执行此操作

 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 "&lt;td&gt;$row['uid']&lt;/td&gt;";
  • 如果您不会使用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" />&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 } ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-26
          相关资源
          最近更新 更多