Tôi đang tìm giải pháp thay thế mysql_real_escape_string()
cho SQL Server. Là addslashes()
lựa chọn tốt nhất của tôi hoặc có một chức năng thay thế khác có thể được sử dụng?
Một thay thế cho mysql_error()
cũng sẽ hữu ích.
Tôi đang tìm giải pháp thay thế mysql_real_escape_string()
cho SQL Server. Là addslashes()
lựa chọn tốt nhất của tôi hoặc có một chức năng thay thế khác có thể được sử dụng?
Một thay thế cho mysql_error()
cũng sẽ hữu ích.
Câu trả lời:
addslashes()
không hoàn toàn phù hợp, nhưng gói mssql của PHP không cung cấp bất kỳ giải pháp thay thế phù hợp nào. Giải pháp xấu nhưng đầy đủ chung chung là mã hóa dữ liệu dưới dạng chuỗi kiểm tra hex, tức là
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Tóm tắt, đó sẽ là:
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()
tương đương là 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.
Tôi tin rằng phương pháp này chỉ có thể đúng nếu nó hoạt động với mọi kiểu dữ liệu MSSQL.
mssql_escape()
hàm trả về không làm việc đó cho tôi. Màn hình hiển thị văn bản sau khi thực hiện lựa chọn trông như thế này, 0x4a2761696d65206269656e206c652063686f636f6c6174
do đó không thể đọc được.
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;
}
Một số mã ở đây đã bị tách khỏi CodeIgniter. Hoạt động tốt và là một giải pháp sạch.
CHỈNH SỬA: Có rất nhiều vấn đề với đoạn mã ở trên. Vui lòng không sử dụng điều này mà không đọc các bình luận để biết đó là những gì. Tốt hơn hết, vui lòng không sử dụng cái này. Các truy vấn được tham số hóa là bạn của bạn: http://php.net/manual/en/pdo.prepared-statements.php
preg_replace
? Không phải là str_replace
đủ?
empty($value)
sẽ trả về true
không chỉ cho ''
, mà còn cho null
, 0
và '0'
! Bạn sẽ trả về một chuỗi trống trong tất cả các trường hợp đó.
Tại sao bạn lại muốn thoát khỏi bất cứ thứ gì khi bạn có thể sử dụng các tham số trong truy vấn của mình ?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
Nó hoạt động ngay trong việc chọn, xóa, cập nhật bất kể tham số giá trị của bạn có null
hay không. Thực hiện một vấn đề về nguyên tắc - Không nối SQL và bạn luôn an toàn và các truy vấn của bạn đọc tốt hơn nhiều.
Bạn có thể xem Thư viện PDO . Bạn có thể sử dụng các câu lệnh đã chuẩn bị sẵn với PDO, nó sẽ tự động thoát khỏi bất kỳ ký tự xấu nào trong chuỗi của bạn nếu bạn thực hiện đúng các câu lệnh đã chuẩn bị. Tôi nghĩ điều này chỉ dành cho PHP 5.
Một cách khác để xử lý dấu ngoặc kép đơn và dấu ngoặc kép là:
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
Để thoát khỏi dấu ngoặc kép và đơn, bạn phải nhân đôi chúng lên:
$value = 'This is a quote, "I said, 'Hi'"';
$value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
Vân vân...
và thuộc tính: Escape Character trong Microsoft SQL Server 2000
Sau khi vật lộn với điều này trong nhiều giờ, tôi đã đưa ra một giải pháp gần như tốt nhất.
Câu trả lời của Chaos về việc chuyển đổi giá trị thành chuỗi lục phân không hoạt động với mọi loại dữ liệu, đặc biệt với các cột ngày giờ.
Tôi sử dụng PHP PDO::quote()
, nhưng vì nó đi kèm với PHP, PDO::quote()
không được hỗ trợ cho MS SQL Server và trả về FALSE
. Giải pháp để nó hoạt động là tải xuống một số gói Microsoft:
Sau đó, bạn có thể kết nối trong PHP với PDO bằng DSN như ví dụ sau:
sqlsrv:Server=192.168.0.25; Database=My_Database;
Sử dụng các tham số UID
và PWD
trong DSN không hoạt động, vì vậy tên người dùng và mật khẩu được chuyển làm tham số thứ hai và thứ ba trên phương thức khởi tạo PDO khi tạo kết nối. Bây giờ bạn có thể sử dụng PHP PDO::quote()
. Thưởng thức.
Một câu trả lời từ 2009-02-22T121000 bởi sự hỗn loạn của người dùng không phù hợp với tất cả các truy vấn.
Ví dụ: "TẠO ĐĂNG NHẬP [0x6f6c6f6c6f] TỪ WINDOWS" sẽ cung cấp cho bạn một ngoại lệ.
Tái bút: xem trình điều khiển SQL Server cho PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx bút và hàm sqlsrv_prepare, có thể liên kết các tham số.
PSS: Điều này cũng không giúp bạn với truy vấn ở trên;)
Cảnh báo: Chức năng này đã bị LOẠI BỎ trong PHP 7.0.0.
http://php.net/manual/en/ Chức năng.mssql-query.php
Đối với bất kỳ ai vẫn đang sử dụng các hàm mssql_ * này, hãy nhớ rằng chúng đã bị xóa khỏi PHP kể từ v7.0.0. Vì vậy, điều đó có nghĩa là cuối cùng bạn phải viết lại mã mô hình của mình để sử dụng thư viện PDO, sqlsrv_ *, v.v. Nếu bạn đang tìm kiếm thứ gì đó có phương pháp "trích dẫn / thoát", tôi khuyên bạn nên sử dụng PDO.
Các lựa chọn thay thế cho hàm này bao gồm: PDO :: query (), sqlsrv_query () và odbc_exec ()
Nếu bạn đang sử dụng PDO, bạn có thể sử dụng PDO::quote
phương pháp này.
Để chuyển đổi để lấy lại các giá trị thập lục phân trong SQL thành ASCII, đây là giải pháp mà tôi đã nhận được về việc này (sử dụng hàm từ hỗn loạn của người dùng để mã hóa thành thập lục phân)
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);
Tốt hơn là cũng nên thoát khỏi các từ dành riêng cho SQL. Ví dụ:
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;
}
Tôi đã sử dụng cái này thay thế cho 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));
Bạn có thể cuộn phiên bản của riêng bạn mysql_real_escape_string
, (và cải tiến nó) với biểu thức chính quy sau đây: [\000\010\011\012\015\032\042\047\134\140]
. Điều đó sẽ xử lý các ký tự sau: null, backspace, ngang tab, dòng mới, xuống dòng, thay thế, dấu ngoặc kép, dấu nháy đơn, dấu gạch chéo ngược, dấu trọng âm. Backspace và tab ngang không được hỗ trợ bởi mysql_real_escape_string
.