2016-12-24 7 views
1

Я пытаюсь в течение нескольких месяцев, чтобы это сработало, но поскольку я не испытывал этого с PHP, мне не удавалось делать это с нуля.Импорт данных JSON в MySQL

Я пытаюсь импортировать сгенерированный файл JSON в MySQL с приведенным ниже кодом, но продолжать получать ошибки, я верю, что там, где поля из JSON arent соответствуют данным импорта ... некоторые из полей JSON arent предоставлены таким образом каждая строка меняется (не уверен, как динамически создавать это). Также 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 таблицы)

пожалуйста, дайте мне знать, если вам нужны дополнительные данные ... им так потеряли здесь :(

ответ

0

Пожалуйста, используйте этот ниже код. Надеюсь, это поможет вам решить вашу проблему.

<?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, что параметр является строкой.

Аргумент может быть одним из четырех типов:

  • я - целое число
  • д - двойной
  • s - строка
  • б - BLOB

Вы должны иметь один из них для каждого параметра.

Сообщая mysql, какой тип данных ожидать, мы минимизируем риск инъекций SQL.

+0

Эй, Фейсал, я попробовал код, заменил «emp» на имя таблицы ...но ничего не происходит, веб-страница пуста и данные не помещаются в таблицу – Simon

+0

Мой код протестирован на локальном компьютере. Скажите, пожалуйста, мою схему базы данных? – Faisal

+0

не могу вставить код здесь, проверить pastebin - http://pastebin.com/YV7m46ic – Simon

0

Вы нуждаетесь «?» в инструкции make для каждой переменной в инструкции привязки. У вас есть только 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); 

Вы также можете использовать имена переменных в инструкции подготовки для имени таблицы, чтобы вы могли импортировать данные из разных файлов и задавать имя таблицы по мере необходимости.