2016-10-23 2 views
1
$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(); 

これを行うと、最初の行だけが追加されます。どのように複数の行を挿入するのですか?Mysqliは複数の行を挿入できません

答えて

1

を参照してください。その複数のクエリの問題を取り除くだけです。代わりに準備された文を使用する

$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"; 

あなたの現在のコードは、とにかく愚かなタイポが修正されていても、意図した通りに動作しないことに注意してください。あなたは最初のクエリだけの結果を得て、他の人に何が起こったのか分かりません。

+0

@bonitzenatorいいえ、あなたはしません。あなたが言及した両方のケースは、複数のクエリがなくても完璧になります。それがポイントです。 –

0

毎回クエリを上書きしています。 sqlを空白に設定して、毎回ループに追加してみてください。

はこれを試してみてください:

$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; 
} 
+0

うーん...私はそれを試みましたが、今私にエラーが表示されます:あなたはSQL構文に誤りがあります。あなたのMariaDBサーバーのバージョンに対応するマニュアルをチェックして、正しい構文を使用してINSERT INTOゲーム(name)VALUES( 'Team Fortress 2')INSERT INTOゲーム(name)VALU 'at line 1 – Mattimat

+0

申し訳ありません。 sqlのinsert文は、セミコロンで連結する必要があります。私は答えを編集しました。もう一度お試しください。 – useyourillusiontoo

+0

時間をかけて私を助けてくれてありがとう、本当にありがとう。私はこれを試してみよう – Mattimat

1

あなたはそのようなクエリを複数回実行する必要はありません、あなたはmulti_query()せずに、単一のクエリでそれをすべて行うことができます。あなたは別の行に値OneTwoThreeを挿入します

INSERT INTO games (name) VALUES ('One'), ('two'), ('Three') 

似たクエリを生成します。この

// Initialize the query-variable 
$sql = "INSERT INTO games (name) VALUES"; 

// Loop through results and add to the query 
foreach ($decodeall as $game) { 
    $sql .= " ('".$game['name']."'),"; 
} 

// Remove the last comma with rtrim 
$sql = rtrim($sql, ','); 

// Perform the query 
if ($conn->query($sql) === TRUE) { 
    echo "New records created successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 

このように、単一のクエリで多くの挿入を行うことができます。

あなた$game['name']変数がアポストロフィ'が含まれている場合、非常に少なくとも、あなたが$mysqli::real_escape_string()を使用する必要がありますので、準備されたステートメントは、そのの世話をしては、SQLインジェクションを防ぐ(私はあなたがのために行くお勧めしますが、このクエリはを中断します代わりに)。 How can I prevent SQL injection in PHP?

+0

これはうまくいくようです、ありがとう!しかし、アポストロフィのためにクエリが壊れてしまう。私は準備されたステートメントを使用してみて、間違いなくSQLインジェクションを読み上げます。それを指摘してくれてありがとう。 – Mattimat

関連する問題