在android中读取mysql数据库返回空值

时间:2018-09-12 21:05:55

标签: php android mysql

我想从android应用程序中的mysql数据库读取数据。我正在使用以下php脚本。

$con=mysqli_connect($servername,$username,$password,$db_name);
$sql  = 'SELECT * FROM `Item`';
$result = array();

if (mysqli_connect_errno($con)) {
   echo "Failed to connect: " . mysqli_connect_error();
}

$r = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($r)) {
    array_push($result,array(
      'id'=>$row['id'],
      'title'=>$row['title'],
      'description'=>$row['description']
    ));
}

echo json_encode(array("result"=>$result));

mysqli_close($con);

调试我的android应用程序时,我可以看到以下响应。

enter image description here

似乎该数组已成功从php返回到android应用程序,但该值为null。因此,我认为php代码中存在问题。

此外,有趣的是返回了正确数量的条目。我的数据库当前有两个条目,并且还返回了两个条目..但是具有空值。

2 个答案:

答案 0 :(得分:0)

实际上,我找到了针对空值的解决方案。

在将数据推送到数组时,我必须在数据库表列的数据类型之间有所不同。在我的情况下,列“ id”的数据类型为INTEGER。因此,我可以使用'id'=>$row[0]将数据传递到数组中。其他两列(标题和描述)的数据类型为VARCHAR。因此,我不得不使用'title'=>"$row[1]"传递数据。

while($row = mysqli_fetch_array($r)) {
   array_push($result,array(
     'id'=>$row[0],
     'title'=>"$row[1]",
     'description'=>"$row[2]"
   ));

}

使用此方法,响应中现在可以使用数据库表中的正确值。

答案 1 :(得分:0)

如果这是我的任务,我会:

  1. 不会在响应中发送完整的错误消息(我将假设您仅包含此详细信息以表明您已执行基本调试)。
  2. 使用面向对象的语法,因为它更简短。
  3. 使用fetch_all()是因为您只是将结果集数组转换为关联数组的数组以在另一层进行处理。

来自the manual

  

由于mysqli_fetch_all()以单个数组的形式返回所有行   步骤,它可能比某些类似功能消耗更多的内存,例如   mysqli_fetch_array(),一次仅从   结果集。此外,如果您需要遍历结果集,则可以   将需要一个循环结构,这将进一步影响性能。   由于这些原因,mysqli_fetch_all()仅应用于那些   提取的结果集将被发送到另一层的情况   进行处理。

推荐代码:

if (!$con = new mysqli($servername, $username, $password, $db_name)) {
    $response = "Database Connection Error"; // $con->connect_error
} elseif (!$result = $con->query("SELECT * FROM `Item`")) {
    $response = "Query Syntax Error";  // check $con->error; because your query failed
} else {
    $response = $con->fetch_all($result, MYSQLI_ASSOC);
}
echo json_encode(["result" => $response]);

*请注意,当结果集中没有行时,fetch_all()返回一个空数组。

此代码段不仅会在发生错误的情况下返回信息,而且简洁明了,它始终会返回result键的值,而且非常灵活-无论您的Item表是否获得收益/ losses列,它不会中断,所有内容都会返回。

无循环,无array_push();完全动态且干净的结果集包装。