簡體   English   中英

將JSON數據導入MySQL

[英]Import JSON data to MySQL

我已經嘗試了幾個月才能使這個工作,但是因為我沒有經驗豐富的PHP,我沒有從頭開始做這件事。

我試圖使用下面的代碼將生成的JSON文件導入MySQL,但不斷出現錯誤,我相信JSON中的字段與導入數據不匹配...某些JSON字段未提供,因此每行都有所不同(不知道如何動態創建)。 SQL也是開放注入的,不知道如何解決這個問題?

<?php
// open mysql connection
$host = "localhost";
$username = "mysql_username";
$password = "mysql_password";
$dbname = "jsonimport";
$con = mysqli_connect($host, $username, $password, $dbname) or die('Error in Connecting: ' . mysqli_error($con));

// use prepare statement for insert query
$st = mysqli_prepare($con, 'INSERT INTO emp(x, y, z, lat, lon, id, color0, color1, color2, color3, color4, color5, tamedAtTime, tamedTime, tribe, tamer, name, baseLevel, health, stamina, oxygen, food, weight, melee, speed, tamed, experience) VALUES (?, ?, ?)');

// bind variables to insert query params
mysqli_stmt_bind_param($st, 'sss', $x, $y, $z, $lat, $lon, $id, $color0, $color1, $color2, $color3, $color4, $color5, $tamedAtTime, $tamedTime, $tribe, $tamer, $name, $baseLevel, $health, $stamina, $oxygen, $food, $weight, $melee, $speed, $tamed, $experience);

// read json file
$filename = 'data.json';
$json = file_get_contents($filename);   

//convert json object to php associative array
$data = json_decode($json, true);

// loop through the array
foreach ($data as $row) {
    // get the dino details
$x = $row['x'];
$y = $row['y'];
$z = $row['z'];
$lat = $row['lat'];
$lon = $row['lon'];
$id = $row['id'];
$color0 = $row['color0'];
$color1 = $row['color1'];
$color2 = $row['color2'];
$color3 = $row['color3'];
$color4 = $row['color4'];
$color5 = $row['color5'];
$tamedAtTime = $row['tamedAtTime'];
$tamedTime = $row['tamedTime'];
$tribe = $row['tribe'];
$tamer = $row['tamer'];
$name = $row['name'];
$baseLevel = $row['baseLevel'];
$health = $row['health'];
$stamina = $row['stamina'];
$oxygen = $row['oxygen'];
$food = $row['food'];
$weight = $row['weight'];
$melee = $row['melee'];
$speed = $row['speed'];
$tamed = $row['tamed'];
$experience = $row['experience'];

    // execute insert query
    mysqli_stmt_execute($st);
}

//close connection
mysqli_close($con);
?>

進口代碼:

{"x":205686.734375,"y":57330.2734375,"z":-9629.2021484375,"lat":57.2,"lon":75.7,"id":110197191702290902,"tamed":true,"team":1418527958,"female":true,"color0":14,"color4":14,"color5":14,"tamedAtTime":1166123.9561051205,"tamedTime":3275684.0438948795,"tribe":"DattoSSS","name":"Dattoss","imprinter":"Syn","baseLevel":196,"wildLevels":{"health":28,"stamina":29,"oxygen":31,"food":21,"weight":26,"melee":36,"speed":24},"fullLevel":216,"tamedLevels":{"health":5,"melee":15},"experience":14006.5849609375,"imprintingQuality":0.8208027482032776}

還有一種方法來解析整個JSON文件的文件夾並導入? 例如,每個文件都是ObjectName_Character_BP_C.json有沒有辦法將每個json文件中的數據發送到其同名的表中? 例如解析Angler_Character_BP_C.json,然后導入jsonimport.Angler_Character_BP_C(mysql表)

如果您需要其他數據,請告訴我...我在這里丟失了:(

您必須有一個 '?' 在bind語句中每個變量的prepare語句中。 你只有3'?',所以它不會像現在這樣工作。

嘗試使用2或3個變量進行更簡單的實驗,看看它是如何工作的。 然后在你得到它時展開。 你可能在綁定中需要'd'來表示雙打,而不是's'表示字符串。 例如;

  $st = mysqli_prepare($con, 'INSERT INTO emp (x, y, z) values (?, ? , ?);
  mysqli_stmt_bind_param($st, 'ddd', $x, $y, $z);

您還可以在prepare語句中為表名使用變量名,這樣您就可以從不同的文件導入數據並根據需要設置表名。

請嘗試使用以下代碼。 希望它能幫助您解決問題。

<?php
function pr($arr)
{
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
}

$servername = "localhost";
$username = "mysql_username";
$password = "mysql_password";
$dbname = "jsonimport";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$json = '{"0":{"x":205686.734375,"y":57330.2734375,"z":-9629.2021484375,"lat":57.2,"lon":75.7,"id":110197191702290902,"tamed":true,"team":1418527958,"female":true,"color0":14,"color4":14,"color5":14,"tamedAtTime":1166123.9561051205,"tamedTime":3275684.0438948795,"tribe":"DattoSSS","name":"Dattoss","imprinter":"Syn","baseLevel":196,"wildLevels":{"health":28,"stamina":29,"oxygen":31,"food":21,"weight":26,"melee":36,"speed":24},"fullLevel":216,"tamedLevels":{"health":5,"melee":15},"experience":14006.5849609375,"imprintingQuality":0.8208027482032776}}';

//convert json object to php associative array
$data = json_decode($json, true);

// prepare and bind
$stmt = $conn->prepare("INSERT INTO ptero_character_bp_c (`list_x`, `list_y`, `list_z`, `list_lat`, `list_lon`, `list_id`, `list_tamed`, `list_color0`, `list_color1`, `list_color2`, `list_color3`, `list_color4`, `list_color5`, `list_tamedAtTime`, `list_tamedTime`, `list_tribe`, `list_tamer`,`list_name`, `list_baseLevel`, `list_wildLevels_health`, `list_wildLevels_stamina`, `list_wildLevels_oxygen`, `list_wildLevels_food`, `list_wildLevels_weight`, `list_wildLevels_melee`, `list_wildLevels_speed`, `list_experience` ) VALUES (?, ?, ?,?,?,?,?,?,?,?,?, ?, ?,?,?,?,?,?,?,?,?, ?, ?,?,?,?,?)");
$stmt->bind_param("dddddisiiiiiiddsssiiiiiiiid", $x, $y, $z, $lat, $lon, $id, $tamed, $color0, $color1, $color2, $color3, $color4, $color5, $tamedAtTime, $tamedTime, $tribe, $tamer, $name, $baseLevel, $health, $stamina, $oxygen, $food, $weight, $melee, $speed, $experience);

// loop through the array
foreach ($data as $row) {
    // get the dino details
    $x = $row['x'];
    $y = $row['y'];
    $z = $row['z'];
    $lat = $row['lat'];
    $lon = $row['lon'];
    $id = $row['id'];
    $tamed = $row['tamed'];
    $color0 = !empty($row['color0']) ? $row['color0'] : '';
    $color1 = !empty($row['color1']) ? $row['color1'] : '';
    $color2 = !empty($row['color2']) ? $row['color2'] : '';
    $color3 = !empty($row['color3']) ? $row['color3'] : '';
    $color4 = !empty($row['color4']) ? $row['color4'] : '';
    $color5 = !empty($row['color5']) ? $row['color5'] : '';
    $tamedAtTime = $row['tamedAtTime'];
    $tamedTime = $row['tamedTime'];
    $tribe = $row['tribe'];
    $tamer = !empty($row['tamer']) ? $row['tamer'] : '';
    $name = $row['name'];
    $baseLevel = $row['baseLevel'];
    $health = $row['wildLevels']['health'];
    $stamina = $row['wildLevels']['stamina'];
    $oxygen = $row['wildLevels']['oxygen'];
    $food = $row['wildLevels']['food'];
    $weight = $row['wildLevels']['weight'];
    $melee = $row['wildLevels']['melee'];
    $speed = $row['wildLevels']['speed'];
    $experience = $row['experience'];
    // execute insert query
    $stmt->execute();
    echo "New records created successfully";
}

$stmt->close();
$conn->close();

代碼說明:

$stmt->bind_param("sss", $x, $y, $z);

此函數將參數綁定到SQL查詢,並告訴數據庫參數是什么。 “sss”參數列出了參數所包含的數據類型。 s字符告訴mysql該參數是一個字符串。

參數可以是以下四種類型之一:

  • 我 - 整數
  • d - 雙倍
  • s - 字符串
  • b - BLOB

您必須為每個參數都有一個。

通過告訴mysql期望什么類型的數據,我們將SQL注入的風險降至最低。

SQLizer執行此操作 - 只需上傳您的文件並點擊轉換。

您將收到一個帶有INSERT語句和TABLE定義的SQL文件,可以將其導入數據庫。

它也適用於CSV,TSV,XML,XLS文件。

對於長達5k行的文件,它是免費的,因此您可以隨時嘗試並查看您的使用情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM