0

我正在将信息从 Android 平板电脑发送到 SQL Server。我正在使用 PHP 制作的 Web 服务执行此操作,以 JSON 格式在平板电脑中发送信息。它工作正常,但我有一个问题。看,JSON 中的元素之一就是数组本身。该数组可能有多个条目,也可能只有一个条目。我不确定你是否能理解我在说什么,但这里有一个例子:

<plant>
  <inspection>
    <problem>
      <id></id>
      <category></category>
      <description></description>
    </problem>
    <problem>
      <id></id>
      <category></category>
      <description></description>
    </problem>
  </inspection>
</plant>

在上面的这个例子中,代码运行良好。如您所见,在此示例中,检查有两个问题。如果有两个或更多问题,它工作正常。但是,当它只是一个问题时,JSON 不会将它写为数组,并且我在我的 Web 服务中读取它时遇到问题。这是我用来将数据转换为 JSON 的 Java 代码:

                JSONObject holder = new JSONObject();
                JSONObject plant;
                JSONObject problem;

                DatabaseHandler handler = new DatabaseHandler(getApplicationContext());
                ArrayList<Plant> plants = handler.GetAllPlants();
                Inspection inspection;
                ArrayList<Problem> problems;

                if (plants != null) {
                    for (int i = 0; i < plants.size(); i++) {
                        plant = new JSONObject();
//                      handler.SetSynced(plants.get(i));
                        plant.put("plantID", plants.get(i).getPlantID());
                        plant.put("dome", plants.get(i).getDome());
                        plant.put("potholder", plants.get(i).getPotHolder());
                        plant.put("pot", plants.get(i).getPot());

                        inspection = handler.GetInspectionSync(plants.get(i));
                        if (inspection != null) {
                            plant.put("inspectionID", inspection.getInspectionID());
                            plant.put("inspectionDate", inspection.getInspectionDate());
                        }

                        problems = handler.GetAllProblems(inspection);
                        for (int k = 0; k < problems.size(); k++) {
                            problem = new JSONObject();
                            problem.put("problemID", problems.get(k).getProblemID());
                            problem.put("categoryID", problems.get(k).getCategoryID());
                            problem.put("problem", problems.get(k).getProblem());
                            problem.put("nokernel", problems.get(k).getNoKernel());
                            plant.accumulate("problems", problem);
                        }
                        holder.accumulate("plants", plant);
                    }

我知道这很草率。该程序应该以完全不同的方式工作,但在最后一刻,用户改变了一切,我不得不即兴发挥我必须按时完成的事情。这是PHP代码:

if($conn) {
    foreach ($input['plants'] as $plant) {
        $query = 'INSERT INTO plants VALUES(' . $plant['plantID'] . ', ' . $plant['dome'] . ', ' .
                    $plant['potholder'] . ', ' . $plant['pot'] . ');';
        $params = array(1, "some data");
        $result = sqlsrv_query($conn, $query, $params);
        $query = 'INSERT INTO inspections VALUES(' . $plant['inspectionID'] . ', ' . $plant['plantID'] . ', \'' .
                    $plant['inspectionDate'] . '\');';
        $params = array(1, "some data");
        sqlsrv_query($conn, $query, $params);
        foreach($plant['problems'] as $problem) {
            $queryP = 'INSERT INTO problems VALUES(' . $problem['problemID'] . ', ' . $problem['categoryID'] . ', ' .
                        $plant['inspectionID'] . ', \'' . $problem['problem'] . '\', \'' . $problem['nokernel'] . '\');';
            fwrite($f, $queryP);
            $params = array(1, "some data");
            sqlsrv_query($conn, $queryP, $params);
        }
    }

任何帮助将不胜感激。这是我现在唯一需要解决的问题才能最终完成这个项目。

4

1 回答 1

1

也许在:

foreach($plant['problems'] as $problem) {

你可以添加这个:

if (is_assoc($plant['problems'])) {
   $plant['problems'] = array($plant['problems']);
}

这在其他地方:is_assoc 函数

function is_assoc($array) {
  return (bool)count(array_filter(array_keys($array), 'is_string'));
}
于 2013-05-29T14:20:09.827 回答