Php 选择查询执行两次

Php 选择查询执行两次,php,mysqli,Php,Mysqli,我正在编写一个简单的页面来检索属于登录用户的PO编号。除了返回2个完整记录集的查询之外,该部分工作正常。我已经检查了页面刷新问题,正如我读过的其他帖子中提到的,但没有发现任何问题 php <table class="table" style="width: 100%"> <thead class="thead-dark"> <tr> <th scope="col">PO

我正在编写一个简单的页面来检索属于登录用户的PO编号。除了返回2个完整记录集的查询之外,该部分工作正常。我已经检查了页面刷新问题,正如我读过的其他帖子中提到的,但没有发现任何问题

php

    <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='上从主内部联接用户选中此联接选择*$用户标识。”谢谢你的链接。我要做些家庭作业。哇,谢谢你,米肯。我不得不说,我总是被那些擅长他们的手艺的人给吓跑了!我有很多学习/阅读的事情要做。非常感谢您的指导。