簡體   English   中英

將 PHP 中創建的 JSON 傳遞給 Javascript 會改變結果,我不明白為什么

[英]Passing JSON created in PHP to Javascript changes a result and I don't understand why

我在 PHP 中有一個 object,我將在同一頁面中傳遞給 Javascript。 console.log語句返回預期結果時,它似乎通過得很好,但是當我嘗試將其轉換為 Javascript 變量時,“id”被替換為 1,沒有引號,而不是預期結果。 如果我將 PHP 語句放在方括號中的 Javascript 中,“id”不會改變,但它的格式很奇怪。 我想知道為什么會發生這種情況,如果有什么我應該做的不同。

ETA:因為有些混亂:輸入是下面的“數據”。 這是通過 array_push 語句從 SQL 查詢的結果生成的。 我已經包含了 SQL 查詢的每一行的代碼和下面的 array_push 語句,但是 PHP 端似乎沒有問題。

我預期的 output 只是將數據傳輸到 javascript 端的 JSON object 和適當的變量,使用“Javascript”下提到的代碼。 相反,我得到的是這樣的內容,如console.log output:

   {
    DNB_number: "0"
    color: "darkred"
    id: 1
    name: "Anonymous"
    role: "Author"
    size: null
    type: "person"
    witness_work_id: "1467"
    witness_work_role_id: "1659"
   }

id 下的 1 是什么問題。

在嘗試將結果轉換為 javascript 變量(您在下面的 javascript 下看到的內容)之前,javascript 端沒有發生任何事情,因此我沒有什么可以告訴您的。 PHP 端發生轉換,我啟動 javascript,然后立即嘗試在 javascript 端調用它。

PHP 代碼:

$person_color = "darkred";

foreach ($person_data as $row) {
$person_id = $row["person_id"];
$type = "person";
$witness_work_role_id = $row["Witness_work_role_id"];
$witness_work_id = $row["Witness_work_id"];
$person = $row["Person_name"];
$DNB = $row["Oxford_DNB_number"];
$role = $row["Role"];
$color = $person_color;

array_push($GLOBALS['person_array'], array(
  'id'=>$person_id,
  'witness_work_role_id'=>$witness_work_role_id,
  'witness_work_id'=>$witness_work_id,
  'type'=>$type,
  'name'=>$person,
  'DNB_number'=>$DNB,
  'role'=>$role,
  'color'=>$color,
  'size'=> NULL
));
}

$jperson = json_encode($person_array);

Javascript 代碼:

person_array = <?=$jperson; ?>;

數據:

[
    {
        "id": "1",
        "witness_work_role_id": "1660",
        "witness_work_id": "1468",
        "type": "person",
        "name": "Anonymous",
        "DNB_number": "0",
        "role": "Author",
        "color": "darkred",
        "size": null
    },
    {
        "id": "152",
        "witness_work_role_id": "1573",
        "witness_work_id": "1384",
        "type": "person",
        "name": "Gilbert Banester",
        "DNB_number": "0",
        "role": "Author",
        "color": "darkred",
        "size": null
    },
    {
        "id": "153",
        "witness_work_role_id": "1574",
        "witness_work_id": "1385",
        "type": "person",
        "name": "Elizabeth Plantagenet (Elizabeth of York)",
        "DNB_number": "8635",
        "role": "Author",
        "color": "darkred",
        "size": null
    },
    {
        "id": "3",
        "witness_work_role_id": "1642",
        "witness_work_id": "1451",
        "type": "person",
        "name": "Geoffrey Chaucer",
        "DNB_number": "5191",
        "role": "Author",
        "color": "darkred",
        "size": null
    },
    {
        "id": "7",
        "witness_work_role_id": "1643",
        "witness_work_id": "975",
        "type": "person",
        "name": "Benedict Burgh",
        "DNB_number": "3390",
        "role": "Author",
        "color": "darkred",
        "size": null
    },
    {
        "id": "5",
        "witness_work_role_id": "1659",
        "witness_work_id": "1467",
        "type": "person",
        "name": "Anonymous",
        "DNB_number": "0",
        "role": "Author",
        "color": "darkred",
        "size": null
    }
]

讓我們在一個最小的例子中解決這個問題。 根據您所說的,該變量是一個字符串(一個 int),並且該值在 memory 中是正確的。但是當您通過console.log查看該值時,您會看到一個 int 而不是一個字符串。

var test = "1";
if (typeof test == 'string') {
  console.log('yes, it is a string');
} else {
  console.log('no, it is not a string');
}

如果您將上面的內容復制/粘貼到您的 JS 控制台並運行它,您將看到消息yes, it is a string 這就證明是memory中的字符串。

測試此值的另一種方法是在您的控制台中運行test ,您應該會看到"1" output。

但是現在,當我們使用console.log檢查值時:

console.log(test)輸出1

另一個沒有變量的例子: console.log("123")輸出123 ,而不是"123"

顯然發生的事情只是console.log的產物。 有關更多示例和解釋,請參閱Javascript console.log(object) 與連接字符串 https://dmitripavlutin.com/console-log-tips/列出了更多選項。 例如,如果您創建一個包含變量的 object 和 output : console.log({test})將 output {test: "1"} ,因此您可以再次看到 test 是一個值為"1"的字符串。

暫無
暫無

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

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