2016-12-24 9 views
1

私はこれを動作させるために数ヶ月努力してきましたが、PHPで経験したことがないので、これを最初からやっていることは大変でした。JSONデータをMySQLにインポートする

次のコードを使用して生成されたJSONファイルをMySQLにインポートしようとしていますが、エラーが発生しています。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のテーブル)にインポート

あなたは追加のデータが必要な場合は私に知らせてください...イムので、ここで失った:(

答えて

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に伝えます。引数は4種類のものであってもよい

  • I - 整数
  • D - ダブル
  • S - 文字列
  • B - BLOB

あなたは1を持っている必要がありますこれらのパラメータのそれぞれについて

どのような種類のデータを期待するかによって、SQLインジェクションのリスクを最小限に抑えます。

+0

ちょっとファイサル、私はコードを試して、 "emp"をテーブル名に置き換えました...何も起こらない、Webページが空白で、テーブルにデータが挿入されていない – Simon

+0

私のコードはローカルマシンでテストされています。あなたのデータベーススキーマを教えてください。 – Faisal

+0

ここにコードを貼り付けることはできません - pastestbin - http://pastebin.com/YV7m46ic – Simon

0

あなたはいずれかが必要「?」

2つまたは3つの変数を使用して簡単な実験を試みて、それがどのように動作するかを確認してください。次に、bindステートメントの各変数のprepareステートメントに次のように入力します。もしあなたがそれを得ると展開してください。おそらく、文字列のためのバインドではなく、倍精度のバインドに 'd'が必要です。 例:

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

表名のprepare文で変数名を使用することもできます。そのため、異なるファイルからデータをインポートし、必要に応じて表名を設定できます。

関連する問題