mar*_*rky 5 javascript php mysql jquery json
我正在将表数据保存到 json 对象。表格数据来自表格单元格中的 txt 输入和文本区域。
我遇到了保存文本区域数据的 JSON 元素中 CR/LF 字符的问题。JSON 数据可以很好地保存到数据库中,但是当我将其传递回使用该数据填充表的 jQuery 函数时,我得到以下结果:
SyntaxError: JSON.parse: bad control character in string literal at line 1 column 67 of the JSON data
var array = JSON.parse(notes),
Run Code Online (Sandbox Code Playgroud)
在控制台中。
我将 JSON 数据放入 Notepad++ 中,打开“显示所有字符”,CR/LF 位于第 67 列。
以下是我正在使用的 JSON 数据示例:
[["","","",""],["","9/23/14","",""],["","30789 detail, x_vendor_no**CR/LF HERE**
20597 header","",""],["","99 del invalid x_vendor_no","",""],["","30780","",""],["","","",""],["","","",""],["","","",""]]
Run Code Online (Sandbox Code Playgroud)
有没有办法允许数据中包含 CR/LF?
UPDATE 11684 使用替换来删除 CRLF 的 \r 部分的建议将不起作用。原因如下:
以下是使用 JSON 数据的完整函数:( 已更新以与下面的更新 #2 代码配合使用)
function PopulateTaskTableWithNotes(tableID,notesArray) {
// JSON parse removed per answer suggestion
var r, c, note;
for (r = 0; r < notesArray.length; ++r) {
for (c = 0; c < notesArray[r].length; ++c) {
note = notesArray[r][c];
$('#' + tableID + ' tr:nth-child(' + (r + 1) + ') td:nth-child(' + (c + 1) + ')').children(':first-child').val(note);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然在尝试解析 JSON 数据的线路上收到错误。替换函数显然无法“查找”数组元素中的字符。
更新 #2 以下是我创建数组的方法:
var siteID = $('#ddlUserSites option:selected').val(),
numRows = $('#' + tableID + ' tr').length,
numCols = $('#' + tableID).find('tr:first th').length,
notesArray = new Array(numRows),
rowNum = 1,
note = '',
colNum;
while (rowNum <= numRows) {
notesArray[rowNum] = new Array(numCols);
// Reset colNum for next row iteration
colNum = 1;
while (colNum <= numCols) {
note = '';
if ($('#' + tableID + ' tr:nth-child(' + rowNum + ') td:nth-child(' + colNum + ')').children(':first-child').is('input,textarea')) {
note = $('#' + tableID + ' tr:nth-child(' + rowNum + ') td:nth-child(' + colNum + ')').children(':first-child').val();
}
notesArray[rowNum][colNum] = note;
//console.log('Note for rowNum ' + rowNum + ', colNum ' + colNum + ': ' + note);
colNum++;
}
// Remove first element in current row array
notesArray[rowNum].shift();
rowNum++;
}
// Remove first element in array
notesArray.shift();
JSON.stringify(notesArray); // Added per an answer here
console.log('Final notesArray: ' + $.toJSON(notesArray));
$.ajax({
data: {saveTaskNotes: 'true', userID:userID, siteID:siteID, taskTable:tableID, notes:notesArray},
success: function(data) {
console.log('Save task notes data: ' + data);
}
});
Run Code Online (Sandbox Code Playgroud)
“Final NotesArray”控制台输出看起来不错,但现在,添加了 stringify,上面的函数 (PopulateTaskTableWithNotes) 控制台输出显示它正在将数组中的每个字符作为单独的元素读取!
也许这也会有所帮助,就创建和读取函数之间的数据发生的情况而言:数组被保存到单个 MySQL 数据库字段,然后通过 $.ajax() (在两端)检索 PopulateTable 函数。
话虽如此,我是否需要看看我在 PHP 代码中对数组做了什么?
更新 #3 下面是接收数据并写入 MySQL 数据库的 PHP 函数:
function SaveTaskNotes($userID,$siteID,$taskTable,$notes) {
$notes = json_encode($notes);
$insertUpdateTaskNotesResult = '';
$insertTaskNotes = "INSERT INTO userProgress (userProgressUserID,userProgressSiteID,userProgressNotesTable,userProgressNotes) values ($userID,$siteID,'" . $taskTable . "','" . $notes . "')";
$log->lwrite('$insertTaskNotes: ' . $insertTaskNotes);
$resultInsertTaskNotes = @mysqli_query($dbc,$insertTaskNotes);
if ($resultInsertTaskNotes) {
$insertUpdateTaskNotesResult = 'insertTaskNotesSuccess';
} else {
if (mysqli_error($dbc) != '') {
$log->lwrite('INSERT TASK NOTES: An error occurred while attempting to add the task notes. Query: ' . $insertTaskNotes . ', mysqli_error: ' . mysqli_error($dbc));
}
$insertUpdateTaskNotesResult = 'insertTaskNotesFail';
}
echo $insertUpdateTaskNotesResult;
}
Run Code Online (Sandbox Code Playgroud)
这是从数据库获取数据并将其发送到上面的 $.ajax 函数的函数:
function GetUserTaskNotes($userID,$siteID,$taskTableID) {
$queryGetUserTaskNotes = "SELECT userProgressNotes FROM userProgress WHERE userProgressUserID = $userID AND userProgressSiteID = $siteID AND userProgressNotesTable = '" . $taskTableID . "'";
$log->lwrite('$queryGetUserTaskNotes: ' . $queryGetUserTaskNotes);
$resultGetUserTaskNotes = @mysqli_query($dbc,$queryGetUserTaskNotes);
if ($resultGetUserTaskNotes) {
$taskNotes = mysqli_fetch_assoc($resultGetUserTaskNotes);
$log->lwrite('Retrieved $taskNotes[\'userProgressNotes\']: ' . $taskNotes['userProgressNotes']);
echo $taskNotes['userProgressNotes'];
} else {
if (mysqli_error($dbc) != '') {
$log->lwrite('GET TASK NOTES: An error occurred while attempting to retrieve the task notes. Query: ' . $queryGetUserTaskNotes . ', mysqli_error: ' . mysqli_error($dbc));
}
echo 'getTaskNotesFail';
}
}
Run Code Online (Sandbox Code Playgroud)
在 save 和 get 函数中,$log 输出显示数组从未改变(使用上面的 js/php 代码),并将数组粘贴到 notepad++ 中显示 CR/LF 始终存在。
不要使用JSON.parse,数据已经是 JSON 并且 Javascript 可以使用它。
你只在传递字符串时需要它,想象一下JSON.parse()就像string2json().
我认为这可能已经解决了您的问题,我从未遇到过新行字符的问题。
正如路易斯所说,问题不是你的客户端(Javascript、jQuery),而是JSON.parse提供的站点是错误的。
PHP 示例:
<?php
echo json_encode(array("test" => "
x"));
Run Code Online (Sandbox Code Playgroud)
PHP 正确转义字符:
{"test":"\r\n\r\n\r\nx"}
Run Code Online (Sandbox Code Playgroud)
但您的数据源提供了格式错误的 JSON。
要解决 JSON 问题,请使用准备好的语句或使用:
$notes = str_replace('\', '\\', json_encode($notes)); // in SaveTaskNotes
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20066 次 |
| 最近记录: |