[php] PHP를 사용하여 SQL Server에서 문자열을 이스케이프하는 방법은 무엇입니까?

mysql_real_escape_string()SQL Server 의 대안을 찾고 있습니다. 가 addslashes()내 최선의 선택은 또는 사용할 수있는 또 다른 기능은 무엇입니까?

에 대한 대안 mysql_error()도 유용합니다.



답변

addslashes()완전히 적절하지는 않지만 PHP의 mssql 패키지는 적절한 대안을 제공하지 않습니다. 추악하지만 완전히 일반적인 솔루션은 데이터를 16 진수 바이트 문자열로 인코딩하는 것입니다.

$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에서 추출되었습니다. 잘 작동하고 깨끗한 솔루션입니다.

편집 : 위의 코드 조각에는 많은 문제가 있습니다. 그것이 무엇인지 알기 위해 주석을 읽지 않고 이것을 사용하지 마십시오. 더 나은 방법은 이것을 전혀 사용하지 마십시오. 매개 변수화 된 쿼리는 친구입니다 : http://php.net/manual/en/pdo.prepared-statements.php


답변

쿼리에서 매개 변수를 사용할 수 있는데 왜 이스케이프 처리를해야합니까?!

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

값 매개 변수가 있는지 여부에 관계없이 선택, 삭제, 업데이트에서 올바르게 작동합니다. null . 원칙을 따르십시오-SQL을 연결하지 마십시오. 그러면 항상 안전하며 쿼리를 훨씬 더 잘 읽을 수 있습니다.

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


답변

PDO 라이브러리를 살펴볼 수 있습니다 . 준비된 명령문을 올바르게 수행하면 문자열에서 잘못된 문자를 자동으로 이스케이프하는 PDO와 함께 준비된 명령문을 사용할 수 있습니다. 이것은 PHP 5 전용이라고 생각합니다.


답변

작은 따옴표와 큰 따옴표를 처리하는 또 다른 방법은 다음과 같습니다.

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의 이스케이프 문자


답변

몇 시간 동안 고생 한 끝에 거의 가장 기분이 좋은 솔루션을 찾았습니다.

값을 hexstring으로 변환하는 Chaos의 대답은 모든 데이터 유형, 특히 datetime 열에서 작동하지 않습니다.

PHP를 사용 PDO::quote()하지만 PHP와 함께 제공되므로 PDO::quote()MS SQL Server에서 지원되지 않으며 FALSE. 작동하는 솔루션은 일부 Microsoft 번들을 다운로드하는 것입니다.

그런 다음 다음 예제와 같이 DSN을 사용하여 PDO와 PHP에서 연결할 수 있습니다.

sqlsrv:Server=192.168.0.25; Database=My_Database;

DSN에서 UIDPWD매개 변수를 사용하는 것이 작동하지 않았으므로 연결을 만들 때 PDO 생성자에서 두 번째 및 세 번째 매개 변수로 사용자 이름과 암호가 전달됩니다. 이제 PHP의 PDO::quote(). 즐겨.