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()
입니다.
답변
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
답변
쿼리에서 매개 변수를 사용할 수 있는데 왜 이스케이프 처리를해야합니까?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
값 매개 변수가 있는지 여부에 관계없이 선택, 삭제, 업데이트에서 올바르게 작동합니다. null
. 원칙을 따르십시오-SQL을 연결하지 마십시오. 그러면 항상 안전하며 쿼리를 훨씬 더 잘 읽을 수 있습니다.
http://php.net/manual/en/function.sqlsrv-query.php
답변
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 번들을 다운로드하는 것입니다.
- SQL Server 용 PHP 용 Microsoft 드라이버 3.0 (SQLSRV30.EXE) : 다운로드하고 지침에 따라 설치합니다.
- Microsoft® SQL Server® 2012 Native Client : Native Client에 대한 광범위한 페이지를 검색합니다. 2012 년이지만 SQL Server 2008에 연결하는 데 사용하고 있습니다 (2008 Native Client 설치가 작동하지 않음). 다운로드하여 설치하십시오.
그런 다음 다음 예제와 같이 DSN을 사용하여 PDO와 PHP에서 연결할 수 있습니다.
sqlsrv:Server=192.168.0.25; Database=My_Database;
DSN에서 UID
및 PWD
매개 변수를 사용하는 것이 작동하지 않았으므로 연결을 만들 때 PDO 생성자에서 두 번째 및 세 번째 매개 변수로 사용자 이름과 암호가 전달됩니다. 이제 PHP의 PDO::quote()
. 즐겨.
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)