mysql_real_escape_string()
SQL Server 의 대안을 찾고 있습니다. 가 addslashes()
내 최선의 선택은 또는 사용할 수있는 또 다른 기능은 무엇입니까?
에 대한 대안 mysql_error()
도 유용합니다.
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()
입니다.
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
모든 MSSQL 데이터 유형에서 작동하는 경우에만이 방법이 올바르다 고 생각합니다.
mssql_escape()
반환 된 함수 의 내용이 나를 위해하지 않습니다. 선택을 한 후 텍스트 디스플레이가 이렇게 보이기 0x4a2761696d65206269656e206c652063686f636f6c6174
때문에 읽을 수 없습니다.
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
preg_replace
합니까? str_replace
충분 하지 않습니까?
empty($value)
반환 true
뿐만 아니라위한 ''
뿐만 아니라위한 null
, 0
와 '0'
! 이러한 모든 경우에 빈 문자열을 반환합니다.
쿼리에서 매개 변수를 사용할 수 있는데 왜 이스케이프 처리를해야합니까?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
값 매개 변수가 있는지 여부에 관계없이 선택, 삭제, 업데이트에서 올바르게 작동합니다. null
. 원칙을 따르십시오-SQL을 연결하지 마십시오. 그러면 항상 안전하며 쿼리를 훨씬 더 잘 읽을 수 있습니다.
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' ) ";
기타...
몇 시간 동안 고생 한 끝에 거의 가장 기분이 좋은 솔루션을 찾았습니다.
값을 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에서 UID
및 PWD
매개 변수를 사용하는 것이 작동하지 않았으므로 연결을 만들 때 PDO 생성자에서 두 번째 및 세 번째 매개 변수로 사용자 이름과 암호가 전달됩니다. 이제 PHP의 PDO::quote()
. 즐겨.
사용자 혼돈에 의한 2009-02-22T121000의 답변 모든 쿼리에 맞지는 않습니다.
예를 들어, "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS"는 예외를 제공합니다.
추신 : 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 ()
PDO를 사용하는 경우 PDO::quote
방법을 사용할 수 있습니다 .
SQL의 16 진수 값을 ASCII로 다시 가져 오는 변환을 위해 여기에 제가 얻은 솔루션이 있습니다 ( 사용자 혼돈 의 함수 를 사용하여 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);
SQL 예약어도 이스케이프하는 것이 좋습니다. 예를 들면 :
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;
}
나는 이것을 대안으로 사용하고 있습니다 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));