2016-02-20 34 views
1

是否有可能從客戶端使用ajax(使用jQuery)發送JSON數據到PHP頁面並使用json_decode和所有變量完全相同的數據類型?我以爲JSON是想保留這個,但是如果你把它發送給PHP它似乎不起作用。如果它不這樣做,那麼我不知道爲什麼我會使用JSON。我可能只是使用標準的POST請求。從AJAX到PHP服務器的JSON。記住數據類型

我的問題是,我需要發送數據到PHP,它被插入到MySQL中,它需要插入正確的變量類型,但是當數據從JSON到達時,它將全部轉換爲字符串。我想我誤解了JSON的用途。最有可能的,如果有的話,任何人都可以向我解釋這一點?

這是否意味着我需要在整個Web應用程序中手動轉換PHP端的所有內容?這將是一個真正的痛苦。

// JavaScript: 

$.ajax({ 
    type: "POST", 
    url: "program.php", 

    data: { 
     posting: true, 
     json: JSON.stringify({ 
      posting: true, 
      id: 6, // should remain an integer 
     }) 
    }, 

    success: function(data) { 
     console.log(data); 
    } 
}); 


// PHP: 

if (array_key_exists("posting", $_POST)) { 
    $result = json_decode($_POST["json"]); 
    echo gettype($result->id); // string (all values in $result are strings still) 
    exit(); 
} 

編輯:我之所以很擔心變量的類型,因爲我想使用與MySQL準備好的語句和bind_param功能需要您輸入的變量類型。這是一個PHP函數,我創建來處理這對我來說:

public static function insert($query, $params) {   
    $statement = mysqli_prepare(self::$connection, $query); 
    foreach ($params as $value) { 
     switch (gettype($value)) { 
      case "boolean": 
       $value = (int) $value; 
      case "integer": 
       $statement->bind_param("i", $value); 
       break; 
      case "double": 
       $statement->bind_param("d", $value); 
       break; 
      case "string": 
       // it is ALWAYS a string even though some as suppose to be integers 
       $statement->bind_param("s", $value); 
       break; 
      default: 
       echo "error type: " . gettype($value); 
       return; 
     } 
    } 

    $statement->execute(); 
    $statement->fetch(); 
    $result = $statement->get_result(); 
    $statement->close(); 
    return $result; 
} 
+0

幾個問題... 1.它是一個字符串如何防止插入/更新? 2.'POST'請求​​也是在$ _POST'數組中的字符串中進行的,那麼這將如何改變呢? – Jon

+0

@Jon那麼我需要使用準備好的語句,所以我只是總是使用「bind_param」並將所有內容指定爲字符串? $ statement-> bind_param(「s」,$ value); – Mayron

+0

@Jon我在帖子中增加了更多內容。希望這能回答你的問題。我對客戶端的任何JSON相關內容的需求感到困惑,因爲每次我在網上查看時,大家都說只是使用post請求,所以我不知道。 – Mayron

回答

-1

如果你仍然陷入這個我已經做到了覆蓋HTML/JavaScript的使用jQuery和PHP頁面(記錄數據一個基本的例子到一個文本文件)

JavaScript代碼 - 的Index.html

<a href="#" class="button">Submit</a> 


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
<script> 

    $(".button").on("click", function(){ 
     ajaxSubmit(); 
    }); 

    var ajaxSubmit = function(){ 

     var obj = {}; 

     obj['foo'] = {}; 
     obj['foo']['type'] = 'integer'; 
     obj['foo']['value'] = 1; 

     obj['bar'] = {}; 
     obj['bar']['type'] = 'string'; 
     obj['bar']['value'] = 'hello'; 

     sendData = JSON.stringify(obj); 

     $.ajax({ 
      type: "POST", 
      url: "program.php", 
      data: {'json': sendData}, 

      success: function(data) { 
       console.log(data); 
      } 
     }); 

    }; 

</script> 

PHP代碼 - program.php

<?php 

    $data = $_REQUEST; 

    $obj = json_decode($data['json']); 

    foreach ($obj as $var) { 

     switch ($var->type) { 
      case 'integer': 
       fileWrite('Integer: '.$var->value); 
       break; 
      case 'string': 
       fileWrite('String: '.$var->value); 
       break; 
     } 

    } 

    function fileWrite ($string) { 

     if (is_array($string)){ 
      $string = 'Array: '.print_r($string, true); 
     } 

     if(is_object($string)) { 
      $string = 'Object: '.print_r($string, true); 

     } 

     $fp = fopen('output.txt', 'a'); 
     fwrite($fp, $string."\n"); 
     fclose($fp); 

    } 

?> 
+0

我實際上並沒有使用表格。不過謝謝。 – Mayron

+0

我做了一個更新,在我看來,它應該工作。也許我誤解了你的要求? – Mark

+0

@Mark您可能需要重讀該問題/標題。 – Jon

1

讓我們從JSON開發人員在其規範中未提及的內容開始:JSON實際上是在字符串上下文中使用時的JSON。

在這裏和我一起邏輯思考。你將如何傳輸數據類型信息?理性的事情是以某種方式標記它。那麼,JavaScript雖然可以保留你的不那麼JSON,但是仍然是一個對象。但由於$_POST只使用應用程序/ x-www-form-urlencodedmultipart/form-data,所以無論如何你最終會得到字符串或二進制數據。

但在這種情況下這是不可能保存和傳輸您的 JSON裏面的數據類型,直到你直接指定數據類型的JSON,因爲這:

{"name": "Food", "value": "Banana", "type": "string"}, 
{"name": "Drink", "value": "Beer", "type": "string"}, 
{"name": "Count", "value": "42", "type": "int"} 

然後在PHP解析它。或者直接在bind_param中輸入所需的數據類型,並在解碼JSON後使用它。

哦,是的,stringify不知何故不言自明:

的JSON。stringify()方法將JavaScript值轉換爲JSON 字符串,如果指定了替換程序函數,則可以選擇替換值,或者如果指定替換程序數組,則可以選擇僅包含指定的屬性。

進一步閱讀:

+0

謝謝,這有幫助。我嘗試使用「contentType:」application/json編輯ajax函數; charset = utf-8「,」但即使我認爲它也沒有改變任何東西。我會嘗試手動添加數據類型。 – Mayron