multi_query($sql)==TRUE){ 回显“成功创建新记录”; }否则{ echo“Error:”.$sql.“”$conn->Error; } $conn->close();,php,sql,mysqli,Php,Sql,Mysqli" /> multi_query($sql)==TRUE){ 回显“成功创建新记录”; }否则{ echo“Error:”.$sql.“”$conn->Error; } $conn->close();,php,sql,mysqli,Php,Sql,Mysqli" />

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();

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

当我这样做时,只会添加第一行。如何插入多行

每次都会覆盖查询。尝试将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)
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";