【发布时间】:2020-01-28 08:01:22
【问题描述】:
我目前正在尝试使用 php 和 mysqli 将有关用户的一些元数据发布到 mysql db。我检索了一个数组,其中的键/值对对应于它们应该存储在数据库中的键/值对。
function insert_metadata_to_db ($user_id, $metaData) {
$conn = mysqli_connect("127.0.0.1", "root", "", "test");
foreach($metaData as $key => $value) {
$metaDataSql .= "insert into usermeta (user_id, meta_key, meta_value) values ($user_id, '$key', '$value');";
}
if(!$conn->multi_query($metaDataSql)) {
echo("Failed to execute the queries." . $conn->error);
}
mysqli_close($conn);
}
我的下一步是防止 SQL 注入。我已经尝试过,但失败了,用准备好的语句在上面制作这个方法。这是我的尝试:
function insert_metadata_to_db ($user_id, $metaData) {
$conn = mysqli_connect("127.0.0.1", "root", "", "test");
foreach($metaData as $key => $value) {
$metaDataSql .= $conn->prepare("insert into usermeta (user_id, meta_key, meta_value) values (?, '?', '?');");
$metaDataSql->bind_param("iss", $user_id, $key, $value);
}
if(!$conn->multi_query($metaDataSql)) {
echo("Failed to execute the queries." . $conn->error);
}
mysqli_close($conn);
}
甚至可以这样做吗?如果不是,那么在防止 SQL 注入的同时处理对数据库的多次插入的最佳方法是什么。
【问题讨论】:
-
为什么要多查询?只需执行与记录一样多的查询。甚至
INSERT INTO VALUES (), (), ()。此外,占位符不得用引号引起来,请重读手册。 -
我想让它成为一个多查询,这样我就可以避免对数据库进行 10 多个单独的插入查询。我在想这会提高性能/减少开销。还可以在将来更轻松地添加更多元数据,而无需编辑此方法 - 并且只需编辑数组。
-
您仍然有 10 多个查询,但现在只有一个字符串,它们仍然会被一一执行。