【问题标题】:No rows being returned from MySQL query using PHP while manually running query returns rows使用 PHP 从 MySQL 查询中没有返回行,而手动运行查询返回行
【发布时间】:2019-07-30 09:11:01
【问题描述】:

我正在使用 jquery ajax 调用返回 JSON 的 PHP 页面简单 API。 这是那个的代码

<?php 


$response['is_error'] = 'no';
$user = $_POST['user'];
$date = $_POST['date'];

$sql = "select * from locations where user_id='$user' and DATE(timestamp) = '$date'";
$locations = $conn->query($sql) or $response['is_error'] = 'yes';
$response['num_rows'] = $locations->num_rows;

$locations = $locations->fetch_assoc(); 

$response['locations'] = $locations;
$response['date'] = $date;

if($response['is_error'] == 'yes'){
    $response['status'] = "failed";
    $response['error'] = $conn->error;
}else{
    $response['status'] = "ok";
}

$response['sql']=$sql;

echo json_encode($response);

执行此脚本时返回以下 JSON

{"is_error":"no","num_rows":0,"locations":null,"date":"2019-07-30","status":"ok","sql":"select * from locations where user_id='0123456789' and DATE(timestamp) = '2019-07-30'"} 

这里是解析后的版本,方便查看

date: "2019-07-30"
is_error: "no"
locations: null
num_rows: 0
sql: "select * from locations where user_id='0123456789' and DATE(timestamp) = '2019-07-30'"
status: "ok"

但是,如果我在 PHPMyAdmin 页面 SQL 中复制粘贴以 JSON 形式回显的 SQL,它会返回一个确实是预期的行,但奇怪的是,它在使用 PHP 和脚本执行相同的查询时没有返回任何内容。

这是 PHPMyAdmin 查询输出的附加屏幕截图

运行print_r($conn) 在输出后回显

mysqli Object
(
    [affected_rows] => 1
    [client_info] => 5.6.30
    [client_version] => 50630
    [connect_errno] => 0
    [connect_error] => 
    [errno] => 0
    [error] => 
    [error_list] => Array
        (
        )

    [field_count] => 1
    [host_info] => Localhost via UNIX socket
    [info] => 
    [insert_id] => 0
    [server_info] => 5.6.44-cll-lve
    [server_version] => 50644
    [stat] => Uptime: 94095  Threads: 23  Questions: 77085244  Slow queries: 625  Opens: 814448  Flush tables: 1  Open tables: 5000  Queries per second avg: 819.227
    [sqlstate] => 00000
    [protocol_version] => 10
    [thread_id] => 1035427
    [warning_count] => 0
)

【问题讨论】:

  • 大胆猜测...您确定您的应用程序连接到正确的数据库吗?
  • hack 是的,服务器上只有一个数据库。
  • 你应该使用准备好的语句。现在你对 sql 注入很开放。
  • 要在实时环境中从 PHP 中获取错误,请将这 4 行添加到要调试 ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 的任何基于 MYSQLI_ 的脚本的顶部。这将强制任何MYSQLI_ 错误生成一个您可以在浏览器上看到的异常以及正常的 PHP 错误。
  • 请用“`”写时间戳字段。因为它是保留关键字,我认为如果这是问题,问题可能会得到解决。

标签: php mysql json phpmyadmin


【解决方案1】:

我认为以 0 开头的 user_id 会产生问题。您能否更改 user_id 列的数据类型并将其设为 varchar,然后尝试从查询中删除 0 以及表行,然后检查。它应该可以工作。

【讨论】:

  • user_id 已经是 varchar(12) 并且更改没有任何 0 的用户也无济于事
【解决方案2】:
if (isset($_POST["adds"])) {
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $db = "loc";
    $conn = new mysqli($servername, $username, $password, $db);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $response['is_error'] = 'no';
    $user = $_POST['user'];
    $date = $_POST['date'];
    $sql = "select * from location where user_id='$user' and DATE(timestamp) = '$date'";
    $locations = $conn->query($sql) or $response['is_error'] = 'yes';
    $response['num_rows'] = $locations->num_rows;

    $locations = $locations->fetch_assoc();
    $response['locations'] = $locations;
    $response['date'] = $date;
    if ($response['is_error'] == 'yes') {
        $response['status'] = "failed";
        $response['error'] = $conn->error;
    } else {
        $response['status'] = "ok";
    }
    $response['sql'] = $sql;
    echo json_encode($response);
}
`<html>
<head>
</head>
<body>
    <form method="post">
        <input type="text" name="user"><br>
        <input type="text" name="date"> <br>
        <input type="submit" name="adds">
    </form>
</body>
</html>

【讨论】:

  • 此脚本的输出应该是纯 JSON,否则应用程序在解析 JSON 时会在前端崩溃。你知道 API 是什么意思吗?
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
相关资源
最近更新 更多