2010-08-10 110 views
1

我有一個iPhone應用程序,它將用戶輸入的數據提交給SQL數據庫。它會導致錯誤,或者切斷數據或者在使用特殊字符時輸入「null」。似乎撇號,問號和句號都可以,但除此之外的任何內容都會導致它切斷郵件或發佈任何內容。來自iPhone的特殊字符在SQL中導致POST錯誤

我的SQL查詢來插入數據如下:

mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(), '$cat', '$sub', '$body');"); 

在數據庫中的字段類型是一個varchar(8000)。所以,我知道由於字符的限制,它沒有被切斷。我使用的排序規則是「latin1_swedish_ci」

編輯:我再次測試。這是「&」,它在發佈到SQL數據庫時切斷字符串。如果我手工從phpMyAdmin插入,我可以插入字符串「測試&看到這是否工作」沒有問題。

iPhone代碼:

[p setObject:[NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://website.com/script.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",[[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],[[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],sport,@"",[[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]] forKey:@"q"]; 

此外:

如果我手動插入與符號(&),它會出現在iPhone應用程序的字符串。僅在發佈功能上,它不起作用。

添加3:20p 8/10/10: 我已經做了一些額外的測試,並且INSERT查詢工作正常。我已經創建了一個單獨的腳本來從HTML頁面獲取輸入數據,並將其插入到其中的「&」符號中。似乎我需要看看iPhone是以字符串形式抓取並傳遞給PHP腳本的。

回答

1

使用mysql_real_escape_string轉義您的數據。作爲一個醜陋但快速修復,看起來像

$cat = mysql_real_escape_string($cat); 
$sub = mysql_real_escape_string($sub); 
$body = mysql_real_escape_string($body); 
mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(), '$cat', '$sub', '$body');"); 

你的特殊字符有多特殊?如果它們是Unicode,則可能需要SET NAMES UTF8,如How can I store Unicode in MySQL?中所述。

+0

它的「&」字符正在切斷帖子 – BigMike 2010-08-10 15:55:39

+0

「mysql_real_escape_string」似乎不允許該帖子發生。 $ body = mysql_real_escape_string(「'」,「'」,@ $ _ REQUEST ['body']); – BigMike 2010-08-10 16:49:09

+0

您正在使用該功能不正確。刪除前兩個參數:'$ body = mysql_real_escape_string(@ $ _ REQUEST ['body']);' – MvanGeest 2010-08-10 17:28:16

0

在將數據發送到服務器並分別解碼響應之前,嘗試對您的數據進行URL編碼。 NSString有這方面的方法。

+0

tob,謝謝。我目前使用NSURL URLWithString。我編輯了我的原始文章以包含我的iPhone代碼。 – BigMike 2010-08-10 18:32:13

0

不要通過字符串連接用戶提供的數據來構建SQL查詢。使用綁定參數(數據庫抽象層,如PDO和ADODB在PHP中提供了這一點)。

+0

安德魯,你能通過提供一個例子來幫助我嗎?我將如何做這個改變? – BigMike 2010-08-10 21:05:08