【发布时间】:2016-03-30 07:40:48
【问题描述】:
解释
我有一个用户表和另一个表,其中存储了带有用户 ID 的证书。 1 个用户可以拥有多个证书。我需要选择一次用户并按用户 ID 列出所有证书,但我无法正确实现它,只为 1 个用户选择 1 个证书。
样本数据
这个非常简化的示例数据,实际上有超过 150 个字段和 5 个表。
我有以下表格:
用户
Id FirstName LastName
1 John Smith
2 Lisa Washington
证书
UserId CertificateName
1 Foo
1 Bar
1 Something
2 FooBar
2 Bizz
PHP 看起来像:
$UserID = get_current_user_id();
$GetUserId = $_GET["Id"];
if(isset($UserID)) {
$users = $con->prepare("
SELECT u.FirstName
,u.LastName
,c.CertificateName
FROM Users u
LEFT JOIN Certificates c ON u.Id = c.UserID
WHERE u.Id = '$GetUserId'
LIMIT 1
");
$users->execute();
$users->bind_result(
$FirstName,
$LastName,
$CertificateName
);
} else {
echo "There is no User ID detected, try to refresh browser.";
}
<html>
....
<?php
while ($users->fetch()) {
?>
<div class="grid-item"><?php echo $FirstName; ?></div>
<div class="grid-item"><?php echo $LastName; ?></div>
<div class="certificates"><?php echo $CertificateName; ?></div>
<?php
}
?>
现在输出
如果我通过GetUserId = 1 我得到了结果:
John Smith
Foo
期望的输出
它应该列出特定用户的所有证书。
John Smith
Foo
Bar
Something
我的尝试
我尝试在 while 循环中使用 foreach 循环来获取证书,但是这样它根本没有选择任何证书。您有什么想法可以实现吗?
【问题讨论】:
-
您的查询似乎很好,应该返回 john,bar 和一些东西,为什么它会返回 'Foo'?
-
使用准备好的语句很好。错误地使用它们很糟糕..您应该在查询中使用绑定以避免 sql 注入:
WHERE u.Id = :uid和$users->execute(array('uid' => $GetUserId));