这是我在 SO 中的第一篇文章,如果我打开了一个现有问题,我深表歉意。因为我无法在谷歌中找到结果。抱歉这么说,但我对 PHP PDO 和学习阶段还很陌生。
回到我的问题,目前我正在建立我妻子的客户访问日志,但我对结果很困惑。我有两个表,一个存储客户信息,另一个存储访问详细信息。我在这里上传了测试表:SQL Fiddle
下面是我当前的编码,我正在使用 PHP PDO 而
<?php
require_once 'dbconnect.php';
$p_id = $_GET['name'];
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$sql = "SELECT customer.fname, customer.lname, customer.gender, services.treatment, services.date
FROM customer LEFT JOIN services
ON customer.id = services.customer_id
WHERE customer.slug LIKE :id";
$q = $conn->prepare($sql);
$q->execute(array('id' => $p_id));
$q->setFetchMode(PDO::FETCH_ASSOC);
} catch (PDOException $pe) {
die("Could not connect to the database $dbname :" . $pe->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<div id="container">
<h1>Customer Record</h1>
Name: <br />
Gender: <br />
<table class="table table-bordered table-condensed">
<thead>
<tr>
<th>Customer Name</th>
<th>Customer Gender</th>
<th>Treatment</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<?php while ($r = $q->fetch()): ?>
<tr>
<td><?php echo htmlspecialchars($r['fname']), ' ', htmlspecialchars($r['lname'])?></td>
<td><?php echo htmlspecialchars($r['gender']); ?></td>
<td><?php echo htmlspecialchars($r['treatment']); ?></td>
<td><?php echo htmlspecialchars($r['date']); ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<a href="search.html">Seach Again</a>
</body>
</div>
</html>
我实现了 SQL Fiddle 结果,但我想要的是,姓名和性别不会一直重复。
我附上截图:
我想要的是根据屏幕截图图片,姓名: John Doe 和性别: 男,应该在最上面,而不是在下表显示时继续重复所有的访问细节。我尝试修改代码,但似乎并没有真正解决问题。
请告诉我,因为我真的不知道如何实现我想要的。
非常感谢。
最佳答案
自从你做了 LEFT JOIN
在您的 SQL 查询中,您提前知道所有 fname
, lname
和 gender
$q->fetch()
返回的值将用于相同 customer.slug
, 正确的?所以您可以放心。
我的建议是改为使用 fetchAll()函数获取 customer.slug
的所有记录的数组,然后在您的 View 中呈现它。例如(尚未测试)您可以在 $q->setFetchMode(PDO::FETCH_ASSOC);
之后添加以下内容...
$cs = $q->fetchAll(); // customer services join
然后,在您的 <html>
中查看,您可以执行以下操作:
<h1>Customer Record</h1>
Name: <?php echo htmlspecialchars($cs[0]['fname'].' '.$cs[0]['lname']); ?> <br />
Gender: <?php echo htmlspecialchars($cs[0]['gender']); ?> <br />
<table>
<thead>
<tr>
<th>Treatment</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<?php foreach($cs as $r): ?>
<tr>
<td><?php echo htmlspecialchars($r['treatment']); ?></td>
<td><?php echo htmlspecialchars($r['date']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
当然,检查您的查询是否返回了任何记录可能也是一个好主意,如果没有返回则显示“未找到”消息。毕竟,$cs[0]
可能是空的,给你一个 PHP 错误。
关于PHP PDO 虽然没有达到我想要的最终结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25703779/