从 sql 数据库中检索数据并在表格中显示 - 根据选中的复选框显示某些数据
Posted
技术标签:
【中文标题】从 sql 数据库中检索数据并在表格中显示 - 根据选中的复选框显示某些数据【英文标题】:Retrieve data from sql database and display in tables - Display certain data according to checkboxes checked 【发布时间】:2014-05-20 07:24:27 【问题描述】:我创建了一个 sql 数据库(使用 phpmyadmin),其中填充了我想在两个日期之间调用数据的测量值(用户通过在 html 表单中输入“FROM”和“TO”日期来选择 DATE)并显示放在一张桌子上。
此外,我在我的 html 表单下放置了一些复选框,通过选中它们可以限制显示的数据量。
每个复选框代表我的数据库的一列;因此,除了日期和小时列之外,还会显示任何选中的内容(如果没有选中,则显示所有内容)。
到目前为止,我设法编写了一个连接到数据库的 php 脚本,当我没有选中任何复选框时显示所有内容,并且还设法整理了我的一个复选框。
问题:我调用的数据显示了两次。
问题:我想要四个复选框。
我需要为每个可能的组合编写一个 sql 查询还是有更简单的方法?
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_Database_Test = "localhost";
$database_Database_Test = "database_test";
$table_name = "solar_irradiance";
$username_Database_Test = "root";
$password_Database_Test = "";
$Database_Test = mysql_pconnect($hostname_Database_Test, $username_Database_Test, $password_Database_Test) or trigger_error(mysql_error(),E_USER_ERROR);
//HTML forms -> variables
$fromdate = $_POST['fyear'];
$todate = $_POST['toyear'];
//DNI CHECKBOX + ALL
$dna="SELECT DATE, Local_Time_Decimal, DNI FROM $database_Database_Test.$table_name where DATE>=\"$fromdate\" AND DATE<=\"$todate\"";
$tmp ="SELECT * FROM $database_Database_Test.$table_name where DATE>=\"$fromdate\" AND DATE<=\"$todate\"";
$entry=$_POST['dni'];
if (empty($entry))
$result = mysql_query($tmp);
echo
"<table border='1' style='width:300px'>
<tr>
<th>DATE</th>
<th>Local_Time_Decimal</th>
<th>Solar_time_decimal</th>
<th>GHI</th>
<th>DiffuseHI</th>
<th>zenith_angle</th>
<th>DNI</th>
";
while( $row = mysql_fetch_assoc($result))
echo "<tr>";
echo "<td>" . $row['DATE'] . "</td>";
echo "<td>" . $row['Local_Time_Decimal'] . "</td>";
echo "<td>" . $row['Solar_Time_Decimal'] . "</td>";
echo "<td>" . $row['GHI'] . "</td>";
echo "<td>" . $row['DiffuseHI'] . "</td>";
echo "<td>" . $row['Zenith_Angle'] . "</td>";
echo "<td>" . $row['DNI'] . "</td>";
echo "</tr>";
echo '</table>';
else
$result= mysql_query($dna);
echo
"<table border='1' style='width:300px'>
<tr>
<th>DATE</th>
<th>Local_Time_Decimal</th>
<th>DNI</th>
";
while($row = mysql_fetch_assoc($result))
echo "<tr>";
echo "<td>" . $row['DATE'] . "</td>";
echo "<td>" . $row['Local_Time_Decimal']."</td>";
echo "<td>" . $row['DNI'] . "</td>";
echo "</tr>";
echo '</table>';
if($result)
echo "Successful";
else
echo "Enter correct dates";
?>
<?php
mysql_close();
?>
【问题讨论】:
我认为你必须使用 javascript 来返回检查的 chkboxes - 我会追求 jQuery 的.is()
方法 - api.jquery.com/is。你可以做类似$("#checkbox").is( ":selected" )
【参考方案1】:
尝试创建您的复选框,如下所示:
Solar_Time_Decimal<checkbox name='columns[]' value='1'>
GHI<checkbox name='columns[]' value='2'>
DiffuseHI<checkbox name='columns[]' value='3'>
Zenith_Angle<checkbox name='columns[]' value='4'>
DNI<checkbox name='columns[]' value='5'>
并尝试将您的 PHP 代码挂在此:
<?php
//HTML forms -> variables
$fromdate = isset($_POST['fyear']) ? $_POST['fyear'] : data("d/m/Y");
$todate = isset($_POST['toyear']) ? $_POST['toyear'] : data("d/m/Y");
$all = false;
$column_names = array('1' => 'Solar_Time_Decimal', '2'=>'GHI', '3'=>'DiffuseHI', '4'=>'Zenith_Angle','5'=>'DNI');
$column_entries = isset($_POST['columns']) ? $_POST['columns'] : array();
$sql_columns = array();
foreach($column_entries as $i)
if(array_key_exists($i, $column_names))
$sql_columns[] = $column_names[$i];
if (empty($sql_columns))
$all = true;
$sql_columns[] = "*";
else
$sql_columns[] = "DATE,Local_Time_Decimal";
//DNI CHECKBOX + ALL
$tmp ="SELECT ".implode(",", $sql_columns)." FROM $database_Database_Test.$table_name where DATE>=\"$fromdate\" AND DATE<=\"$todate\"";
$result = mysql_query($tmp);
echo "<table border='1' style='width:300px'>
<tr>
<th>DATE</th>
<th>Local_Time_Decimal</th>";
foreach($column_names as $k => $v)
if($all || (is_array($column_entries) && in_array($k, $column_entries)))
echo "<th>$v</th>";
echo "</tr>";
while( $row = mysql_fetch_assoc($result))
echo "<tr>";
echo "<td>" . $row['DATE'] . "</td>";
echo "<td>" . $row['Local_Time_Decimal'] . "</td>";
foreach($column_names as $k => $v)
if($all || (is_array($column_entries) && in_array($k, $column_entries)))
echo "<th>".$row[$v]."</th>";
echo "</tr>";
echo '</table>';
if($result)
echo "Successful";
else
echo "Enter correct dates";
?>
<?php
mysql_close();?>
此解决方案考虑您的特定表列,但如果您希望使用通用解决方案,您也可以尝试使用此 SQL:
$sql_names = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$database_Database_Test' AND TABLE_NAME = '$table_name'";
并使用结果构造$column_names
数组。
【讨论】:
抱歉语法错误!语法现已修复。 我在第 19 行修复了警告:为 foreach() 提供的参数无效。您必须在此处添加 if (is_array(... 行。正确的代码:if (is_array($columns_entries)) foreach ($columns_entries as $i) if(array_key_exists($i, $column_names)) $sql_columns[] = $column_names[$i]; 对不起@Lef_Chef。现在我以不好的验证顺序离开了条件。我现在更改并添加is_array
验证,就像您观察到的那样。现在对于根本没有条目数组并且您有$all = true
的情况,in_array
条件将不再被验证。
再次感谢您的直接回复。但是即使情况好转,复选框仍然不起作用。我收到这些通知:A)通知:未定义变量:第 41 行上的所有 B)通知:未定义的变量:第 41 行上的 column_entries,C)通知:未定义的变量:第 52 行上的所有 D)通知:未定义的变量:第 52 行上的 column_entries我得到了 4 次 A 和 B。我得到了无数次(=正确显示的值)C 和 D 通知。
如果我不选中任何复选框,则会显示所有复选框(如我所愿),但也会显示通知和警告:注意:未定义索引:第 17 行上的列警告:提供的参数无效对于第 19 行的 foreach()【参考方案2】:
您的问题的解决方案:将 mysql_fetch_assoc 更改为 mysql_fetch_array 如果您有同样的问题,请尝试使用 print_r 打印您的结果
答案:使用 mysql 中的 bit 数据类型来存储和读取您的复选框。 当您从数据库接收到 thr 值时,您可以使用
在检查的参数中,您可以使用现有的 php 代码:
$value = ...get the value from db ( 1 or 0 )
echo '<input type="checkbox" name="thename" value="thevalue" '.($value==1?'checked=checked'.'').'/>';
【讨论】:
以上是关于从 sql 数据库中检索数据并在表格中显示 - 根据选中的复选框显示某些数据的主要内容,如果未能解决你的问题,请参考以下文章
从 SQL Server 2008 R2 检索多语言数据(中文、日文...)并在 Java webapp 中显示