如何 multi-part PHP 查询 mysql 数据库
How to do multi-part PHP query of mysql db
我已经阅读了这里和其他网站上的数百篇帖子。我不太熟悉 PHP 和 mysql,但我的 table 已经内置在 mysql 中,使用单个清单调用它们并根据日期和时间过滤它们.但是,在 multi-checkbox 领域,我似乎无法确定我在数组代码中做错了什么并自定义生成的 table。这是基本的 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];
但是 - 我不确定正确的 syntax/code 是什么。
下一个问题是关于我的查询。我见过大多数查询使用 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) {
现在 - 至于我的 table headers,如果我要查找单个值,我可以使用以下代码:
echo "<table><tr><th>Date</th><th>Time</th><th>Level (ft)</th></tr>";}
但是,我需要 header 动态填充检查项目的结果(根据需要 1、2 或 3 个或更多变量)以及日期和时间记录。
echo "<table>";}
else {
echo "0 results";}
$conn->close();
?>
我的最终结果是用户可以输入日期和时间范围并选择要显示的数据,例如,如果他们只想知道 2016 年 4 月 7 日的门设置和压力,他们' d 输入那个日期并勾选这两个框,这样他们就会得到一个 table(下面没有格式 - 只是试图表示),例如:
Date | Time | Gate Setting | Pressure
----------------------------------------------------
2016-04-07 | 11:00 | 21 | 50
我最终会得到一个 table,其中有数万行数据到 select(并且将包括对可以提取的数据量的限制),最多 56来自 select 的变量列。我没有使用任何 special/fancy 数学函数来对时间段等进行分组 - 我已经手动将其全部分离并上传,因此它已准备就绪。我尝试了很多来自互联网的不同解决方案,但最终都失败了。 SELECT 的 * 选项似乎不像我所想的那样,IN 选项也不像 - 但我不确定(只是推测,因为两者都不起作用)。我在一个 netfirms mysql 平台上,所以它已经很更新了(我会把所有东西都改成 mysqli 以避免因不使用它而产生的任何问题——所以任何提前反馈都会太棒了!!我很欣赏你的任何想法!
$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
感谢上面的 Deep 解决方案 - 它按原样完美运行!惊人的。至于 table 数组的使用,我很费力,因为我可以填充 table,但得到了日期和时间的副本(如我上面的回复中所述)。但是-我只是将脚本稍微移动了一下就可以了。现在,用户将返回包含日期、时间的列,然后是他们正在寻找的其他变量,并排在页面上,作为比较值(注意 - 我还没有达到我的 sqli 或 pdo,所以如果这是旧的,请根据需要更新)。希望这会有所帮助 - 再次感谢!所以 - 从上面 Deep 的 post 的 sql 行(完全填写),这是 table -->
$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 语句的末尾放置一个强制限制器,或者类似的东西!
我已经阅读了这里和其他网站上的数百篇帖子。我不太熟悉 PHP 和 mysql,但我的 table 已经内置在 mysql 中,使用单个清单调用它们并根据日期和时间过滤它们.但是,在 multi-checkbox 领域,我似乎无法确定我在数组代码中做错了什么并自定义生成的 table。这是基本的 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];
但是 - 我不确定正确的 syntax/code 是什么。 下一个问题是关于我的查询。我见过大多数查询使用 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) {
现在 - 至于我的 table headers,如果我要查找单个值,我可以使用以下代码:
echo "<table><tr><th>Date</th><th>Time</th><th>Level (ft)</th></tr>";}
但是,我需要 header 动态填充检查项目的结果(根据需要 1、2 或 3 个或更多变量)以及日期和时间记录。
echo "<table>";}
else {
echo "0 results";}
$conn->close();
?>
我的最终结果是用户可以输入日期和时间范围并选择要显示的数据,例如,如果他们只想知道 2016 年 4 月 7 日的门设置和压力,他们' d 输入那个日期并勾选这两个框,这样他们就会得到一个 table(下面没有格式 - 只是试图表示),例如:
Date | Time | Gate Setting | Pressure
----------------------------------------------------
2016-04-07 | 11:00 | 21 | 50
我最终会得到一个 table,其中有数万行数据到 select(并且将包括对可以提取的数据量的限制),最多 56来自 select 的变量列。我没有使用任何 special/fancy 数学函数来对时间段等进行分组 - 我已经手动将其全部分离并上传,因此它已准备就绪。我尝试了很多来自互联网的不同解决方案,但最终都失败了。 SELECT 的 * 选项似乎不像我所想的那样,IN 选项也不像 - 但我不确定(只是推测,因为两者都不起作用)。我在一个 netfirms mysql 平台上,所以它已经很更新了(我会把所有东西都改成 mysqli 以避免因不使用它而产生的任何问题——所以任何提前反馈都会太棒了!!我很欣赏你的任何想法!
$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
感谢上面的 Deep 解决方案 - 它按原样完美运行!惊人的。至于 table 数组的使用,我很费力,因为我可以填充 table,但得到了日期和时间的副本(如我上面的回复中所述)。但是-我只是将脚本稍微移动了一下就可以了。现在,用户将返回包含日期、时间的列,然后是他们正在寻找的其他变量,并排在页面上,作为比较值(注意 - 我还没有达到我的 sqli 或 pdo,所以如果这是旧的,请根据需要更新)。希望这会有所帮助 - 再次感谢!所以 - 从上面 Deep 的 post 的 sql 行(完全填写),这是 table -->
$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 语句的末尾放置一个强制限制器,或者类似的东西!