如何使用PHP在SQL Server中转义字符串?

2022-08-30 07:47:09

我正在寻找SQL Server的替代方案。是我的最佳选择还是可以使用其他替代功能?mysql_real_escape_string()addslashes()

另一种办法也是有用的。mysql_error()


答案 1

addslashes()并不完全足够,但是PHP的mssql包没有提供任何像样的替代方案。丑陋但完全通用的解决方案是将数据编码为十六进制字节串,即

$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()


答案 2
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中扯下来的。效果很好,是一个干净的解决方案。

编辑:上面的代码片段有很多问题。请不要在没有阅读评论的情况下使用它来了解它们是什么。更好的是,请不要使用它。参数化查询是你的朋友:http://php.net/manual/en/pdo.prepared-statements.php


推荐