2013-05-21 53 views
0

我有一個變量,我附加到SQL語句,但似乎有隱藏的字符導致錯誤。字符串中的隱藏字符破壞SQL語句(php,mysql)

我有$ addToInventory變量是一個數字(例如405,000)。 我正在嘗試下面的代碼片段,以擺脫字符,但當我回聲我仍然看到\ 0 \ 0 \ 0 \ 0(空)後的數字。

$addToInventory= str_replace(",", "", $pieces[1]); 
$addToInventory= str_replace("\r", "", $addToInventory);  
$addToInventory= str_replace("\n", "",$addToInventory); 
$addToInventory = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', mysql_real_escape_string($addToInventory)); 
$sql_query = "UPDATE products set products_quantity = " .$addToInventory." where products_model like '$code'"; 

呼應$ sql_query生產:

UPDATE products set products_quantity = 405000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 where products_model like '111'. 
+0

什麼特別的錯誤? –

+0

sql語句不運行。在瀏覽器中查看SQL時,它最初看起來是正確的,但由於實際的PHP字符串包含NUL字符,所以它會失敗。從瀏覽器中生成的HTML中複製和粘貼SQL語句可以正常工作。 –

+0

mysql會拋出什麼特別的錯誤? –

回答

6

使用trim()。它刪除NUL字節字符。

該函數返回一個字符串,其中str的起始和結尾從 中剝離出空格。沒有第二參數,修剪()將 條這些字符:

  • 「」(ASCII 32(0×20)),一個普通的空間。
  • 「\ t」(ASCII 9(0x09)),一個選項卡。
  • 「\ n」(ASCII 10(0x0A)),換行(換行)。
  • 「\ r」(ASCII 13(0x0D)),回車。
  • 「\ 0」(ASCII 0(0x00)),NUL字節。
  • 「\ x0B」(ASCII 11(0x0B)),一個垂直標籤。
$addToInventory= str_replace(",", "", $pieces[1]); 
$addToInventory= trim($addToInventory); 
+0

謝謝..這只是伎倆。不知道具體功能:) –

2

如果你想擺脫周圍的字符串中的所有空格字符,請使用trim()

$addToInventory = trim($addToInventory); 

您目前的代碼似乎非常容易受到SQL注入攻擊。確保在查詢中使用$addToInventory或使用準備好的語句(如PDOmysqli提供的語句)之前進一步清理。

-1

插入到數據庫,則必須使用一些逃生功能n表示將防止聲明與修正功能

0

而且mysqli_real_escape_string之前,你應該避免構造這樣的疑問,因爲您的應用程序將最有可能容易發生SQL注入,除非你確定$ pieces [1]變量已被消毒。例如,如果攻擊者將$ pieces [1]更改爲「0」; DROP DATABASE something; - 「,則您的查詢將變成如下所示: UPDATE products set products_quantity ='0'; DROP DATABASE的東西; - 在products_model像「XXX」

...這將有效地毀了你的數據庫

確保您消毒被用來構造查詢變量,或者你正在將它們設爲預處理語句的參數。點擊這裏查看準備報表的更多信息: http://en.wikipedia.org/wiki/Prepared_statement

+0

:) ...你會注意到在'mysql_real_escape_string($ addToInventory)'的問題。 Euxaristo - menios :) –