【问题标题】:How to do multi-part PHP query of mysql db如何对mysql db进行多部分PHP查询
【发布时间】:2016-10-02 22:12:43
【问题描述】:

我已经阅读了这里和其他网站上的数百篇文章。我对 PHP 和 mysql 并不太熟悉,但我已经在 mysql 中构建了我的表,使用单个清单调用它们并根据日期和时间过滤它们。但是,在多复选框领域,我似乎无法确定我在数组代码和自定义结果表中做错了什么。这是基本的html:

<html> <body> <form method="POST" action="php/minute_feedback.php">
Date: <input type="text" name="from_date" id="from_date" value="2016-04-07">
<input type="checkbox" name="check_list[]" value="gate" id="gate">
<input type="checkbox" name="check_list[]" value="pressure" id="pressure">
<input type="checkbox" name="check_list[]" value="flow" id="flow">
<input type="submit" name="submit" value="submit">

这是基本的 PHP(我将只包含日期参数与日期和时间以使其更短,因为包含的内容是相同的):

<?php
$servername = "myhostaddress.com";
$username = "myusername";
$password = "mypassword";
$dbname = "mydatabasename";
$conn=new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);}
if($_POST['submit'] == "submit") {
$from_date = ($_POST['from_date']);
$to_date = ($_POST['from_date']);}
if(isset($_POST['submit'])) {

现在...我知道这里应该有某种数组代码,例如:

$checklist[] = $_POST[check_list];

但是 - 我不确定正确的语法/代码是什么。 下一个问题是关于我的查询。我见过大多数使用 WHERE + IN 组合和 '*' 进行 SELECT 的查询。但是,我需要更接近:

$sql = "SELECT Fdate, Ftime, (list of variable columns from the checked options such as 'gate', 'pressure', 'flow' --> but only if they've been checked) FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date'";

$result = $conn->query($sql);}
if ($result->num_rows > 0) {

现在 - 至于我的表头,如果我要查找单个值,我可以使用以下代码:

echo "<table><tr><th>Date</th><th>Time</th><th>Level (ft)</th></tr>";}

但是,我需要用检查项目的结果(1、2 或 3 个或更多变量,根据需要)加上日期和时间记录来动态填充标题。

echo "<table>";}
else {
echo "0 results";}
$conn->close();
?>

我的最终结果是用户可以输入日期和时间范围并选择要显示的数据,例如,如果他们只想知道 2016 年 4 月 7 日的闸门设置和压力,他们会输入该日期并选中这两个框,以便他们获得一个表格(下面没有格式 - 只是试图表示),例如:

Date       |     Time |   Gate Setting  |  Pressure 
----------------------------------------------------
2016-04-07 |    11:00 |      21         |      50 

我最终将拥有一张包含数万行数据可供选择的表格(并将包括对可提取数据量的限制),以及最多 56 列可供选择的变量。我没有使用任何特殊/花哨的数学函数来对时间段等进行分组 - 我已经手动将其全部分离并上传了,因此可以使用了。我从互联网上尝试了很多不同的解决方案,但最终都失败了。 SELECT 的 * 选项看起来不像我,IN 选项也不是 - 但我不确定(只是推测因为两者都没有工作)。我在一个 netfirms mysql 平台上,所以它已经更新了(我会将所有内容都更改为 mysqli 以避免因不使用它而引起的任何问题 - 所以任何提前反馈都会很棒!!。我很感激任何想法你有!

【问题讨论】:

    标签: php mysql checkbox html-table display


    【解决方案1】:

    感谢 Deep 的上述解决方案 - 它按原样完美运行!惊人的。至于表格数组的使用,我很挣扎,因为我可以填充表格,但是得到了重复的日期和时间(如我上面的回复中所述)。但是 - 我只是稍微移动了脚本,它就可以工作了。现在,用户将获取包含日期、时间的列,然后是他们正在寻找的其他变量,并排在页面上,作为比较值(注意 - 我还没有达到 mysqli 或 pdo 的目的,所以如果这是旧的,请根据需要进行更新)。希望这会有所帮助 - 再次感谢!所以 - 从上面 Deep 的帖子中的 sql 行(完全填写),这是表格 -->

    $sql = "SELECT Fdate, {$wantedFields} Ftime FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date' AND Ftime BETWEEN '$from_time' AND '$to_time'";
    
    $result = $conn->query($sql);
    }
    if ($result->num_rows > 0) {
    //header fields
    echo "<table><tr><th>Date</th><th>Time</th>";       
            foreach($tableDynFields as $c) {
            echo "<th>$c</th>";
        }
        echo "</tr>";
    //results
    while ($row = $result->fetch_assoc()) {                         
                echo "<tr><td>".$row["Fdate"]."</td><td>".$row["Ftime"]."  </td>";
            foreach($tableDynFields as $c) {
                echo "<td>".$row[$c]."</td>";
            }
            echo "</tr>";
        }
        echo "</table>"; 
    //result set free
      $result->free(); 
        } else {
            echo "query failed.<hr/>";
        }
    $conn->close();
    ?>
    

    我唯一要补充的是,如果您必须像我一样对尽可能多的数据进行过滤和排序 - 最好在 select 语句的末尾放置一个强制限制器,或者类似的东西!

    【讨论】:

      【解决方案2】:
      $checklist     = $_POST['check_list'];
      $allowedFields = [
          'gate'     => 'Gate',
          'pressure' => 'Pressure',
          'flow'     => 'Flow',
          'etc'      => 'Other field title'
      ];
      $wantedFields   = [];
      $tableDynFields = [];
      foreach ($checklist as $field) {
          if (array_key_exists($field, $allowedFields)) {
              $wantedFields[]   = $field;
              $tableDynFields[] = $allowedFields[$field];
          }
      }
      if ($wantedFields) {
          $wantedFields = join(',', $wantedFields) . ',';
      } else {
          $wantedFields = '';
      }
      $sql = "SELECT Ftime, {$wantedFields} Fdate FROM ...';
      // and here you have $tableDynFields array for table generation
      

      【讨论】:

      • 这太棒了。你太棒了!它完全按照我的需要工作。不过,我仍在尝试了解 $tableDynFields 数组。如果我如上所述手动构建表 - 没问题,动态地,这就是我尝试过的: //after results >0: while($row = $result->fetch_assoc()) { //next: echo " "implode(' '.array_keys(current($tableDynFields)));" "; //next: foreach ($tableDynFields as $row): array_map('htmlentities', $row); //下一步: echo " "implode(' ', $row);" "; //下一个:endforeach; } echo "";} else{ echo "0 results"'} //错误
      • 我有一个部分解决方案,但需要清理它(从 $result->num_rows 行开始): echo ""; foreach($tableDynFields as $c) { echo ""; } 回声“”; while ($row = $result->fetch_assoc()) { echo ""; foreach($tableDynFields as $c) {echo"";} echo "";} echo "
        Date Time $c>
        ".$row["Fdate"]." ".$row["Ftime"]." ".$row[$c]."
        "; $result->free();} else { echo "查询失败。
        ";}$conn->close(); //所以 - 表格回来填满,但它给了我每个检查变量的日期和时间。我只需要一次?想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多