¿Cómo escapar de cadenas en SQL Server usando PHP?
Estoy buscando la alternativa de mysql_real_escape_string()
SQL Server. ¿Es addslashes()
mi mejor opción o existe otra función alternativa que se puede utilizar?
Una alternativa para mysql_error()
también sería útil.
addslashes()
no es completamente adecuado, pero el paquete mssql de PHP no proporciona ninguna alternativa decente. La solución fea pero completamente general es codificar los datos como una cadena de bytes hexadecimal, es decir
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Resumido, eso sería:
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()
equivalente es 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;
}
Parte del código aquí fue copiado de CodeIgniter. Funciona bien y es una solución limpia.
EDITAR: Hay muchos problemas con el fragmento de código anterior. No utilices esto sin leer los comentarios para saber cuáles son. Mejor aún, no uses esto en absoluto. Las consultas parametrizadas son tus amigas: http://php.net/manual/en/pdo.prepared-statements.php
¿Por qué te molestarías en escapar de algo cuando puedes usar parámetros en tu consulta?
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
Funciona correctamente en selecciones, eliminaciones y actualizaciones, independientemente de si sus parámetros de valores lo son null
o no. Haga una cuestión de principios: no concatene SQL y siempre estará seguro y sus consultas se leerán mucho mejor.
http://php.net/manual/en/function.sqlsrv-query.php