展平PHP数组的SQL查询结果

时间:2017-04-16 18:10:57

标签: php sql arrays json

我有一个带有两列(id,name)的SQL表(模块)。现在我可以通过PHP脚本从中检索行,但我想要的是在多维数组中使用id的值作为键,并将name的值作为值。然后我希望能够将它们编码为JSON,保留键/值之间的关系。我把一些东西搞糊涂了但是它返回了null。

index.php的相关代码

        $mod1 = $core["module1"];
        $mod2 = $core["module2"];
        $modules = $db->getModulesById($mod1, $mod2);   //module names & ids

        $response["module"]["mod1"] = $modules[$mod1];
        $response["module"]["mod2"] = $modules[$mod2];
        $response["module"]["mod1name"] = $modules[$mod1]["name"];
        $response["module"]["mod2name"] = $modules[$mod2]["name"];
        echo json_encode($response);

DB_Functions.php中的函数

public function getModulesById($mod1, $mod2) {
    require_once 'include/Config.php';
    $con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
    // Check connection
    if (!$con)
      {
        die("Connection error: " . mysqli_connect_error());
      }
    // selecting database
    mysqli_select_db($con, DB_DATABASE) or die(mysqli_connect_error());

    $query = "SELECT * FROM modules WHERE id= '$mod1' OR id='$mod2'";
    $result = mysqli_query($con, $query);
    $arr = array();
    while($row = mysqli_fetch_assoc($result)) { 
        // process each row
        //each element of $arr now holds an id and name
        $arr[] = $row;
    }
    // return user details
        return mysqli_fetch_array($arr);
        close();
}

我环顾四周但是我没有“得到”查询返回的方式然后分解为新数组的键/值。如果有人能够ELI5,我会很感激。我只关心这方面,这是一个个人项目,所以我还没有关注安全问题,谢谢。

2 个答案:

答案 0 :(得分:1)

mysqli_fetch_array需要mysqli_query结果的结果。将构造的数组传递给mysqli_fetch_array()是行不通的。

如果要将行中的特定值用作其键,则无法使用任何mysqli_ *函数解决此问题。但是你可以自己构建它:

while($row = mysqli_fetch_assoc($result)) { 
    // process each row
    //each element of $arr now holds an id and name
    $arr[$row['id']] = $row;
}

mysqli_close($con);

return $arr;

您应该在返回结果之前关闭连接,在return之后的代码将不会被执行。

答案 1 :(得分:1)

你很好

public function getModulesById($mod1, $mod2) {
    require_once 'include/Config.php';
    $con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
    // Check connection
    if (!$con) {
        die("Connection error: " . mysqli_connect_error());
    }

    $query = "SELECT * FROM modules WHERE id= '$mod1' OR id='$mod2'";
    $result = mysqli_query($con, $query);
    $arr = array();
    while($row = mysqli_fetch_assoc($result)) { 
        $arr[] = $row;
    }
    // here is wrong
    //return mysqli_fetch_array($arr);

    // instead return the array youy created
    return $arr;
}

然后调用它,然后只返回json_encode返回的数组

$mod1 = $core["module1"];
$mod2 = $core["module2"];
$modules = $db->getModulesById($mod1, $mod2);   //module names & ids

$response['modules'] = $modules;

echo json_encode($response);
  

您应该使用准备好的和参数化的查询来避免像这样的SQL注入

public function getModulesById($mod1, $mod2) {
    require_once 'include/Config.php';
    $con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
    // Check connection
    if (!$con) {
        die("Connection error: " . mysqli_connect_error());
    }

    $sql = "SELECT * FROM modules WHERE id= ? OR id=?";
    $stmt = $con->prepare($sql);
    $stmt->bind_param('ii', $mod1, $mod2);
    $stmt->execute();

    $result = $stmt->get_result();

    $arr = array();
    while($row = mysqli_fetch_assoc($result)) { 
        $arr[] = $row;
    }
    // here is wrong
    //return mysqli_fetch_array($arr);

    // instead return the array youy created
    return $arr;
}