¿Cómo escapar de cadenas en SQL Server usando PHP?

Resuelto Ali asked hace 54 años • 14 respuestas

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.

Ali avatar Jan 01 '70 08:01 Ali
Aceptado

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().

chaos avatar Feb 22 '2009 12:02 chaos
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

genio avatar Mar 26 '2010 21:03 genio

¿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 nullo 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

Konstantin avatar Sep 09 '2015 14:09 Konstantin