为啥数组响应没有使用 PHP MySQL API 进入 JSON

Posted

技术标签:

【中文标题】为啥数组响应没有使用 PHP MySQL API 进入 JSON【英文标题】:Why array response not getting in JSON with PHP MySQL API为什么数组响应没有使用 PHP MySQL API 进入 JSON 【发布时间】:2020-06-10 02:33:27 【问题描述】:

我正在开发一个带有phpmysql 数据库的API,它在其中接收POST 参数并将响应作为JSON 发回。我正在使用应该返回 3 行数组的查询和相关参数,但它没有返回单行。这是应该返回的记录

+--------+-------------------+------------+------+----------+
| rollno |        sub        |    date    | year | presenty |
+--------+-------------------+------------+------+----------+
|     12 | Maths             | 02-10-2019 |    2 | p        |
|     12 | Physics           | 02-10-2019 |    2 | p        |
|     12 | Computer Networks | 02-10-2019 |    2 | a        |
+--------+-------------------+------------+------+----------+

获取这个的代码如下:

$response = array();
if(isset($_POST['year']) && isset($_POST['rollno']) && isset($_POST['date']))
    $year = $_POST['year'];
    $rollno = $_POST['rollno'];
    $date_tmp = date_create($_POST['date']);
    $date = date_format($date_tmp,'d-m-Y');
    $att = array();
    $fetchatt = $conn->query("SELECT * FROM attendance WHERE year=".$year." AND rollno=".$rollno." AND date=".$date);
    while($row = $fetchatt->fetch_assoc())
        $att[] = array('sub'=>$row['sub'],
                      'presenty'=>$row['presenty']);
        $response['att'] = $att;
    
    $response['error'] = false;
    $response['message'] = "Retrieval Successful";

echo json_encode($response);

我发送POST参数(使用ARC REST客户端chrome扩展)如下:

rollno: 12
year: 2
date: 02-10-2019

作为回应,我只得到这个

"error":false,"message":"Retrieval Successful"

相反,响应还应包含上述匹配记录的数组

【问题讨论】:

您正在覆盖响应数组中 $att 的值 @AhmedAli 我在另一个文件中使用了相同的技术,并且正在工作 警告!您对 SQL 注入攻击敞开心扉!您应该使用参数化的prepared statements,而不是像这样直接在查询中使用完全未转义的用户数据。 日期格式看起来取决于文化。您是否尝试使用以下日期格式:YYYY-MM-DD? 试试这个 - $fetchatt = $conn->query("SELECT * FROM attendance WHERE year=".$year." AND rollno=".$rollno." AND date='".$date."');$date 应该是单引号。 【参考方案1】:

试试这个 - $fetchatt = $conn->query("SELECT * FROM attendance WHERE year=".$year." AND rollno=".$rollno." AND date='".$date."');

$date 应该是单引号。

【讨论】:

警告! 使用此代码,您将对SQL injection 攻击敞开大门!您应该使用参数化的prepared statements,而不是像这样直接在查询中使用完全未转义的用户数据。 sman,请记住@Magnus 的建议并相应地修改您的查询。 我建议您编辑答案以确保安全。展示真正的解决方案。现在它说 “试试这个”,然后在 cmets 中你基本上是在说,“但你不应该这样做”【参考方案2】:

验证您的 SQL 查询的外观是一种很好的做法,尤其是在取决于用户输入的情况下。尝试将查询记录到文件中,然后打开该文件并使用 MySQL Workbench 或 PHPMyAdmin 检查查询,甚至将它们输出到页面(仅在测试环境中)。这可以防止代码中出现明显的语法错误。

另外我建议您为您的网站启用错误日志记录

【讨论】:

请进一步解释所有这些如何帮助解决问题 据我了解,问题在于查询中的语法错误,该代码可能会引发错误。通过记录此类错误,您可以了解出了什么问题,通过查看实际查询,您可以检测到语法错误 那么,单独记录查询并不能解决问题?那么为什么不在答案中添加一些东西呢? ;) 如果问题的作者添加了查询或错误的日志记录,他会很快发现该查询存在问题 如果你已经知道了,为什么不帮忙解决这个问题呢?

以上是关于为啥数组响应没有使用 PHP MySQL API 进入 JSON的主要内容,如果未能解决你的问题,请参考以下文章

PHP为啥不能调用MySQL

为啥我的微 API 没有响应体?

我想使用免费的 YouTube 到 mp3 API,但我只有字符串作为响应。我如何在对象/json/数组中传输响应? PHP

为啥我的 Axios 实例没有在捕获的错误中返回响应?

使用 php curl 对 paypal api 没有响应

为啥以这种方式使用 Alamofire 时没有发现任何价值?