使用复选框显示php中的sql表数据


Using checkboxes to display sql table data with php

我有五个复选框,它们与表中的列名有关。目前,每个复选框都有自己的"名称"。我想做的是允许选中多个框,然后根据选中的框来显示一个带有所选框的表。

目前发生的情况是,如果我选择了所有的框,表就会正确显示。如果我只选择了几个框,我会得到未定义的变量错误,因为我的代码编写方式。我如何写我的代码,以便根据选中的复选框,该表的数据会显示?

注意:使用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");