SQLServerの代替手段を探していmysql_real_escape_string()
ます。私の最善の選択肢ですかaddslashes()
、それとも使用できる別の代替機能がありますか?
の代替手段mysql_error()
も役立ちます。
SQLServerの代替手段を探していmysql_real_escape_string()
ます。私の最善の選択肢ですか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
PDOライブラリを調べることができます。プリペアドステートメントをPDOで使用できます。これにより、プリペアドステートメントを正しく実行すると、文字列内の不正な文字が自動的にエスケープされます。これはPHP5専用だと思います。
一重引用符と二重引用符を処理する別の方法は次のとおりです。
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
一重引用符と二重引用符をエスケープするには、それらを2倍にする必要があります。
$value = 'This is a quote, "I said, 'Hi'"';
$value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
等...
これに何時間も苦労した後、私はほぼ最高に感じる解決策を思いついた。
値をhexstringに変換するというカオスの答えは、すべてのデータ型、特に日時列で機能するとは限りません。
私はPHPを使用PDO::quote()
していますが、PHPに付属してPDO::quote()
いるため、MS SQL Serverではサポートされておらず、を返しますFALSE
。それが機能するための解決策は、いくつかのMicrosoftバンドルをダウンロードすることでした。
その後、次の例のように、DSNを使用してPHPでPDOに接続できます。
sqlsrv:Server=192.168.0.25; Database=My_Database;
UID
DSNのandパラメーターの使用はPWD
機能しなかったため、ユーザー名とパスワードは、接続の作成時にPDOコンストラクターの2番目と3番目のパラメーターとして渡されます。これで、PHPを使用できますPDO::quote()
。楽しみ。
ユーザーchaosによる 2009-02-22T121000 からの回答は、すべてのクエリに適合するわけではありません。
たとえば、「CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS」では例外が発生します。
PS: PHP 用の SQL Server ドライバー、http: //msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx、およびパラメーターをバインドできる sqlsrv_prepare 関数を見てください。
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() が含まれます。
SQL の 16 進数値を ASCII に戻すための変換については、これで得た解決策を次に示します (ユーザーchaosの関数を使用して 16 進数にエンコードします)。
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);
PDO を使用している場合は、PDO::quote
メソッドを使用できます。
私はこれを代わりに使用していますmysql_real_escape_string()
:
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
$data = "Whatever the value's is";
$data = stripslashes(htmlsan($data));
次の正規表現を使用して、の独自のバージョンをロールするmysql_real_escape_string
(およびそれを改善する)ことができます[\000\010\011\012\015\032\042\047\134\140]
。これにより、null、バックスペース、水平タブ、改行、キャリッジリターン、置換、二重引用符、一重引用符、円記号、アクサングラーブの文字が処理されます。バックスペースと水平タブはでサポートされていませんmysql_real_escape_string
。