如何使用 PHP 将不同的用户选择的 SQL 表显示为 html 表?

Posted

技术标签:

【中文标题】如何使用 PHP 将不同的用户选择的 SQL 表显示为 html 表?【英文标题】:How do I get different user selected SQL tables displayed as an html table using PHP? 【发布时间】:2016-01-28 23:38:03 【问题描述】:

我正在创建一个页面,提示输入服务器登录信息,并在提交正确信息后重定向。进入下一页后,会出现一个选择表单,其中包含不同的表名,代表数据库内的表。一旦选择了一个,并单击“选择表”,它将使用 php 将数据库中的整个表显示为 html 中的表。我不确定如何计算 sql 表中的列数,以便能够使用循环和 html 表标签来显示它。

<?
session_start();
if(!isset($_SESSION['session']))

    $_SESSION['session'] = 0;

if(isset($_POST['host']))

    $_SESSION['host'] = $_POST['host'];
    $_SESSION['dbname'] = $_POST['dbname'];
    $_SESSION['username'] = $_POST['username'];
    $_SESSION['pw'] = $_POST['pw'];


?>
<!DOCTYPE html>
<html>

<body>
    <?          
    if(isset($_POST['logout']))
    
        $_SESSION['session'] = 0;
    

    if(isset($_POST['submit']))
    
        try
        
            $db = new PDO("mysql:host=".$_POST['host'].";dbname=".$_POST['dbname'], $_POST['username'], $_POST['pw']);
        
        catch(Exception $error)
        
            die("Connection to user database failed: " . $error->getMessage());
        

        try
        
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);
            $query = "SHOW TABLES";
            $results = $db->query($query)->fetchall();
            $_SESSION['session']=1;
        
        catch(Exception $error)
        
            echo "Problem with ~query, go back to home screen";
            $_SESSION['session']=0;
        
           

    if($_SESSION['session'] == 0)
    ?>
    <form action="<?$_SERVER['PHP_SELF']?>" method="post" name='initialentry'>
        <table border='0' style='text-align: center'>
            <tr>
                <td style='text-align: right;'>Enter host name:</td>
                <td style='text-align: left;'>
                    <input type='text' name='host' value='localhost'>
                </td>
            </tr>
            <tr>
                <td style='text-align: right;'>Enter database name:</td>
                <td style='text-align: left;'>
                    <input type='text' name='dbname' value='zxyx999'>
                </td>
            </tr>
            <tr>
                <td style='text-align: right;'>Enter user name:</td>
                <td style='text-align: left;'>
                    <input type='text' name='username' value='zxyx999'>
                </td>
            </tr>
            <tr>
                <td style='text-align: right;'>Enter password:</td>
                <td style='text-align: left;'>
                    <input type='password' name='pw' width='15' value='12345'>
                </td>
            </tr>
            <tr>
                <td style='text-align: right;'>
                    <input type="reset" value="Reset">
                </td>
                <td style='text-align: left;'>
                    <input name='submit' type="submit" value="Submit">
                </td>
            </tr>
        </table>
    </form>
    <?

    if($_SESSION['session']==1)
    
        ?><form action='<?$_SERVER['PHP_SELF']?>' method='post' name='tableList'>
        <select name='selected'><?
            foreach($results as $row)
            
                echo "<option value=".$row[0].">" . $row[0] . "</option>";
            ?>
        </select>
        <input type="submit" name="selectTable" value="Select Table">
        <input type="submit" name="logout" value="logout">
        </form><?
    

    if(isset($_POST['selectTable']))
    
        try
        
            $db = new PDO("mysql:host=".$_SESSION['host'].";dbname=".$_SESSION['dbname'], $_SESSION['username'], $_SESSION['pw']);
        
        catch(Exception $error)
        
            die("Connection to user database failed: " . $error->getMessage());
        

        try
        
            $statement = $db->prepare("SELECT * FROM ".$_POST['selected']);
            $statement->execute();
        
        catch(Exception $error)
        
            echo "Problem with ~query";
        

        echo "</br>";
        echo "<table border= '1'>";

        while($row = $statement->fetch())
        
            echo $row['book_id'] . $row['title'];
        

        echo "</table>";
    

    ?>
</body>
</html>

【问题讨论】:

可能重复:***.com/questions/658395/… 【参考方案1】:

您可以在调用 execute() 后使用 PDOStatement 对象的columncount 属性来确定结果集中的列数。

更新:让我们看看一些代码

...
$c=$statement->columnCount()-1; //column indexes in resultset are 0 based
while($row = $statement->fetch())
    
        echo '<tr>'; //start row
        for($i=0; $i<=$c; $i++)
            
                echo '<td>'.$row[$i] . '</td>'; //print cell
            
        echo '</tr>'; //close the row
    
...

【讨论】:

老实说,到目前为止,您的回答是最明智的。请提供一些带有解释的示例,我会投票赞成。 谢谢,这正是我要找的。现在我唯一要做的就是从数据库中获取要显示的列名。这是我必须创建表格的 html 表格的代码,缺少的只是列标题名称:> echo "&lt;/br&gt;"; &gt; echo "&lt;table border= '1'&gt;"; &gt; while($row = $statement-&gt;fetch()) echo "&lt;tr&gt;"; for($i=0; $i &lt; $statement-&gt;columnCount(); $i++) &gt; echo "&lt;td&gt;" . $row[$i] . "&lt;/td&gt;"; echo "&lt;/tr&gt;"; fetch() 将在 PDO 的默认设置下检索列名。【参考方案2】:

要选择表的列数,您可以使用此查询。

SELECT COUNT(*) AS total_columns
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'selected_table' AND table_schema = 'your_database';

您可以找到有关 INFORMATION_SCHEMA here 的更多信息。

【讨论】:

格式是否正确? $columns= $db-&gt;prepare("SELECT COUNT(*) AS total_columns FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name =" . $_POST['selected'] . " AND table_schema =" . $_SESSION['host']); $columns-&gt;execute(); echo var_dump($columns); 因为我运行它时得到这个输出:object(PDOStatement)#3 (1) ["queryString"]=&gt; string(115) "SELECT COUNT(*) AS total_columns FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name =book AND table_schema =localhost" 不,试试这个:$columns= $db->prepare("SELECT COUNT(*) AS total_columns FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".$_POST['selected']."' AND table_schema = '".$_SESSION['host']."';"); 如果你不能这样做,试试@Shadow 的建议。【参考方案3】:

您希望使用this answer 中指示的 INFORMATION_SCHEMA.COLUMNS 表

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

您首先创建一个循环,在其中创建表的 &lt;tr&gt;&lt;th&gt;[CONTENT]&lt;/th&gt;...&lt;/tr&gt; 行,然后运行现有循环以生成 &lt;tr&gt;&lt;td&gt;[CONTENT]&lt;/td&gt;...&lt;/tr&gt; 行。

您的第一个循环或多或少与您的第二个循环相同,不同之处在于您使用不同的 sql 结果,使用 &lt;th&gt; 而不是 &lt;td&gt; 和第二个循环内的循环。这将...

将数据库中的整个表显示为 html 中的表

如果您需要行/列计数,您可以在每个循环中添加某种迭代器

第一个循环示例

echo "<tr>";
$countColumn = 0;
while($row = $statement->fetch())

    echo "<th>".$row['COLUMN_NAME']."</th>";
    $countColumn += 1;

echo "</tr>";

第二个循环示例

$countRow = 0;
while($row = $statement->fetch())

    echo "<tr>";
    foreach($row as $data)
    
        echo "<td>".$data."</td>";
        $countRow += 1;
    
    echo "</tr>";

注意:浏览器是智障儿童,除非在您的

echo "<table border= '1'>";

while($row = $statement->fetch())

    echo $row['book_id'] . $row['title'];


echo "</table>";

将您的$row['book_id'] . $row['title'] 与您的&lt;tr&gt;&lt;td&gt; 标签分开,不要让它们填写空白。特别是如果这将是一个非 Intranet 页面

【讨论】:

以上是关于如何使用 PHP 将不同的用户选择的 SQL 表显示为 html 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询

如何使用 PHP 在 html 中使用 SELECT 标记查询我的 SQL 数据库

如何从 html 输入表单中使用 php 查找时差

如何使用 PHP 将 SQL Select 语句链接到 HTML 按钮

如何使用 PHP 将记录从远程 SQL Server 2005 复制到本地 mySQL?

如何使用PHP将SQL Select语句链接到HTML按钮