【问题标题】:How to get value from mssql DB in PHP如何在 PHP 中从 mssql DB 中获取价值
【发布时间】:2018-07-03 13:19:59
【问题描述】:

首先我从BIRTHDAYS 获得工人姓名,然后想从USERS 获得e-mail address。从Table1 获取工人姓名没有问题,但是当我尝试获取电子邮件地址时db 返回我NULL。我的数据库是 mssql。

<?php
include_once("connect.php");
$today = '05.07';
$today1 = $today . "%";
$sql = "SELECT NAME FROM BIRTHDAYS WHERE BIRTH LIKE '$today1' ";
$stmt = sqlsrv_query($conn,$sql);
if($stmt == false){
    echo "failed";
}else{
   $dizi = array();
   while($rows = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_ASSOC))
   {
    $dizi[] = array('NAME' =>$rows['NAME']);
    $newarray = json_encode($dizi,JSON_UNESCAPED_UNICODE);
   }
 }

    foreach(json_decode($newarray) as $nameObj) 
{
    $nameArr = (array) $nameObj;
    $names = reset($nameArr);
    mb_convert_case($names, MB_CASE_UPPER, 'UTF-8');
    echo $sql2 = "SELECT EMAIL FROM USERS WHERE NAME = '$names' ";
    echo "<br>";
    $stmt2 = sqlsrv_query($conn,$sql2); 
        if($stmt2 == false)
        {
        echo "failed";
        }
        else
        {
        $dizi2 = array();   
        while($rows1 = sqlsrv_fetch_array($stmt2,SQLSRV_FETCH_ASSOC))
        {   
            $dizi1[] = array('EMAIL' =>$rows['EMAIL']);
            echo $newarray1 = json_encode($dizi1,JSON_UNESCAPED_UNICODE);
        }   
    }
}   
?>

【问题讨论】:

  • 这很好,但是您正在执行的实际查询是什么?当你调试这个(例如,你echo那个值,那么那个值是是什么?)具体会发生什么?
  • 你为什么在同一段代码中先 json_encode 然后立即 json_decode 呢?似乎有点无意义的开销......因为这一切都发生在 PHP 中,您不妨只是传递 PHP 变量。 JSON和XML之类的东西的重点是将数据序列化为文本以传输到另一个无法直接读取当前程序中的变量的系统或程序。
  • 另外,查询名字真的很健壮吗?例如,拥有多个名为“大卫”的人是很常见的,那么您将如何区分他们呢?最好使用 ID 来匹配他们,或者其他通常对个人来说是唯一的东西,例如他们的电子邮件地址。换句话说,在Birthdays 表中,不要存储用户的姓名,而是存储他们的ID,这些ID 也存在于Users 表中。并在它们之间创建外键关系。这样,您也可以使用 INNER JOIN 在一个查询中完成整个操作。
  • 如果您还没有学习过数据库设计、实体关系和规范化,那么现在是学习的好时机。例如,您可以写 SELECT Email From Users INNER JOIN Birthdays on User.ID = Birthday.UserID WHERE Birth LIKE '05.07%' 并获取所有生日符合 LIKE 条件的用户的电子邮件
  • " 它在 db 站点中返回 david@abc.com,但在我的 PHP 中没有返回"...所以在这种情况下必须有一些区别。这清楚地表明,在 PHP 中,您要么 a) 实际上没有执行相同的查询(所以请echo 完成查询的 SQL,以便您可以检查,如上所述),或者 b) 实际上没有连接到相同的查询您的数据库的副本,其中一个包含与另一个不同的数据。

标签: php json sql-server


【解决方案1】:
 while($rows1 = sqlsrv_fetch_array($stmt2,SQLSRV_FETCH_ASSOC))
        {   
            $dizi1[] = array('EMAIL' =>$rows['EMAIL']);
            echo $newarray1 = json_encode($dizi1,JSON_UNESCAPED_UNICODE);
        } 

您输入 $rows1 并从 $rows 中取出 NULL 是正确答案 :)

接受$rows1['EMAIL'] 就可以了

为什么foreach =?

你可以像这样将语句放在while循环中:

  while ($rows = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {

    $names = $rows['NAME'];
    $sql2 = "SELECT EMAIL FROM USERS WHERE NAME = '$names' ";
    echo "<br>";
    $stmt2 = sqlsrv_query($conn, $sql2);
    if ($stmt2 == false) {
        echo "failed";
    } else {
        $dizi2 = array();
        while ($rows1 = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC)) {
            $dizi1[]        = array('EMAIL' => $rows1['EMAIL']);
            echo $newarray1 = json_encode($dizi1, JSON_UNESCAPED_UNICODE);
        }
    }

}

【讨论】:

  • @DarthMaul:这里的要点是使用有意义的变量名。 “行”不会告诉您有关数据的任何信息,所有关系数据都在行中。并且“Rows1”并没有以任何有意义的方式将自己与“rows”区分开来。名字很重要。使用有意义的名称,您将能够阅读自己的代码。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多