繁体   English   中英

展平PHP数组的SQL查询结果

[英]Flattening a SQL query result for PHP array

我有一个带有两列(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,我将不胜感激。 我只关心这方面,这是一个个人项目,因此,我现在还没有关注安全问题。

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将不被执行。

你在那里很好

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM