Php 选择查询执行两次
我正在编写一个简单的页面来检索属于登录用户的PO编号。除了返回2个完整记录集的查询之外,该部分工作正常。我已经检查了页面刷新问题,正如我读过的其他帖子中提到的,但没有发现任何问题 phpPhp 选择查询执行两次,php,mysqli,Php,Mysqli,我正在编写一个简单的页面来检索属于登录用户的PO编号。除了返回2个完整记录集的查询之外,该部分工作正常。我已经检查了页面刷新问题,正如我读过的其他帖子中提到的,但没有发现任何问题 php <table class="table" style="width: 100%"> <thead class="thead-dark"> <tr> <th scope="col">PO
<table class="table" style="width: 100%">
<thead class="thead-dark">
<tr>
<th scope="col">PO#</th>
<th scope="col">Job#</th>
<th scope="col">Job Name</th>
<th scope="col">Salesperson</th>
<th scope="col">Vendor</th>
<th scope="col">Date</th>
</tr>
</thead>
<tbody>
<?php include 'usersPOs.php'?>
</tbody>
</table>
usersPOs.php
$db = mysqli_connect('localhost', 'root', '', 'acs-jobs-pos');
$userID = $_SESSION['userID'];
$userPrivs = $_SESSION['admin'];
if ($userPrivs == 0) { // User IS NOT an admin
// Get ALL main table records that belong to the logged-in user
$sqlmain = "SELECT * FROM main INNER JOIN users ON main.userID = '" . $userID . "'";
//debug_print_backtrace();
$resultmain = mysqli_query($db,$sqlmain);
while($rowmain = mysqli_fetch_assoc($resultmain))
{
?>
<tr>
<?php
$PONumb = $rowmain["PONumb"];
$jobNumber = $rowmain["jobNumber"];
$jobName = $rowmain["jobName"];
$salespersonID = $rowmain["salespersonID"];
$vendorID = $rowmain["vendorID"];
$timestamp = $rowmain["timestamp"];
?>
<td><?php echo $PONumb ?></td>
<td><?php echo $jobNumber ?></td>
<td><?php echo $jobName ?></td>
<?php
$sqlsp = "SELECT * FROM users WHERE userID = '" . $salespersonID . "'";
$resultsp = mysqli_query($db,$sqlsp);
$rowsp = mysqli_fetch_assoc($resultsp);
if ($rowsp["lastname"] == '' && $rowsp["firstname"] == '') {
?>
<td></td>
<?php
} else {
?>
<td><?php echo $rowsp["lastname"] . ', ' . $rowsp["firstname"] ?></td>
<?php
}
$sqlvendor = "SELECT * FROM vendor
WHERE vendorID = '" . $vendorID . "'";
$resultvendor = mysqli_query($db,$sqlvendor);
$rowvendor = mysqli_fetch_assoc($resultvendor);
?>
<td><?php echo $rowvendor["vendorname"] ?></td>
<td><?php echo $timestamp ?></td>
</tr>
<?php
}
mysqli_close($db);
}
使用联接可以极大地简化此代码。我还建议使用PDO访问数据库;它不太冗长,使准备好的语句更容易,并且在任何环境中都不是可选的。仅从数据库中选择相关列。heredoc块也用于简化输出
<?php
$db = new PDO('mysql:host=localhost;dbname=acs-jobs-pos', 'root', '');
$userID = $_SESSION['userID'];
$userPrivs = $_SESSION['admin'];
if ($userPrivs == 0) {
$sql = "SELECT m.PONumb, m.jobNumber, m.jobName, m.salespersonID, m.vendorID, m.timestamp,
u.lastname, u.firstname, v.vendorname
FROM main m
LEFT JOIN users u ON (m.salespersonID = u.userID)
LEFT JOIN vendors v ON (m.vendorID = v.vendorID)
WHERE m.userID = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$userID]);
$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo <<< HTML
<tr>
<td>$row[PONumb]</td>
<td>$row[jobNumber]</td>
<td>$row[jobName]</td>
<td>$row[lastname], $row[firstname]</td>
<td>$row[vendorname]</td>
<td>$row[timestamp]</td>
</tr>
HTML;
}
}
跟踪sql错误
从main.userID='上的主内部联接用户中选择*$用户标识'
您不能像这样使用join,例如
在main.userID=users.ID上的main-internal-JOIN-users中选择*,其中users.ID='$用户标识' 你确定你的while循环不会执行不止一次吗?我问这个问题听起来很愚蠢,但是,有没有一种简单的方法来测试这种情况?它看起来就是这么做的。我不知道你的数据。但是如果我知道第一张唱片是我想要的,我不会有一段时间。只是一个if来检查数据。你可以休息一下;在这段时间的最后,我要杀了它。您可能希望在main.userID='上从主内部联接用户选中此联接选择*$用户标识。”谢谢你的链接。我要做些家庭作业。哇,谢谢你,米肯。我不得不说,我总是被那些擅长他们的手艺的人给吓跑了!我有很多学习/阅读的事情要做。非常感谢您的指导。