所以我有一個表單,我可以在其中創建多個相同型別的 datalist-text-inputs,稍后(onclick)在提交之前將其放入不可見的輸入中。
這些 datalist-text-inputs 是在加載時創建的,因此我可以使用具有相同功能的“ ”按鈕添加更多內容。
這些選項是從我的 PHP 資料庫中匯入的,并且運行良好。但突然它停止作業,我不知道為什么。我已經嘗試了一千件事,但無法弄清楚。
我對 PHP 很陌生。我認為問題與 JSON.parse() 有關,因為代碼在該行中斷。
腳本.js
var ajax = new XMLHttpRequest();
ajax.open("GET", "fetch data.php", true);
ajax.send();
ajax.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
var data = JSON.parse(this.responseText);
var html = "";
for (var a = 0; a < data.length; a ) {
var firstName = data[a].name;
html = "<option value='" firstName "'></option>";
};
document.getElementById(type "list" addnumber).innerHTML = html;
};
};
type "list" addnumber輸入文本框的名稱。Type是一個引數,addnumber是一個變數/整數。
獲取資料.php
<?php
$host = "localhost"; $user = "root"; $pass = ""; $db = "collection";
$conn = mysqli_connect($host, $user, $pass, $db);
$result = mysqli_query($conn, 'SELECT name FROM musicians ORDER BY name');
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
$data[]=$row;
};
echo json_encode($data);
?>
另外,我可能會補充一點,此函式在同一頁面的三個位置創建物件,但該值被添加/移動到三個不同的不可見輸入。
uj5u.com熱心網友回復:
根據您看到的例外,即:
JsonException: Malformed UTF-8 characters, possibly incorrectly encoded in C:\wamp64\www\collection\fetch data.php on line <i>11</i>
我的猜測是您正在閱讀的資料沒有以json_encode預期的方式編碼。
最簡單(不推薦)的方法是傳入JSON_INVALID_UTF8_IGNOREorJSON_INVALID_UTF8_SUBSTITUTE標志,這將導致錯誤資料被靜默跳過(或替換為 unicode REPLACEMENT CHARACTER \0xfffd),而不是將其視為錯誤。請參閱檔案json_encode和預定義的 JSON 常量。
但是,如果您想找到問題的根源,以便將所有資料正確編碼為 JSON,請執行以下操作:
您可以嘗試通過使用 PHP 的mysqli_set_charset函式設定mysql 字符集來強制編碼,例如:
<?php
$host = "localhost"; $user = "root"; $pass = ""; $db = "collection";
$conn = mysqli_connect($host, $user, $pass, $db);
if (!mysqli_set_charset($conn, 'utf8')) {
throw new \Exception("failed to set mysql charset");
}
$result = mysqli_query($conn, 'SELECT name FROM musicians ORDER BY name');
...
?>
根據我的經驗,最常見的字符集是utf8, utf8mb4。如果您知道您的資料包含其他特定字符集,則可能需要先將其轉換為 utf8,然后再嘗試使用 PHP 的mb_convert_encoding函式將其編碼為 JSON。
最后,可能是您的應用程式中較早出現問題,導致資料錯誤(混合編碼)。如果是這種情況,您需要逐行檢測錯誤資料,可能會在單獨的錯誤報告中輸出引發例外的位置,并手動更正該資料的編碼。這可以通過確保資料在到達您的資料庫之前經過驗證并正確編碼為 utf8 來防止。請注意,確保為所有連接正確設定 mysql 字符集也可能是此解決方案的一部分。您可能希望將資料庫配置為自動執行此操作。
檢測和記錄示例:
<?php
$host = "localhost"; $user = "root"; $pass = ""; $db = "collection";
$conn = mysqli_connect($host, $user, $pass, $db);
if (!mysqli_set_charset($conn, 'utf8')) {
throw new \Exception("failed to set mysql charset");
}
$result = mysqli_query($conn, 'SELECT name FROM musicians ORDER BY name');
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
try {
// detect rows which cannot be encoded
$discard = json_encode($row, JSON_THROW_ON_ERROR);
} catch (\JsonException $e) {
// keep track of failed rows so we can correct them later
my_custom_logging_function($row);
// and skip the row so we don't try to encode it later
continue;
}
$data[]=$row;
};
echo json_encode($data, JSON_THROW_ON_ERROR);
?>
uj5u.com熱心網友回復:
非常感謝@willpalmer。今天下午晚些時候我會試試這些東西。
有些事情仍然困擾著我。
- 我的代碼實際上有效,但它停止了。我認為這可能是在我將資料庫從一臺計算機移動到另一臺計算機之后發生的(但我沒有注意到)。這可能與此有關,但...
- 同樣的事情適用于其他文本輸入。我不能使用相同的東西的原因是因為這些框是在索引檔案中創建的,上面的文本框是用 JS 創建的。此代碼有效...
索引.php
<select name="artist">
<option value="none">artist</option>
<?php
$host = "localhost"; $user = "root"; $pass = ""; $db = "collection";
$conn = new mysqli($host, $user, $pass, $db);
$sql = "SELECT artist FROM artists ORDER BY artist";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
echo "<option value='" . $row['artist'] ."'>" . $row['artist'] ."</option>";
};
?>
</select>
uj5u.com熱心網友回復:
好的,只需更改"fetch data.php"為"data.php"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489592.html
標籤:javascript php 阿贾克斯
