【问题标题】:PHP How to INSERT a JSON object/array in a MySQLi DatabasePHP 如何在 MySQLi 数据库中插入 JSON 对象/数组
【发布时间】:2017-04-30 04:27:01
【问题描述】:

我有一个 json 对象,其中包含 数百个 键。这些都作为 JSON 对象存储在数组中,如下所示:

$allRows= array(
    /* ===== Task ===== */
    "Major task 1" => array(
        "major-task" => array(
            "points" => 1,
            "hours" => 1,
        ),
        "minor-task" => array(
            array(
                "points" => 4,
                "task" => "Minor task 1",
            ),
            array(
                "points" => 2,
                "task" => "Minor task 2",
            ),
            array(
                "points" => 2,
                "task" => "Minor task 3",
            ),
        )
    ),
    /* ===== Task ===== */
    "Major task 2" => array(
        "major-task" => array(
            "points" => 6,
            "hours" => 7,
        ),
        "minor-task" => array(
            array(
                "points" => 4,
                "task" => "Minor task 1",
            ),
            array(
                "points" => 1,
                "task" => "Minor task 2",
            ),
            array(
                "points" => 1,
                "task" => "Minor task 3",
            ),
        )
    ),
);

此对象中的数据并非全部格式相同,即某些Major tasks 可能有也可能没有minor task 字段等,因此循环遍历对象并手动插入每个字段是不可行的(这也是只是似乎没有必要)。

我正在尝试的当前方法:

$conn = connectToDatabase();

// Query for updating the password
$t = time();
$encodedObj = json_encode($allRows);

$statement = "INSERT INTO user_rows(username, sheet, last_update) VALUES ('$user', $encodedObj, $t)";

if ($query = $conn->prepare($statement)) {
    $query->execute();
}
else {
    $error = $conn->errno . ' ' . $conn->error;
    echo "<br><br>" . $error;
    die();
}

我希望能够将 json 数组/对象直接插入到我的数据库中,以便将其存储在一列中。

感谢任何帮助!

编辑:bind_param更新代码:

    $t = time();
    $s = json_encode($allRows);

    $statement = "INSERT INTO user_spreadsheet (username, spreadsheet, last_update) VALUES (:u, :s, :t)";

    if ($query = $conn->prepare($statement)) {
        $query->bind_param(':u', $user);
        $query->bind_param(':s', $s);
        $query->bind_param(':t', $t);
        $query->execute();
    }
    else {
        $error = $conn->errno . ' ' . $conn->error;
        echo "<br><br>" . $error;
        die();
    }


编辑 2:我也试过这段代码。这会产生 no 错误,并且查询执行没有问题,但数据实际上并未插入到表中:
    $t = time();
    $s = json_encode($allRows);

    $statement = "INSERT INTO user_spreadsheet (username, spreadsheet, last_update) VALUES (?, ?, ?)";

    if ($query = $conn->prepare($statement)) {
        $query->bind_param('sbi', $user, $s, $t);
        // $query->bind_param(':u', $user);
        // $query->bind_param(':s', $s);
        // $query->bind_param(':t', $t);
        $query->execute();
    }
    else {
        $error = $conn->errno . ' ' . $conn->error;
        echo "<br><br>" . $error;
        die();
    }
    echo "worked";
    return;

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 手动转义在这里只会令人沮丧。不要这样做。
  • 我在其他地方做这个。为简单起见,我尝试缩短查询,但我会确保在完成此操作后继续使用bind_param
  • A) 使用bind_param,就像您的生活依赖于它一样,因为它确实如此。 B) 如果您希望这样的文档在序列化时有用,请使用带有 JSON 列的 MySQL 5.7。
  • 目前我这样做(使用 db 结构中的 JSON 列)

标签: php arrays json object mysqli


【解决方案1】:

经过一段时间的代码挖掘,我找到了答案。代码块:

$t = time();
$s = json_encode($allRows);

$statement = "INSERT INTO user_spreadsheet (username, spreadsheet, last_update) VALUES (?, ?, ?)";

if ($query = $conn->prepare($statement)) {
    $query->bind_param('sbi', $user, $s, $t);
    // $query->bind_param(':u', $user);
    // $query->bind_param(':s', $s);
    // $query->bind_param(':t', $t);
    $query->execute();
}
else {
    $error = $conn->errno . ' ' . $conn->error;
    echo "<br><br>" . $error;
    die();
}
echo "worked";
return;

99% 正确。但是需要更改一行:

$query->bind_param('sbi', $user, $s, $t);

需要成为

$query->bind_param('ssi', $user, $s, $t);

因为 JSON 在编码时是一个字符串,因此需要插入到数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2013-08-24
    • 1970-01-01
    • 2018-07-03
    • 2016-07-17
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多