如何从json格式的php中获取数据库中的所有项目?

时间:2015-10-08 19:03:08

标签: php mysql json

我是php开发的新手。

如何显示从数据库中提取的多个json对象?到目前为止,我正在获取单个数据。我需要以json格式在数据库中显示所有插入的数据。

当我插入第一个数据时,我得到这样的回复。如果我插入第二个数据,它应该在upload_details对象中显示第一个和第二个数据,但它只显示最后插入的数据。

{"code":200,
 "message":"The file FileUpload1444329638_li.jpg has been uploaded.",
 "upload_details":  {"desc":"hi",
                     "file_name":"abc.com\/FileUpload1444329637_li.jpg"}}

当我插入第二个数据时:

{"code":200,
"message":"The file FileUpload1444329638_li.jpg has been uploaded.",
"upload_details":  {"desc":"h2",
                    "file_name":"abc.com\/FileUpload1444329638_li.jpg"}}

这是我的代码:

 <?php 
include 'db_config.php'; //echo "hi";exit;
if($_POST['api_name']=="upload_file"){
if(!empty($_FILES["profile_pic"]["name"])){
    $fileName = time().'_'.$_FILES["profile_pic"]["name"]; 
    if (move_uploaded_file($_FILES["profile_pic"]["tmp_name"],     "uploads/".$fileName)) { 
        $sql = "Insert into file_upload(`desc`,`file_name`) values     ('".$_POST['desc']."','".$fileName."');";
        if($conn->query($sql)){ 
            $response= array('code'=>200,'message'=>"The file ". basename(    $_FILES["profile_pic"]["name"]). " has been   uploaded.",'upload_details'=>array("desc"=>$_POST['desc'],"file_name"=>$_SERVER['SERVER_NAME'].dirname($_SERVER['SCRIPT_NAME']).$fileName));
//print_r($response);exit;
        }else{
            $response= array('code'=>500,'message'=>"Error in uploading file");
        }
    } else {
        $response= array('code'=>500,'message'=>"Error in uploading file");
    }
}else{
    $response= array('code'=>500,'message'=>"Error in uploading file");
}
}elseif ($_POST['api_name']=="get_files"){
$response['code']=200;
$response['file_lists'] = array();
$res = $conn->query("select * from file_upload");
while($row = $res->fetch_object()){
    array_push($response['file_lists'],array('desc'=>$row-   >desc,'file_path'=>$_SERVER['SERVER_NAME'].dirname($_SERVER['SCRIPT_NAME']).$row    ->file_name));
}
}
echo json_encode($response);exit;   

我希望得到响应作为所有插入表中的数据,如:

{"code":200,
 "message":"The file has been uploaded.",
 "upload_details":  {"desc":"hi",
                  " file_name":"abc.com\/FileUpload1444329637_li.jpg"},

{"desc":"hi2",
 "file_name":"abc.com\/FileUpload1444329638_li.jpg"}
}

1 个答案:

答案 0 :(得分:4)

首先,您的脚本目前只能访问为该POST插入的数据。您的代码根本不会查询file_upload表中当前存在的所有记录。如果没有这个,我不知道你如何期望这些其他记录在回复中被神奇地返回。

其次,将单个插入操作绑定到插入所在表中的所有记录的完整列表是非常不典型的。这似乎是一个有问题的方法,因为当您尝试查询完整表时,减慢了将成功的插入消息返回给调用者的过程。通常,如果想要一个完整的记录列表,可能希望针对专门设计用于执行此操作的API发出GET请求,而不是发出POST(插入)来获取此信息。此外,故意设计一个随着时间的推移会越来越慢的API似乎很奇怪,因为你添加了更多的记录并且有更大的负载返回给调用者。您尝试对数据结构进行json_encode这一事实使问题更加复杂。这意味着每次调用插入API时,您的脚本实际上将继续占用越来越多的内存(因为您必须保留内存中所有记录的整个数据结构以对其进行编码)。这意味着,在服务器级别,对每次传递请求的API调用将继续占用更大比例的系统资源,这可能导致您需要扩展硬件以满足此用例。你真的,真的,真的(真的那么真的吗?)重新考虑这个要求。

第三,您有重要的SQL注入漏洞。在插入之前,您应该考虑使用预准备语句和/或清理/验证用户输入。

最后,您建议的响应格式不是有效的JSON。我认为,如果你确定你真的想要返回每个成功插入的所有记录,你会想要一个像这样的格式:

{
  "code":200,
  "message":"The file has been uploaded.",
  "upload_details": [
    {
      "desc":"hi",
      "file_name":"abc.com\/FileUpload1444329637_li.jpg"
    },
    {
      "desc":"hi2",
      "file_name":"abc.com\/FileUpload1444329638_li.jpg"}
    }
  ]
}

请注意两个返回记录周围的数组包装器。