我有五个复选框,它们与表中的列名有关。目前,每个复选框都有自己的"名称"。我想做的是允许选中多个框,然后根据选中的框来显示一个带有所选框的表。
目前发生的情况是,如果我选择了所有的框,表就会正确显示。如果我只选择了几个框,我会得到未定义的变量错误,因为我的代码编写方式。我如何写我的代码,以便根据选中的复选框,该表的数据会显示?
注意:使用PDO方法
html
<form name='checkboxform' method='post' action='phpfiles/checkBox.php'>
<input type='checkbox' name='teamname' value='teamname'>teamname<br>
<input type='checkbox' name='city' value='city'>city<br>
<input type='checkbox' name='bestplayer' value='bestplayer'>bestplayer<br>
<input type='checkbox' name='yearformed' value='yearformed'>yearformed<br>
<input type='checkbox' name='website' value='website'>website<br>
<br>
<input type='submit' value='Submit Data'>
</form>
php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST"){
// server and database information
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";
if (isset($_POST['teamname'])) {
$teamname = $_POST['teamname'];
}
if (isset($_POST['city'])) {
$city = $_POST['city'];
}
if (isset($_POST['bestplayer'])) {
$best = $_POST['bestplayer'];
}
if (isset($_POST['yearformed'])) {
$year = $_POST['yearformed'];
}
if (isset($_POST['website'])) {
$website = $_POST['website'];
}
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>$teamname</th><th>$city</th><th>$best</th><th>$year</th><th>$website</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "'n";
}
}
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT $teamname, $city, $best, $year, $website FROM teams");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
}
?>
我知道我的代码是这样的,如果所有的框都没有选中,我会得到错误,但我不确定如何完成这项任务。我对此很茫然。
不要直接接受SQL语句中的输入,也不要避免所有不必要的isset()
语句,而是为name
参数提供一个数组结构,以便轻松地在它们上循环。
修改HTML标记如下:
name=team[teamname]
name=team[city]
等等。
现在,我们只对变量进行循环。但是,在这样做之前,让我们创建一个列名称的白名单数组,这样我们就不会被SQL注入完全破坏。
$allowed_columns = array(
'teamname',
'city',
'bestplayer',
'yearformed',
'website'
);
接下来,让我们循环并检查白名单中的字段,如果它存在,我们将使用它,否则我们将继续前进。
$user_selected_fields = array();
if(isset($_POST['team'])){
foreach($_POST['team'] as $column => $checkbox_value){
if(in_array($column, $allowed_columns){
$user_selected_fields[] = $column;
}
}
}
现在我们的数据是安全的,我们只允许预先确定的列可用,所以不可能注入SQL。现在我们可以在"上内爆数组,这样我们就有了一个用户想要看到的列名的适当列表。
$this->conn->prepare("select " . implode(', ', $user_selected_fields) ." from teams");