2010-10-10 41 views
0

我正在使用PHP从MYSQL读取文本字段(说明)并准备JSON对象。模拟JQUERY DataTables插件示例。如何从PHP返回从MySQL返回的文本字段回车?

DESCRIPTION字段包含回车符,我相信这会导致无效的JSON。 JSONLINT.com会生成“语法错误,第35行出现意外的TINVALID”,解析失败“。

http://ageara.com/exp3/server_processing_details_col.php应返回有效的JSON

我试图使用PHP TRIM()函数删除CR但没有多少运气。

相关的PHP代码如下....

$rResult = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 

$sQuery = " 
    SELECT FOUND_ROWS() 
"; 
$rResultFilterTotal = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 
$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal[0]; 

$sQuery = " 
    SELECT COUNT(TITLE) 
    FROM geometa_small 
"; 
$rResultTotal = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 
$aResultTotal = mysql_fetch_array($rResultTotal); 
$iTotal = $aResultTotal[0]; 

/* write the JSON output */ 
$sOutput = '{'; 
$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', '; 
$sOutput .= '"iTotalRecords": '.$iTotal.', '; 
$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', '; 
$sOutput .= '"aaData": [ '; 
while ($aRow = mysql_fetch_array($rResult)) 
{ 
    $sOutput .= "["; 
    $sOutput .= '"<img src=\"details_open.png\">",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['TITLE']).'",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['DATA_CUSTODIAN_ORGANIZATION']).'",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['RECORD_TYPE']).'",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['RESOURCE_STATUS']).'",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['RESOURCE_STORAGE_LOCATION']).'",'; 
    $sOutput .= '"'.str_replace('"', '\"', $aRow['UNIQUE_METADATA_URL']).'",'; 
    $sOutput .= '"'.trim(str_replace('"', '\"', $aRow['DESCRIPTION']), "/r").'"'; 
    $sOutput .= "],"; 
} 
$sOutput = substr_replace($sOutput, "", -1); 

$sOutput .= '] }'; 
echo $sOutput; 

function fnColumnToField($i) 
{ 
    /* Note that column 0 is the details column */ 
    if ($i == 0 ||$i == 1) 
     return "TITLE"; 
    else if ($i == 2) 
     return "DATA_CUSTODIAN_ORGANIZATION"; 
    else if ($i == 3) 
     return "RECORD_TYPE"; 
    else if ($i == 4) 
     return "RESOURCE_STATUS"; 
    else if ($i == 5) 
     return "RESOURCE_STORAGE_LOCATION"; 
    else if ($i == 6) 
     return "UNIQUE_METADATA_URL"; 
    else if ($i == 7) 
     return "DESCRIPTION"; 

} 

?>

回答

0

TRIM()(PHP和MySQL的版本)将不会删除所有回车,前后入境后只有空白。您可以使用php或MySQL去除退货。 Offhand我知道如何做到这一点在PHP:

str_replace(array("\r", "\n"), array('', ''), $mysqldata); 

希望这会有所帮助。不是100%确定是否这是JSON无效的原因。

顺便说一下,如果你有PHP 5.2,你不需要疯了,编写自己的JSON。您可以使用json_encode()

+0

由于Tandu。尝试 – user468648 2010-10-10 05:26:08

+0

str_replace(array(“\ r”,“\ n”),array('',''),$ sOutput); echo $ sOutput;但没有工作,将查找到json_encode() – user468648 2010-10-10 05:33:34

+0

好的答案,甚至进一步,你可以改变代码为'str_replace(array(“\ r”,“\ n”),'\ n',$ mysqldata);' ,因为''\ n''不会再被认为是PHP中的换行符(它会被看作只是两个字符 - '\'和'n'),但是当JavaScript在另一侧解析它时,会将它们视为换行符。 (另外,你可以用一个字符串替代多个字符串,第一个变量使用一个数组,第二个字符串替换为'str_replace()'。) – 2010-10-10 10:03:00

0

修剪并删除\ r和\ n根据使用手册:

该函数返回 从空白开始 和STR的端部剥离的字符串。没有第二 参数,修剪()将去除这些 字符:

* " " (ASCII 32 (0x20)), an ordinary space. 
* "\t" (ASCII 9 (0x09)), a tab. 
* "\n" (ASCII 10 (0x0A)), a new line (line feed). 
* "\r" (ASCII 13 (0x0D)), a carriage return. 
* "\0" (ASCII 0 (0x00)), the NUL-byte. 
* "\x0B" (ASCII 11 (0x0B)), a vertical tab. 

http://www.php.net/trim