2016-09-14 25 views
1

我試圖傳遞一個數組,這是從PHP到JavaScript使用json_encode的mySQL PDO查詢的結果。從mySQL查詢返回的字符串上使用json_encode時出錯

但是,如果其中一個字段包含空格,或者如果我嘗試在字符串上使用數據庫函數(僅選擇第一個非空格部分),則該對象似乎不存在,並且我的代碼不會編譯。

以下是執行代碼:

<?php 
    $sql = "SELECT id, substring_index(firstNames, ' ', 1) as firstName, lastName, gender, idPersonFather, idPersonMother 
    FROM a_person"; 

    $result = $db->query($sql); 
    while ($row = $result->fetch(PDO::FETCH_ASSOC)){ 

    $personArray[$row['id']] = Array( 'firstName' => $row['firstName'] 
            , 'lastName' => $row['lastName'] 
            , 'gender' => $row['gender'] 
            , 'idFather' => $row['idPersonFather'] 
            , 'idMother' => $row['idPersonMother']); 
} 
?> 

<html> 
... 
<script type="text/javascript" src="js/includes/grid_classes.js"> 

    var personArray=<?php echo json_encode($personArray); ?>//get php aray 
    var someNextStuff 
    ...etc 

這將導致錯誤 Uncaught SyntaxError: Unexpected token var 因爲該行var someNextStuff自帶意外,顯然該對象被轉換成一個空字符串?

而且,下面的選擇會導致同樣的問題:

$sql = "SELECT id, firstNames, lastName, gender, idPersonFather, idPersonMother 
FROM a_person"; 

用含有象「瑪利亞安娜塞西莉亞」,且列值firstNames。

然而SQL查詢直接在數據庫上工作(在phpmyadmin中)。

但是,如果我省略了select和數組中的firstNames字段,則代碼工作正常。

這可能是什麼原因造成的?

感謝您的幫助..

編輯:

我現在發現,

SELECT id, substring_index(coalesce('Maria anna blah','?'), ' ', 1) as firstName, <rest of fields> 

作品,但

SELECT id, substring_index(coalesce(firstNames,'?'), ' ', 1) as firstName, <rest of fields> 

沒有。

所以它必須是一些與那場,我想..

+0

看起來你正在混合使用PHP和JavaScript,而沒有用'<?php'和'?>'標籤將它們恰當地分開,這就是導致語法錯誤的原因... –

+0

對不起,我忽略了分隔符例如 - 現在添加..如前所述,代碼確實編譯和工作正常,只要我離開包含空格的字段。 – Rusty75

+0

呵呵,好吧,好吧,看起來你需要在<?php echo json_encode($ personArray)後面加分號。 ?>'在JavaScript中。 –

回答

0

OK,我似乎它的確是在該領域的行之一的假值! (感謝Jakumi)

從有序select中有效地向數組添加更多行直到失敗,並且在添加帶有名字Ãline的記錄時會發生這種情況。 複製粘貼我剛剛發現在0089之後有一個無法讀取的字符,不管是什麼...... HEX c289 然而,僅僅在Ã字符之後刪除值是不夠的,似乎我的字符集是可能太有限了。不過,我懷疑這是髒數據,所以它會回到源代碼,而不是擴展字符集。

1

如果您查看json_last_error_msg的輸出(或者如果您使用的是舊版本的PHP,則只需要json_last_error,在這種情況下,您只會得到一個需要與常量匹配的整數),您將得到其中一個錯誤:

Control character error, possibly incorrectly encoded

Malformed UTF-8 characters, possibly incorrectly encoded

您發現兩個奇怪的字符(A和不可打印的)是當您嘗試UTF-8數據存儲在數據庫中未使用UTF-8會發生什麼編碼。

您可以嘗試通過調用utf8_decode來解決這個問題,這些數據可能包含unicode字符。

但是,修復它的最好方法是確保您的數據庫正在使用UTF-8。

+0

嗨,感謝您的有用評論。數據庫整理是utf8_general_ci,但我不認爲十六進制代碼C289是任何適合UTF8的字符集。這是我以家庭樹軟件程序以GEDCOM格式導出的數據,我編寫了一個程序包來處理GEDCOM文件並填充mysql數據庫。這可能是我忽略了在某處設置UTF8,但我懷疑數據已經錯誤地落在了文件中。在所有情況下,我只會期望常用字符,因此它很可能是髒數據... – Rusty75