PHP kullanarak SQL Server dizeleri kaçmayı nasıl?

8 Cevap php

I mysql_real_escape_string() SQL Server için alternatif arıyorum. addslashes() benim en iyi seçenek kullanılabilir veya başka bir alternatif işlevi var mı?

Edit: Alternatif mysql_error() da yararlı olacaktır.

8 Cevap

addslashes() tam olarak yeterli değil, ancak PHP'nin mssql paket herhangi bir iyi bir alternatif sağlamaz. Çirkin ama tamamen genel bir çözüm, yani bir onaltılık bytestring olarak verileri kodlar

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

Soyutlanmış, olurdu:

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() eşdeğerdir 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;
    }

Burada bazı kod CodeIgniter yırtık. İşleri iyi ve temiz bir çözümdür.

Sen PDO Library içine bakmak olabilir. Eğer doğru hazırlanmış deyimleri yaparsanız otomatik dizeleri herhangi bir kötü karakter kaçacak PDO ile hazırlanan ifadeleri kullanabilirsiniz. Bu PHP 5 için sadece ben düşünüyorum.

Tek ve çift tırnak kaçmak için, onları çift var:

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

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

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

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

vs ..

ve atıf: Escape Character In Microsoft SQL Server 2000

i know, litle bit late, but answer from 'Feb 22 '09 at 12:10' by chaos isn`t fit all queries. E.g: "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS" will give you exception

P.S. , php için mssql sürücü bakmak http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx ve sqlsrv_prepare fonksiyonu, hangi olabilir bağlar params.

p.s.s. Ayrıca yapmadım `hangi t ;) Yukarıdaki sorgu ile size yardımcı olur

Saat boyunca bu mücadele sonrasında, neredeyse iyi hisseden bir çözüm ile geldim.

Hexstring değerleri dönüştürme Chaos 'cevabı özellikle datetime sütunlar, her veri türü ile çalışmaz.

Ben PHP'nin PDO::quote() kullanmak, ama PHP ile gelir olarak, PDO::quote(), MS SQL Server ve getiri FALSE için desteklenmiyor. Iş bunun için çözüm bazı Microsoft demetleri indirmek için oldu:

Bundan sonra aşağıdaki gibi bir DSN kullanarak PDO PHP ile bağlayabilirsiniz:

sqlsrv:Server=192.168.0.25; Database=My_Database;

Using the UID and PWD parameters in the DSN didn't worked, so username and password are passed as the second and third parameters on the PDO constructor when creating the connection. Now you can use PHP's PDO::quote(). Enjoy.

tek ve çift tırnak işlemek için başka bir yoludur

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

Aşağıdaki normal bir ifade ile, mysql_real_escape_string kendi versiyonunu rulo (ve bunun üzerine geliştirmek) olabilir: [\000\010\011\012\015\032\042\047\134\140]. Yani aşağıdaki karakterlerden ilgilenir: null, sil, yatay sekme, yeni satır, satırbaşı, yerine, çift tırnak, tek tırnak, eğik çizgi, ters aksan. Backspace ve yatay sekme mysql_real_escape_string tarafından desteklenmemektedir.