Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中打印多值列_Php_Sql Server_Sqlsrv - Fatal编程技术网

如何在PHP中打印多值列

如何在PHP中打印多值列,php,sql-server,sqlsrv,Php,Sql Server,Sqlsrv,我有一个关于Customer信息的SQL Server数据库,CustomerPhone有一个多值列,它是C\u Phone 这是我的代码: if (!empty($_GET['customer_id'])){ // 'id' input from the user $id = $_GET['customer_id']; // Customer Information $sql = "SELECT Customer.C_Code, C_FirstName

我有一个关于
Customer
信息的SQL Server数据库,
CustomerPhone
有一个多值列,它是
C\u 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>";
    }
if(!empty($\u GET['customer\u id'])){
//来自用户的“id”输入
$id=$\u GET['customer\u id'];
//客户信息
$sql=“选择Customer.C_代码、C_名字、C_姓氏、C_电子邮件、C_家庭地址、C_办公地址、C_电话
来自客户,客户电话
其中Customer.C_code=CustomerPhone.C_code,Customer.C_code=$id;“;
$query=sqlsrv_query($conn,$sql);
$row=sqlsrv\u fetch\u数组($query);
如果(!空($row)){
回声“
客户信息”;
echo“

C\U代码:“.$row['C\U代码]”

”; echo“

C\u Name:“.$row['C\u FirstName']”.“.$row['C\u LastName']”.

”; echo“

C_电子邮件:“.$row['C_电子邮件']”“

”; echo“

C_HomeAddress:“.$row['C_HomeAddress']”“

”; echo“

C\u OfficeAddress:“.$row['C\u OfficeAddress']”“

”; 回音“

C\U电话:”; while($row=sqlsrv\u fetch\u数组($query)) { echo$row['C_Phone']。“
”; } 回声“

”; 回声“ "; }
这是我得到的结果。如何在第一个电话号码下打印第二个电话号码?

如果我在SSMS上运行上面的SQL查询,我会使用
Customer.C_code=7
得到这个结果:


您至少可以选择两种方法。您必须将这些方法与数据库连接功能相适应,因为我没有使用microsoft数据库的经验

嵌套循环连接 在客户信息的每次迭代中,使用从客户处获得的C_代码对CustomerPhone进行第二次查询。如注释中所述,使用
while
语句迭代结果

while($row=sqlsrv_fetch_array($query) {
必须注意防止内部查询撞击外部查询

SQL聚合函数 这涉及到进行更复杂的查询。您可以按字段进行分组,并让数据库连接字段:


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-这是一个参数化查询,与prepare命令一起使用。有关准备好的语句,请参阅文档。这是在查询中使用值的正确方法)


如图所示,这将以csv的形式列出它们。您也可以使用

来分隔它们,而不是使用逗号。

至少可以采用两种方法。您必须将这些方法与数据库连接功能相适应,因为我没有使用microsoft数据库的经验

嵌套循环连接 在客户信息的每次迭代中,使用从客户处获得的C_代码对CustomerPhone进行第二次查询。如注释中所述,使用
while
语句迭代结果

while($row=sqlsrv_fetch_array($query) {
必须注意防止内部查询撞击外部查询

SQL聚合函数 这涉及到进行更复杂的查询。您可以按字段进行分组,并让数据库连接字段:


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-这是一个参数化查询,与prepare命令一起使用。有关准备好的语句,请参阅文档。这是在查询中使用值的正确方法)


如图所示,这会将它们列为csv。您也可以使用

来分隔它们,而不是使用逗号。

出现这种意外行为的原因是,您需要从第一个获取的行(
echo“

而不是
echo”

C_电话:;

你也可以考虑如下:

  • 使用显式
    JOIN
    语法
  • 使用参数化查询。如中所述,sqlsrv_查询函数非常适合于一次性查询,并且应该是执行查询的默认选择,除非特殊情况适用,并且sqlsrv_查询函数同时执行语句准备和语句执行,并且可以用于执行参数化查询
以下示例基于您的代码,是您问题的可能解决方案:

if (!empty($_GET['customer_id'])) { 
    // Customer Information
    $sql = "
        SELECT c.C_Code, c.C_FirstName, c.C_LastName, c.C_Email, c.C_HomeAddress, c.C_OfficeAddress, p.C_Phone
        FROM Customer c
        JOIN CustomerPhone p ON c.C_code = p.C_code
        WHERE c.C_code = ?;
    ";
    $params = array($_GET['customer_id']);
    $query = sqlsrv_query($conn, $sql, $params);
    if ($query === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }   
    // fetch data
    $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: ". $row['C_Phone'] . "<br>";
        while ($row = sqlsrv_fetch_array($query))
        {   
            echo $row['C_Phone'] . "<br>";
        }
        echo "</p>";
        echo "
            </div>
        </div>";
    }
}
if(!empty($\u GET['customer\u id']){
//客户信息
$sql=”
选择c.c\U代码、c.c\U名字、c.c\U姓氏、c.c\U电子邮件、c.c\U家庭地址、c.c\U办公地址、p.c\U电话
来自客户c
在c.c_代码=p.c_代码上加入客户电话p
其中c.c_代码=?;
";
$params=array($\u GET['customer\u id']);
$query=sqlsrv_query($conn、$sql、$params);
如果($query==false){
echo“Error(sqlsrv_查询):”。print_r(sqlsrv_errors(),true);
出口
}   
//获取数据
$row=sqlsrv\u fetch\u数组($query);
如果(!空($row)){
回声“
客户信息”;
echo“

C\U代码:“.$row['C\U代码]”

”; echo“

C\u Name:“.$row['C\u FirstName']”.“.$row['C\u LastName']”.

”; echo“

C_电子邮件:“.$row['C_电子邮件']”“

”; echo“

C_HomeAddress:“.$row['C_HomeAddress']”“

”; echo“

C\u OfficeAddress:“.$row['C\u OfficeAddress']”“

”; echo“

C\U电话:“.$row['C\U电话]”
”; while($row=sqlsrv\u fetch\u数组($query)) { echo$row['C_Phone']。“
”; } 回声“

”; 回声“ "; } }
这种意外行为的原因是