Mysqli可以';t插入多行 $allgames=文件获取内容(“https://steamspy.com/api.php?request=all"); $decodeall=json_decode($allgames,true); foreach($decodeall作为$game){ $sql=“插入游戏(名称) 值(“{$game['name']}”)”; } 如果($conn->multi_query($sql)==TRUE){ 回显“成功创建新记录”; }否则{ echo“Error:”.$sql.“”$conn->Error; } $conn->close();
当我这样做时,只会添加第一行。如何插入多行 每次都会覆盖查询。尝试将sql设置为空,然后每次在循环中追加它 试试这个:Mysqli可以';t插入多行 $allgames=文件获取内容(“https://steamspy.com/api.php?request=all"); $decodeall=json_decode($allgames,true); foreach($decodeall作为$game){ $sql=“插入游戏(名称) 值(“{$game['name']}”)”; } 如果($conn->multi_query($sql)==TRUE){ 回显“成功创建新记录”; }否则{ echo“Error:”.$sql.“”$conn->Error; } $conn->close();,php,sql,mysqli,Php,Sql,Mysqli,当我这样做时,只会添加第一行。如何插入多行 每次都会覆盖查询。尝试将sql设置为空,然后每次在循环中追加它 试试这个: $allgames = file_get_contents("https://steamspy.com/api.php?request=all"); $decodeall = json_decode($allgames, true); foreach($decodeall as $game) { $sql = "INSERT INTO games (name) VALUE
$allgames = file_get_contents("https://steamspy.com/api.php?request=all");
$decodeall = json_decode($allgames, true);
foreach($decodeall as $game) {
$sql = "INSERT INTO games (name)
VALUES ('{$game['name']}')";
}
if ($conn->multi_query($sql) === TRUE) {
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
$sql=array();
foreach($decodeall作为$game){
$sql[]=“插入游戏(名称)值(“{$game['name']}”)”;
}
$sqlInserts=内爆(“;”,$sql);
if($conn->multi_query($sqlInserts)==TRUE){
回显“成功创建新记录”;
}否则{
echo“Error:”.$sql.“
”$conn->Error;
}
您不需要像那样多次执行查询,您可以在一次查询中完成所有操作,而无需使用multi\u query()
。您可以使用一个查询执行多个插入,如下所示
$sql = array();
foreach($decodeall as $game) {
$sql[] = "INSERT INTO games (name) VALUES ('{$game['name']}')";
}
$sqlInserts = implode(';', $sql);
if ($conn->multi_query($sqlInserts) === TRUE) {
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
这将把值One
、Two
和Two
插入到单独的行中
如果$game['name']
变量包含撇号'
,则此查询将中断,因此至少您应该使用,尽管准备好的语句会处理该并阻止SQL注入(因此我建议您改为使用该语句)。看
使用事先准备好的陈述-更好的解决方案执行查询的首选方法是使用准备好的语句 使用
array\u column()
获取所有列,并在调用execute方法时循环数组,直到完成
INSERT INTO games (name) VALUES ('One'), ('two'), ('Three')
把那个多查询的东西扔掉。使用预先准备好的语句
$stmt = $conn->prepare("INSERT INTO games (name) VALUES (?)");
$stmt->bind_param("s", $name);
foreach (array_column($decode, "name") as $name) {
$stmt->execute();
}
请注意,您当前使用multi_查询的代码无论如何都无法正常工作,即使修复了那个愚蠢的拼写错误。您将只得到第一次查询的结果,而不知道其他所有查询的结果。Hmm。。。我试过了,但现在它给了我一个错误:您的SQL语法有一个错误;请查看与您的MariaDB服务器版本对应的手册,以了解在第1行sorry,my bad处使用“插入游戏(名称)值('Team Fortress 2')插入游戏(名称)值”的正确语法。sql insert语句需要用分号连接。我已经编辑了答案,请再试一次。非常感谢您花时间帮助我,我真的很感激。我会试试的。这似乎很有效,谢谢!但查询因撇号“”而中断。我将尝试使用预先准备好的语句,并且一定会阅读SQL注入。谢谢你指出这点。@bonitzenator不,你不需要。您提到的这两种情况都不需要多次查询,非常完美。这就是重点。
$stmt = $conn->prepare("INSERT INTO games (name) VALUES (?)");
$stmt->bind_param("s", $name);
foreach (array_column($decode, "name") as $name) {
$stmt->execute();
}
$stmt = $conn->prepare("INSERT INTO games (name) VALUES (?)");
$stmt->bind_param("s", $name);
foreach($decodeall as $game) {
$name = $game['name'];
$stmt->execute();
}
echo "New records created successfully";