这看起来很简单,但就我的一生而言,我无法理解。基本上,我有以下HTML下拉列表:
<html>
<head>
</head>
<center>
<form method="post" action="myfile.php">
<table>
Select a table to display:
<select name = "list" size = "1">
<option value = "t1">TABLE 1</option>
<option value = "t2">TABLE 2</option>
<option value = "t3">TABLE 3</option>
<option value = "t4">TABLE 4</option>
<option value = "t5">TABLE 5</option>
</select>
<tr><colspan = "2">
<!- <p align = "center" ->
<input type="submit" value="Display Selected Table">
</td>
</tr>
</table>
</form>
</center>
</html>
我想做的是让用户从下拉列表中列出的5个表中选择一个,然后单击"显示"。这样做后,系统将显示连接的MySQL数据库中相应表的完整数据。
我的PHP文件实际上是一个骨架,但这就是我目前所拥有的:
<?php // myfile.php
require_once 'login.php';
$conn = new mysqli($hostname, $username, $password, $database);
if ($conn->connect_error) die("Could not connect to database.");
// missing logic here
?>
我知道应该采用SELECT * FROM TABLE
查询,其中TABLE
是用户从下拉列表中选择的任何内容。我只是不确定如何在我的PHP中做到这一点。我已经尝试了很多次,但考虑到我刚刚开始学习PHP,我的尝试都没有意义。
澄清:
我最初想以表格的形式显示数据,但我的问题中没有包括这一点,因为我已经知道如何做到这一点了。问题是从下拉列表中读取用户输入,我现在明白了。
缺少的逻辑是,您的PHP脚本需要获得一种访问用户输入的方法(关于已选择的表)。实际上,您可以将HTML和PHP保持在同一页面上,但仅在检测到用户输入时执行查询(即,在<form>
元素上使用GET
方法,然后侦听$_GET[]
对象)。
一些实施注意事项:
- 即使在使用MySQLi或PDO时,准备好的语句也只能用于查询中的
VALUES
参数。无法将变量注入为FROM [tableName]
参数准备的语句中 - 与上述要点相关,您必须手动创建并维护所选数据库中的表白名单。对照这个已知的白名单,交叉检查(所选兴趣表的)用户输入。如果交叉检查失败,请不要执行查询
所有这些代码实际上都可以转到同一个文件,比如search.php
,只需将表单操作重定向回其自身即可。但是,如果没有关于数据库结构的进一步信息,我无法建议您如何显示数据。
<html>
<head>
</head>
<form method="get" action="search.php">
<table>
Select a table to display:
<select name = "list" size = "1">
<option value = "t1">TABLE 1</option>
<option value = "t2">TABLE 2</option>
<option value = "t3">TABLE 3</option>
<option value = "t4">TABLE 4</option>
<option value = "t5">TABLE 5</option>
</select>
<tr><colspan = "2">
<input type="submit" value="Display Selected Table">
</td>
</tr>
</table>
</form>
<?php
if(isset($_GET['list']) && !empty($_GET['list']) {
require_once('login.php');
$conn = new mysqli($hostname, $username, $password, $database);
if ($conn->connect_error) die("Could not connect to database.");
// Perform DB query using value of $_GET['list']
// Have a manual white list of TABLES you want to accept
$table = $_GET['list'];
$tables = ['t1','t2','t3','t4','t5'];
if(in_array($table, $tables)) {
// Perform query
if(!$result = $conn->query('SELECT * FROM '.$table.' WHERE 1=1')) {
die('Unable to perform query.');
} else {
// Loop through returned rows
while($row = $result->fetch_assoc()) {
// Do stuff here
}
// Free memory
$result->free();
}
}
// Close connection
$conn->close();
}
?>
</html>
p/s:您真的应该学习如何使用CSS——样式HTML标记(如<center>
)早就被弃用了。