首页 > 解决方案 > 如何在 PHP 中打印多值列

问题描述

我有一个关于Customer信息的 SQL Server 数据库,并且CustomerPhone有一个多值列,即C_Phone.

这是我的代码:

if (!empty($_GET['customer_id'])){
    // 'id' input from the user
    $id = $_GET['customer_id'];
    // Customer Information
    $sql = "SELECT Customer.C_Code, C_FirstName, C_LastName, C_Email, C_HomeAddress, C_OfficeAddress, C_Phone
            FROM Customer, CustomerPhone
            WHERE Customer.C_code = CustomerPhone.C_code and Customer.C_code = $id;";
    $query = sqlsrv_query($conn, $sql);
    $row = sqlsrv_fetch_array($query);
    if (!empty($row)) {
        echo "
        <div class=\"card\" style=\"width: 25rem; margin-left: auto; margin-right: auto;\">
            <div class=\"card-body\">
                <h5 class=\"card-title\">Customer Information</h5>";
        echo "<p class=\"card-text\">C_code: " . $row['C_Code'] . "</p>";
        echo "<p class=\"card-text\">C_Name: " . $row['C_FirstName'] . " " . $row['C_LastName'] . "</p>";
        echo "<p class=\"card-text\">C_Email: " . $row['C_Email'] . "</p>";
        echo "<p class=\"card-text\">C_HomeAddress: " . $row['C_HomeAddress'] . "</p>";
        echo "<p class=\"card-text\">C_OfficeAddress: " . $row['C_OfficeAddress'] . "</p>";
        echo "<p class=\"card-text\">C_Phone: ";
        while($row = sqlsrv_fetch_array($query))
        {   
            echo $row['C_Phone'] . "<br>";
        }
        echo "</p>";
        echo "
            </div>
        </div>";
    }

这是我得到的结果。如何在第一个电话号码下打印第二个电话号码? 在此处输入图像描述

如果我在 SSMS 上运行上面的 SQL 查询,我会得到以下结果Customer.C_Code = 7

在此处输入图像描述

标签: phpsql-serversqlsrv

解决方案


您至少可以选择两条路线。您将不得不使这些想法适应您的数据库连接功能,因为我没有使用 microsoft 数据库的经验

嵌套循环

在客户信息的每次迭代中,使用从 Customer 获得的 C_code 对 CustomerPhone 进行第二次查询。如评论中所述,使用while语句来遍历结果。

while($row=sqlsrv_fetch_array($query) {

必须注意防止内部查询破坏外部!

SQL 聚合函数

这涉及进行更复杂的查询。您可以group by一个字段并让数据库连接字段:


SELECT 
     Customer.C_Code, C_FirstName, C_LastName, 
     C_Email, C_HomeAddress, C_OfficeAddress, 
     string_agg(C_Phone, ', ') AS phone
FROM Customer
INNER JOIN CustomerPhone ON Customer.C_code = CustomerPhone.C_code
WHERE
     Customer.C_code = ?
GROUP BY Customer.C_code

(请注意,有些数据库要求每个字段都在group by子句中)

(注 2 - 这是一个参数化查询,与准备命令一起使用。请参阅准备好的语句的文档。这是在查询中使用值的正确方法)

如图所示,这会将它们列为 csv。您也可以使用<br>分隔它们而不是逗号。


推荐阅读