2017-06-13 41 views
0

新手。我搜查了搜索,仍然無知。將JSON字符串傳遞給PHP,並推送到這裏的菜單

我正在爲google地圖API製作標記/ infowindows數組。目前,我已經成功地從一個exrternal JSON文件加載我的標記。 JSON數據是這樣的:https://codedump.io/share/5XUwRzOFvREi/1/json-array 途徑./json/Markers

{"Markers": [ 
{ 
    "title" : "Meow Monestary", 
    "position" : { 
    "lat" : 40.5178, 
    "lng" : -122.6438 
    }, 
    "posterContact" : { 
    "name" : "Mr Meowser", 
    "email" : "[email protected]", 
    "phone" : "(555)-202-3040", 
    "private" : true 
    }, 
    "type" : "myResidence", 
    "ownerContact" : { 
    "name" : false, 
    "email" : false, 
    "phone" : false, 
    "private" : true 
    }, 
    "description" : "Meow meow purrrrr. Dogs are not my favorite but they are my second favorite.", 
    "private" : true 
}, 

我希望用戶能夠填寫包含此數據的形式,然後到新的標記物推入JSON陣列。到目前爲止,我已經收集的形式,創建了一個Javascript對象,並轉換成JSON字符串像這樣...

function submitForm(){ 
     //place form data into array 
     var formData = $("#shelterForm").serializeArray(); 

     //build the javascript object using the values in the array 
     var shelter = { 
      title:formData[0].value, 
      position:{ 
      lat:formData[1].value, 
      lng:formData[2].value 
      }, 
      posterContact:{ 
      name:formData[3].value, 
      email:formData[4].value, 
      phone:formData[5].value, 
      private:formData[6].value 
      }, 
      type:formData[7].value, 
      ownerContact:{ 
      name:formData[8].value, 
      email:formData[9].value, 
      phone:formData[10].value, 
      private:formData[11].value 
      }, 
      description:formData[12].value, 
      private:formData[13].value 
     }; 
    shelterString = JSON.stringify(shelter); 
} 

我肯定有這樣做的更簡單的方法。如果你想進入這個......很棒!我的主要問題是,現在我有我的JSON字符串,但不知道如何將它推入我的數組。我想也許傳遞字符串到PHP並寫入文件,或者可能ajax允許這?我不知道。我覺得很愚蠢。

回答

1

無論您是否使用AJAX,您仍然需要服務器上的腳本來保存數據服務器端。做一個AJAX請求比普通表單POST更先進,所以我建議初學者不要這樣做。

一旦數據發送到PHP,您將需要存儲它。最常用的方法是使用數據庫,通常是MySQL。當表單發佈後,您將從$ _POST變量中獲取數據,並將其作爲新行存儲在數據庫中。然後,對於JSON文件,而不是使用靜態文件,您可以將映射指向外部JSON文件的PHP腳本。然後該腳本將查詢數據庫,將數據組裝成關聯數組,其代碼非常類似於您的javascript submitForm()函數,然後致電json_encode()將該數組轉換爲JSON字符串,然後再打印出來。在客戶端,你不再需要你的submitForm()函數。

如果您不想搞亂數據庫,可以在服務器上使用常規文件並讓PHP腳本修改該文件。但是,如果你的腳本有錯誤或服務器在寫入文件時失去了能量,那麼你可能會丟失所有的數據,所以如果你有重要數據的話,我建議你也設置一個日常的備份。文件。此外,您必須採取特別的預防措施,不允許兩個不同的人同時提交更新,因爲有兩個進程同時寫入同一文件會導致垃圾數據。數據庫的構建能夠更好地適應這些開箱即用的問題。

如果你想要去文件路徑,你可能仍然希望將JSON的創建移動到PHP中。您的JavaScript依賴於表單元素的確切標識,並且很難閱讀和維護。在PHP中,你會碰到這樣的:

$shelter = [ 
     'title' => $_POST['shelter_title'], 
     'position' => [ 
     'lat' => $_POST['shelter_latitude'], 
     'lng' => $_POST['shelter_latitude'] 
     ], 

的$ _ POST鍵的名字從你的表單元素,這使得它更易於維護比使用索引號,這將對如果你加入到重新編號屬性或刪除表單域。

然後,你就需要鎖定JSON文件,以確保兩個進程不會試圖在同一時間更新它

if (!flock($json_filename,LOCK_EX)) { 
    die('We are having trouble updating our records. Please try again later.'); 
} 
//Now nobody else can write to the file until the script finishes or calls flock($json_filename, LOCK_UN) to release the lock 

然後,我們加載舊的JSON文件,並對其進行更新與我們的新紀錄:

$old_json = file_get_contents($json_filename); //get JSON data as string 
$old_data = json_decode($old_json); //convert JSON data into PHP array 
$new_data = array_push($old_data['Markers'], $shelter); //add the new shelter to PHP array 
$new_json = json_encode($new_data); //convert the PHP array back to a JSON string 
file_put_contents($json_filename, $new_json); //write the string to the file 
//json file is updated, so now you can display a message, or redirect the user to a new page with header('Location: foo') 

我沒有測試過這個代碼,所以在嘗試這個之前備份你的JSON。

+0

好的,謝謝,這是一些很好的建議。我正在研究mySQL以更好地理解如何使用數據庫。我認爲這聽起來值得。 – DMrFrost

1

你應該在這裏做什麼,是有一個本地json文件,谷歌地圖api將被指向,並添加到該文件使用的HTML形式與PHP的行動,你會攝取表單數據和將它添加到json文件。

<form action="addJson.php" method="post"> 

addJson.php(得到的總體思路)

<?php 
$localFile = 'json/Markers.json'; 
$data = [$_POST]; // reformat if required 
$existing = json_decode(file_get_contents($localFile)); 
$all = array_merge($existing,$data); 
file_put_contents($localFile,json_encode($all)); 

echo 'thanks for addition'; 
?> 

並且可以完全忽略的JavaScript submitForm功能。