2012-08-27 99 views
1

好的,所以我在我的應用程序中實現了一些推送通知。我寫了一些應該與MySQL數據庫交互的PHP。base64_decode返回null

我想將設備標記存儲在SQL中作爲字符(64),因爲我已經認爲這是好的(我的意思是,它應該以後以二進制方式發送)。

在iOS端我這樣做:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
    NSString *tokenString = [deviceToken base64EncodedString]; 
    NSDictionary *jsonDic = [NSDictionary dictionaryWithObjectsAndKeys:tokenString, @"Token", [NSNumber numberWithBool:YES], @"IsiDevice", [NSNumber numberWithBool:YES], @"Active", nil]; 
    //... http request stuff 
    // what might be important is that the POST body is encoded as UTF8 (content-type set appropriately) 
} 

基於64位的東西由馬特·加拉格爾來自NSData的+ Base64編碼。現在,在PHP端,出現這種情況:

// $tokenEncoded is exactly the same string as I sent from the app (type is string) 
$tokenEncoded = $jsonData['Token']; 

// $token becomes null! (type is string) 
$token = base64_decode($tokenEncoded); 

從php.net/manual上BASE64_DECODE的返回值:

返回原始數據或FALSE的失敗。返回的數據可能是二進制的。

現在,我不知道更多的PHP,然後我已經教了自己在過去的兩天,但如果文檔說它應該返回FALSE或原始數據,我發現它非常令人困惑,返回的值是一個空字符串(因爲我非常確定原始數據不是null!)。

由於base64_decoded字符串變爲null,所以當我追加它時顯然是我的整個查詢字符串。這並不能說明一個令人信服的問題。

所以我的問題是,我猜:爲什麼base64_decode返回的東西不應該?一旦我真的從base64_decode中獲取數據,我應該如何將它包含在查詢中,以便將其存儲在數據庫中(只需追加?)?

附加信息: 我正在使用Slim框架。我在一條路線上完成了這一切。 $ jsonData從體內取像這樣:

$jsonBody = Slim::getInstance()->request()->getBody(); 
$jsonData = json_decode($jsonBody, true); 

難道從應用中的一些額外的測試,只是爲了確保沒有得到我的應用程序的執行基地64捏造了起來:

DLOG(@"Device token as NSData: %@", deviceToken); 
NSString *base64token = [deviceToken base64EncodedString]; 
DLOG(@"Device token as base64: %@", base64token); 
DLOG(@"Device token back from base64: %@", [NSData dataFromBase64String:base64token]); 

輸出:

Device token as NSData: <65625f1c c33b9480 5a46f346 8b2877d0 95e92823 33e88e91 fd3a2abf febad972> 

Device token as base64: ZWJfHMM7lIBaRvNGiyh30JXpKCMz6I6R/Toqv/662XI= 

Device token back from base64: <65625f1c c33b9480 5a46f346 8b2877d0 95e92823 33e88e91 fd3a2abf febad972> 
+0

什麼是輸入exacty? – deceze

+3

SQL中的CHAR(64)'表示64字母長的CHAR,它與base64編碼數據無關。 –

+0

您是否檢查過令牌是您預期的值?在解碼之前先執行'var_dump($ tokenEncoded);'並確保它具有您期望的值。 – Dan

回答

1

請寫出您的查詢字符串到PHP中的文件,這是最好的辦法是測試你的編碼標記值是否正確。 如

<?php 
$querystring=$_REQUEST['YOUR_QUERY_STRING']; 
file_put_contents("query_string.txt",$querystring); 
?> 

這將寫整個查詢字符串「query_string.txt」文件。然後打開文件。並檢查你的base64編碼值的值。 然後複製該值並使用一個簡單的程序進行檢查。

<?php 
    echo base64_decode("YOUR_COPIED_VALUE"); 
// if this works fine there is no problem. you have to go through your php code. 
?> 
+0

當我嘗試附加$ token(base64_decode:d數據)時,整個查詢變爲空。 建立查詢只是 ''INSERT INTO [DBNAME] .devices「'然後當我附加''Token = $ token」'時,它變爲空。 – SeruK

0

在我而言,如果我解碼的字符串是不正確的格式,它會返回null

echo base64_decode("i'm not encode, or wrong format");//null 
echo base64_decode('bWVvdyBtZW93');//meow meow 

這樣檢查字符串格式再次

但在某些情況下:有人失蹤base64_decode和base64_encode,當他們想編碼一個字符串,但他們使用base64_decode,因此它顯示爲空