PDO 在表格中显示结果
Posted
技术标签:
【中文标题】PDO 在表格中显示结果【英文标题】:PDO display results in table 【发布时间】:2021-08-14 18:55:54 【问题描述】:我正在尝试将准备好的语句的结果显示到表格中。
这是查询和尝试的表:
<?php
$s = "SELECT username,fullname,email,userlevel FROM users";
$sth = $dbc->prepare($s, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute();
echo "<div><table class="demoTable">";
echo "<thead><tr>" .
"<th>Username</th>" .
"<th>Fullname</th>" .
"<th>Email</th>" .
"<th>Userlevel</th>" .
"</tr></thead>";
echo "<tbody>";
while($Row = $sth->fetchAll(PDO::FETCH_ASSOC))
echo "<tr><td>".$Row['username']."</td>";
echo "<td>".$Row['fullname']."</td>";
echo "<td>".$Row['email']."</td>";
echo "<td>".$Row['userlevel']."</td>";
echo "</tr></tbody>";
echo "</table></div>";
?>
使用上述内容,我没有在屏幕上显示任何内容。
当我使用以下内容时:
print_r($Row);
我可以在数组中看到如下所示的结果:
Array (
[0] => Array ( [username] => usr.sname [fullname] => Some Name [email] => some.name@company.com [userlevel] => 9 )
[1] => Array ( [username] => usr.aname [fullname] => Another Name [email] => another.name@company.com [userlevel] => 1 )
[2] => Array ( [username] => usr.fname [fullname] => Final Name [email] => final.name@company.com [userlevel] => 1 ) // a few more
所以,查询工作正常。我就是无法让数据显示在表格中。
我怎样才能做到这一点?
【问题讨论】:
可能是... while($Row = $sth->fetch(PDO::FETCH_ASSOC)) ...
(不是fetchAll
。如果你想使用fetchAll()
,你需要一个额外的for
循环。
顾名思义,fetchAll
一次获取所有数据。你的代码应该给你未定义的索引通知。而你的print_r
揭示了结构。或者,您甚至可以直接foreach
执行的语句。
【参考方案1】:
FWIW,以下对我来说很好......
<?php
/*
DROP TABLE users;
CREATE TABLE users(user_id SERIAL PRIMARY KEY
,username VARCHAR(12) UNIQUE
,fullname VARCHAR(20) NOT NULL
,email VARCHAR(20) NOT NULL
,userlevel INT NOT NULL);
INSERT INTO users VALUES
(1,'John','John Lennon','john@apple.corp',1),
(2,'Paul','Paul McCartney','paul@apple.corp',1),
(3,'George','George Harrison','george@apple.corp',2),
(4,'Ringo','Ringo Starr','ringo@apple.corp',3);
*/
require('path/to/connection/stateme.nts');
$query = "SELECT username,fullname,email,userlevel FROM users";
$data = $pdo->query($query)->fetchAll(PDO::FETCH_BOTH);
// my connection is something like '$pdo = new PDO($dsn, $user, $pass, $options);'
echo "
<div><table class=\"demoTable\">
<thead>
<tr>
<th>Username</th>
<th>Fullname</th>
<th>Email</th>
<th>Userlevel</th>
</tr>
</thead>
<tbody>
";
foreach($data as $row)
echo "
<tr>
<td>$row['username']</td>
<td>$row['fullname']</td>
<td>$row['email']</td>
<td>$row['userlevel']</td>
</tr>
";
echo "</tbody></table></div>";
?>
输出:
Username Fullname Email Userlevel
John John Lennon john@apple.corp 1
Paul Paul McCartney paul@apple.corp 1
George George Harrison george@apple.corp 2
Ringo Ringo Starr ringo@apple.corp 3
【讨论】:
使用 fetchAll(PDO::FETCH_BOTH) 似乎已经成功了。谢谢。【参考方案2】:我认为问题在于您使用的是 fetchAll,它返回查询的所有行而不是一行一行。所以用这段代码替换你的while循环,我认为它应该可以工作。
<?php
$s = "SELECT username,fullname,email,userlevel FROM users";
$sth = $dbc->prepare($s, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute();
echo "<div><table class='demoTable'>";
echo "<thead><tr>" .
"<th>Username</th>" .
"<th>Fullname</th>" .
"<th>Email</th>" .
"<th>Userlevel</th>" .
"</tr></thead>";
echo "<tbody>";
$allRows = $sth->fetchAll();
foreach($allRows as $Row)
echo "<tr><td>".$Row['username']."</td>";
echo "<td>".$Row['fullname']."</td>";
echo "<td>".$Row['email']."</td>";
echo "<td>".$Row['userlevel']."</td>";
echo "</tr>";
echo "</tbody></table></div>";
?>
【讨论】:
我没有在屏幕上恢复任何内容。我就是不明白。 我刚刚注意到循环中有 标记。我编辑了我的答案并将其放在最后一个回声中。我认为这可能会阻止表格正确显示 我进行了更新,但屏幕上仍然没有任何内容。我将把表头移到 PHP 之外。 我尝试重新创建您的代码,但它没有运行,因为表标签中的类名“demoTable”在双括号中。所以你应该使用单括号。将“demoTable”替换为“demoTable”。我也更新了我的答案。 我删除了 demoTable,但仍然没有。出于某种原因,使用 fetchAll(PDO::FETCH_BOTH) 解决了我的问题。我还是不明白。以上是关于PDO 在表格中显示结果的主要内容,如果未能解决你的问题,请参考以下文章