2013-05-21 54 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 :) –