如何在SQL Server中使用PHP转义string?

我正在寻找SQL Server的替代mysql_real_escape_string() 。 是addslashes()我最好的select还是有另一个可以使用的替代function?

编辑 :替代mysql_error()也将是有用的。

addslashes()并不完全合适,但PHP的mssql包没有提供任何体面的select。 丑陋但完全一般的解决scheme是将数据编码为hex字节串,即

 $unpacked = unpack('H*hex', $data); mssql_query(' INSERT INTO sometable (somecolumn) VALUES (0x' . $unpacked['hex'] . ') '); 

抽象的,那将是:

 function mssql_escape($data) { if(is_numeric($data)) return $data; $unpacked = unpack('H*hex', $data); return '0x' . $unpacked['hex']; } mssql_query(' INSERT INTO sometable (somecolumn) VALUES (' . mssql_escape($somevalue) . ') '); 

mysql_error()相当于mssql_get_last_message()

 function ms_escape_string($data) { if ( !isset($data) or empty($data) ) return ''; if ( is_numeric($data) ) return $data; $non_displayables = array( '/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15 '/%1[0-9a-f]/', // url encoded 16-31 '/[\x00-\x08]/', // 00-08 '/\x0b/', // 11 '/\x0c/', // 12 '/[\x0e-\x1f]/' // 14-31 ); foreach ( $non_displayables as $regex ) $data = preg_replace( $regex, '', $data ); $data = str_replace("'", "''", $data ); return $data; } 

这里的一些代码被从CodeIgniter中删除。 运作良好,是一个干净的解决scheme。

你可以看看PDO库 。 您可以使用PDO准备语句,如果您正确执行准备好的语句,它将自动转义string中的任何错误字符。 这只适用于PHP 5我认为。

当你可以在你的查询中使用参数时,为什么你会麻烦逃跑?

 sqlsrv_query( $connection, 'UPDATE some_table SET some_field = ? WHERE other_field = ?', array($_REQUEST['some_field'], $_REQUEST['id']) ) 

它适用于select,删除,更新,无论您的值参数是否为null 。 做一个原则问题 – 不要连接SQL,你总是安全的,你的查询读得更好。

http://php.net/manual/en/function.sqlsrv-query.php

另一种处理单引号和双引号的方法是

 function mssql_escape($str) { if(get_magic_quotes_gpc()) { $str= stripslashes($str); } return str_replace("'", "''", $str); } 

为了避免单引号和双引号,你必须把它们加倍:

 $value = 'This is a quote, "I said, 'Hi'"'; $value = str_replace( "'", "''", $value ); 

$value = str_replace( '"', '""', $value );

 $query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) "; 

等等…

和归因: 转义字符在Microsoft SQL Server 2000中

经过几个小时的努力,我想出了一个几乎是最好的解决scheme。

混沌将值转换为hexstring的答案不适用于每个数据types,特别是与date时间列。

我使用PHP的PDO::quote() ,但是它随PHP一起提供,MS SQL Server不支持PDO::quote()并返回FALSE 。 它的工作解决scheme是下载一些Microsoft软件包:

  • 适用于SQL Server的Microsoft驱动程序3.0 (SQLSRV30.EXE):下载并按照说明进行安装。
  • Microsoft®SQLServer®2012 Native Client :searchNative Client的大量页面。 即使它是2012年,我正在使用它来连接到SQL Server 2008(安装2008年的Native Client没有工作)。 下载并安装。

之后,您可以使用DSN在PHP中与PDO进行连接,如下例所示:

 sqlsrv:Server=192.168.0.25; Database=My_Database; 

在DSN中使用UIDPWD参数不起作用,因此在创build连接时,用户名和密码作为PDO构造函数的第二个和第三个parameter passing。 现在你可以使用PHP的PDO::quote() 。 请享用。

我知道,有点晚了,但从'2009年2月22日在12:10'由混乱回答不适合所有疑问。 例如:“CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS”会给你例外

ps看一下php的mssql驱动, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx和sqlsrv_prepare函数,它可以绑定params。;

pss也没有帮助你与上面的查询;)

警告:这个函数是在PHP 7.0.0中被删除的。

http://php.net/manual/en/function.mssql-query.php

对于任何仍在使用这些mssql_ *函数的人,请记住,自v7.0.0起,它们已从PHP中移除。 所以,这意味着你最终必须重写你的模型代码,以使用PDO库,sqlsrv_ *等。如果你正在寻找一个“引用/转义”的方法,我会推荐PDO。

这个函数的替代包括:PDO :: query(),sqlsrv_query()和odbc_exec()

如果您正在使用PDO,则可以使用PDO::quote方法。

逃脱SQL保留字是不是更好? 例如:

 function ms_escape_string($data) { if ( !isset($data) or empty($data) ) return ''; if ( is_numeric($data) ) return $data; $non_displayables = array( '/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15 '/%1[0-9a-f]/', // url encoded 16-31 '/[\x00-\x08]/', // 00-08 '/\x0b/', // 11 '/\x0c/', // 12 '/[\x0e-\x1f]/', // 14-31 '/\27/' ); foreach ( $non_displayables as $regex ) $data = preg_replace( $regex, '', $data ); $reemplazar = array('"',"'",'='); $data = str_replace($reemplazar, "*", $data ); return $data; } 

为了将SQL中的HEX转换回ASCII,这里是我得到的解决scheme(使用混沌函数编码为hex)

 function hexEncode($data) { if(is_numeric($data)) return $data; $unpacked = unpack('H*hex', $data); return '0x' . $unpacked['hex']; } function hexDecode($hex) { $str = ''; for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2))); return $str; } $stringHex = hexEncode('Test String'); var_dump($stringHex); $stringAscii = hexDecode($stringHex); var_dump($stringAscii); 

我一直在使用这个作为mysql_real_escape_string()的替代方法:

 $data = "Whatever the value is"; $data = stripslashes(htmlspecialchars($data)); 

您可以使用以下正则expression式来自定义mysql_real_escape_string (并对其进行改进): [\000\010\011\012\015\032\042\047\134\140] 。 这需要注意以下字符:空,退格,水平制表符,换行,回车,替代,双引号,单引号,反斜杠,重音。 退格和水平选项卡不受mysql_real_escape_string支持。