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