Saya mencari alternatif mysql_real_escape_string()
untuk SQL Server. Apakah addslashes()
pilihan terbaik saya atau ada fungsi alternatif lain yang dapat digunakan?
Sebuah alternatif mysql_error()
juga akan berguna.
Saya mencari alternatif mysql_real_escape_string()
untuk SQL Server. Apakah addslashes()
pilihan terbaik saya atau ada fungsi alternatif lain yang dapat digunakan?
Sebuah alternatif mysql_error()
juga akan berguna.
Jawaban:
addslashes()
tidak sepenuhnya memadai, tetapi paket mssql PHP tidak memberikan alternatif yang layak. Solusi yang jelek tapi sepenuhnya umum adalah mengkodekan data sebagai hex bytestring, yaitu
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Diabstraksi, itu akan menjadi:
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()
setara mssql_get_last_message()
.
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
Saya yakin metode ini bisa benar hanya jika bekerja dengan setiap tipe data MSSQL.
mssql_escape()
fungsi yang dikembalikan tidak melakukannya untuk saya. Tampilan teks setelah melakukan pemilihan terlihat seperti ini 0x4a2761696d65206269656e206c652063686f636f6c6174
sehingga tidak dapat dibaca.
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;
}
Beberapa kode di sini diambil dari CodeIgniter. Bekerja dengan baik dan merupakan solusi yang bersih.
EDIT: Ada banyak masalah dengan cuplikan kode di atas. Tolong jangan gunakan ini tanpa membaca komentar untuk mengetahui apa itu. Lebih baik lagi, tolong jangan gunakan ini sama sekali. Permintaan parameterized adalah teman Anda: http://php.net/manual/en/pdo.prepared-statements.php
preg_replace
? Bukankah str_replace
cukup?
empty($value)
akan mengembalikan true
tidak hanya untuk ''
, tetapi juga untuk null
,0
dan '0'
! Anda akan mengembalikan string kosong dalam semua kasus tersebut.
Mengapa Anda repot-repot melarikan diri jika Anda dapat menggunakan parameter dalam kueri Anda ?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
Ini berfungsi dengan benar dalam memilih, menghapus, memperbarui terlepas dari apakah parameter nilai Anda null
atau tidak. Buat masalah prinsip - Jangan menggabungkan SQL dan Anda selalu aman dan kueri Anda terbaca jauh lebih baik.
Anda dapat melihat ke Perpustakaan PDO . Anda dapat menggunakan pernyataan yang telah disiapkan dengan PDO, yang secara otomatis akan menghilangkan karakter buruk apa pun dalam string Anda jika Anda melakukan pernyataan yang disiapkan dengan benar. Ini untuk PHP 5 saja menurut saya.
Cara lain untuk menangani tanda kutip tunggal dan ganda adalah:
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
Untuk menghindari tanda kutip tunggal dan ganda, Anda harus menggandakannya:
$value = 'This is a quote, "I said, 'Hi'"';
$value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
dll ...
dan atribusi: Karakter Escape di Microsoft SQL Server 2000
Setelah bergumul dengan ini selama berjam-jam, saya telah menemukan solusi yang terasa hampir terbaik.
Jawaban kekacauan untuk mengonversi nilai menjadi hexstring tidak berfungsi dengan setiap tipe data, khususnya dengan kolom datetime.
Saya menggunakan PHP PDO::quote()
, tetapi karena itu datang dengan PHP, PDO::quote()
tidak didukung untuk MS SQL Server dan kembali FALSE
. Solusi agar berfungsi adalah mengunduh beberapa bundel Microsoft:
Setelah itu Anda bisa terhubung di PHP dengan PDO menggunakan DSN seperti contoh berikut:
sqlsrv:Server=192.168.0.25; Database=My_Database;
Penggunaan parameter UID
dan PWD
di DSN tidak berfungsi, jadi nama pengguna dan sandi dikirimkan sebagai parameter kedua dan ketiga pada konstruktor PDO saat membuat koneksi. Sekarang Anda dapat menggunakan PHP PDO::quote()
. Nikmati.
Jawaban dari 2009-02-22T121000 oleh kekacauan pengguna tidak cocok untuk semua kueri.
Misalnya, "BUAT LOGIN [0x6f6c6f6c6f] FROM WINDOWS" akan memberi Anda pengecualian.
PS: lihat driver SQL Server untuk PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx dan fungsi sqlsrv_prepare, yang dapat mengikat parameter.
PSS: Yang juga tidak membantu Anda dengan kueri di atas;)
Peringatan: Fungsi ini DIHAPUS di PHP 7.0.0.
http://php.net/manual/en/function.mssql-query.php
Bagi siapa pun yang masih menggunakan fungsi mssql_ * ini, perlu diingat bahwa fungsi tersebut telah dihapus dari PHP mulai v7.0.0. Jadi, itu berarti Anda pada akhirnya harus menulis ulang kode model Anda untuk menggunakan pustaka PDO, sqlsrv_ * dll. Jika Anda mencari sesuatu dengan metode "mengutip / keluar", saya akan merekomendasikan PDO.
Alternatif untuk fungsi ini termasuk: PDO :: query (), sqlsrv_query () dan odbc_exec ()
Jika Anda menggunakan PDO, Anda dapat menggunakan PDO::quote
metode ini.
Untuk konversi untuk mendapatkan nilai heksadesimal dalam SQL kembali menjadi ASCII, berikut adalah solusi yang saya dapatkan untuk ini (menggunakan fungsi dari kekacauan pengguna untuk disandikan menjadi heksadesimal)
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);
Lebih baik juga menghindari kata-kata khusus SQL. Sebagai contoh:
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;
}
Saya telah menggunakan ini sebagai alternatif dari 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));
Anda bisa roll versi Anda sendiri mysql_real_escape_string
, (dan meningkatkan atasnya) dengan ekspresi reguler berikut: [\000\010\011\012\015\032\042\047\134\140]
. Itu menangani karakter berikut: null, backspace, tab horizontal, baris baru, carriage return, pengganti, petik ganda, petik tunggal, garis miring terbalik, aksen kuburan. Tab spasi mundur dan horizontal tidak didukung oleh mysql_real_escape_string
.