【问题标题】:Why doesn't my mysql query in php return more than one row?为什么我在 php 中的 mysql 查询不返回超过一行?
【发布时间】:2013-08-03 21:19:42
【问题描述】:

我正在尝试在 PHP 中以 JSON 格式返回用户的名字和姓氏列表。

我的 PHP 看起来像这样:

    $_Query = '
                    SELECT
                    Fname,Lname
                    FROM
                    users
                    WHERE
                    number = "'.$_REQUEST['number'].'"
                                                    ;';

    $SQLResult = mysql_query($_Query) or die(mysql_error());

    $_UserData = array();

    if(mysql_num_rows($SQLResult) <> 0){

            while($SQLRow = mysql_fetch_array($SQLResult)){
                    $_UserData['Fname'] = $SQLRow['Fname'];
                    $_UserData['Lname'] = $SQLRow['Lname'];
            }

    }
echo json_encode($_UserData);

我希望格式中不止一行

{"Fname":["First_name1","First_name2"],"Lname":["Last_name1","Last_name2"]}

当然。但是脚本返回具有正确条件的最后一行

{"Fname":"Steve","Lname":"LastName"}

MySQl 服务器使用相同的查询返回它应该返回的内容。

+--------------+-------------+
| Fname        | Lname       |
+--------------+-------------+
| First_name1  | Last_name1  |
| First_name2  | Last_name2  |
+--------------+-------------+

为什么会发生这种情况,我应该如何解决它?谢谢!

【问题讨论】:

  • 因为你的循环会覆盖以前的值,所以你总是,而且只得到最后一条记录。
  • mysql_query 容易受到 SQL 注入攻击。不要在生产代码中使用它(通常没有理由使用它)。请改用mysqli
  • 您对 SQL 注入敞开了大门。请了解如何使用参数化查询(最好使用 PDO 模块)来保护您的 Web 应用程序。 bobby-tables.com/php 有一些示例可以帮助您入门。
  • @Andy @Alex 谢谢你,我会看看。不过,为什么htmlspecialchars() 不解决这个问题?
  • htmlspecialcharacters 与 SQL 完全无关。

标签: php mysql sql json


【解决方案1】:

试试这个:

while($SQLRow = mysql_fetch_array($SQLResult)){
    $_UserData[] = $SQLRow;
}

在您的示例中,您实际上是为每个新行覆盖 $_UserData 数组,因此丢失了行。

更新: 这将使 JSON 字符串看起来更符合您的要求。

while($SQLRow = mysql_fetch_assoc($SQLResult)){
    $_UserData['Fname'][] = $SQLRow['Fname'];
    $_UserData['Lname'][] = $SQLRow['Lname'];
}

【讨论】:

  • 我试过这个,@Sagi 也建议过,我得到了[{"0":"First_name1","Fname":"First_name1","1":"Last_name1","Lname":"Last_name1"},{"0":"First_name2","Fname":"First_name2","1":"Last_name2","Lname":"Last_name2"}]
  • 你可以使用 mysql_fetch_assoc() 代替 mysql_fetch_array(): while ($SQLRow = mysql_fetch_assoc($SQLResult)) { ... 这应该去掉 json 字符串中的编号条目。跨度>
【解决方案2】:
$_UserData['Fname'] = $SQLRow['Fname'];
$_UserData['Lname'] = $SQLRow['Lname'];

您重复设置 _UserData 的相同两个元素,而不是向数组追加新值。

【讨论】:

    【解决方案3】:

    您的循环会覆盖 $_UserData 数组中的值。 您应该将每一行追加到数组中。

    另外,请注意您应该转义您的输入。

    您的代码应如下所示:

    $_Query = '
                    SELECT
                    Fname,Lname
                    FROM
                    users
                    WHERE
                    number = "'.(int)$_REQUEST['number'].'"
                                                    ;';
    
    $SQLResult = mysql_query($_Query) or die(mysql_error());
    
    $_UserData = array();
    
    if(mysql_num_rows($SQLResult) <> 0){
    
            while($SQLRow = mysql_fetch_array($SQLResult)){
                    $_UserData[] = $SQLRow;
            }
    
    }
    echo json_encode($_UserData);
    

    【讨论】:

      【解决方案4】:

      试试这个:

      $_UserData = 数组();

      if(mysql_num_rows($SQLResult) <> 0){
              $i = 0;
              while($SQLRow = mysql_fetch_array($SQLResult)){
                      $_UserData[$i]['Fname'] = $SQLRow['Fname'];
                      $_UserData[$i]['Lname'] = $SQLRow['Lname'];
                      $i++;
              }
      

      【讨论】:

        【解决方案5】:

        当你意识到你只分配了 $_UserData 数组的 1 个元素时,我相信你会踢自己。

        应该是这样的:

        $_UserData = array();
        
        if(mysql_num_rows($SQLResult) <> 0){
        
                while($SQLRow = mysql_fetch_array($SQLResult)){
                        // Either...
                        // Create a new entry in $_UserData with same structure and contents as $SQLRow
                        $_UserData[] = $SQLRow;
                        // OR more specific - say if the structures aren't identical
                        // $DataRow=array();
                        // $DataRow['Fname'] = $SQLRow['Fname'];
                        // $DataRow['Lname'] = $SQLRow['Lname'];
                        // $_UserData[] = $DataRow;
                }
        
        }
        

        干杯

        【讨论】:

        • 我尝试了第二种方式 (DataRow=array() ) 并且成功了,但是,有没有办法返回数组中的所有名字和姓氏,所以 {"Fname:["F-name1","F-name2"],... 等?
        猜你喜欢
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多