Estou procurando uma alternativa mysql_real_escape_string()
para o SQL Server. É a addslashes()
minha melhor opção ou existe outra função alternativa que pode ser usada?
Uma alternativa para mysql_error()
também seria útil.
php
sql-server
escaping
input-sanitization
Clique em votar positivamente
fonte
fonte
Respostas:
addslashes()
não é totalmente adequado, mas o pacote mssql do PHP não oferece nenhuma alternativa decente. A solução feia, mas totalmente geral, é codificar os dados como um bytestring hexadecimal, ou seja,Abstrato, isso seria:
mysql_error()
equivalente émssql_get_last_message()
.fonte
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
acredito que este método pode ser correto apenas se funcionar com todos os tipos de dados MSSQL.mssql_escape()
função retornada não está fazendo isso para mim. A exibição de texto depois de fazer uma seleção fica0x4a2761696d65206269656e206c652063686f636f6c6174
assim ilegível.Parte do código aqui foi roubado do CodeIgniter. Funciona bem e é uma solução limpa.
EDIT: Existem muitos problemas com esse trecho de código acima. Por favor, não use isso sem ler os comentários para saber o que são. Melhor ainda, por favor, não use isso. As consultas parametrizadas são seus amigos: http://php.net/manual/en/pdo.prepared-statements.php
fonte
preg_replace
? Não é ostr_replace
suficiente?empty($value)
vai voltartrue
não só para''
, mas também paranull
,0
e'0'
! Você retornaria uma string vazia em todos esses casos.Por que você se incomodaria em escapar de qualquer coisa quando você pode usar parâmetros em sua consulta ?!
Ele funciona bem em seleções, exclusões e atualizações, independentemente de seus parâmetros de valores serem
null
ou não. Faça uma questão de princípio - Não concatene SQL e você estará sempre seguro e suas consultas serão lidas muito melhor.http://php.net/manual/en/function.sqlsrv-query.php
fonte
Você pode dar uma olhada na Biblioteca PDO . Você pode usar instruções preparadas com PDO, que automaticamente escapará de quaisquer caracteres inválidos em suas strings se você fizer as instruções preparadas corretamente. Isso é apenas para PHP 5, eu acho.
fonte
Outra maneira de lidar com aspas simples e duplas é:
fonte
Para escapar das aspas simples e duplas, você precisa dobrá-las:
$value = str_replace( '"', '""', $value );
etc ...
e atribuição: caractere de escape no Microsoft SQL Server 2000
fonte
Depois de lutar com isso por horas, eu encontrei uma solução que parece quase a melhor.
A resposta do caos de converter valores em hexstring não funciona com todos os tipos de dados, especificamente com colunas datetime.
Eu uso PHP's
PDO::quote()
, mas como vem com PHP,PDO::quote()
não tem suporte para MS SQL Server e retornaFALSE
. A solução para que funcionasse era baixar alguns pacotes da Microsoft:Depois disso, você pode se conectar em PHP com PDO usando um DSN como o exemplo a seguir:
O uso dos parâmetros
UID
ePWD
no DSN não funcionou, então o nome de usuário e a senha são passados como o segundo e o terceiro parâmetros no construtor PDO ao criar a conexão. Agora você pode usar PHPPDO::quote()
. Aproveitar.fonte
Uma resposta de 22-02-2009T121000 pelo caos do usuário não se aplica a todas as perguntas.
Por exemplo, "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS" apresentará uma exceção.
PS: veja o driver do SQL Server para PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx e a função sqlsrv_prepare, que pode vincular parâmetros.
PSS: O que também não o ajudou com a consulta acima;)
fonte
http://php.net/manual/en/function.mssql-query.php
Para quem ainda usa essas funções mssql_ *, lembre-se de que elas foram removidas do PHP a partir da v7.0.0. Então, isso significa que você eventualmente terá que reescrever seu código de modelo para usar a biblioteca PDO, sqlsrv_ * etc. Se você estiver procurando por algo com um método "citando / escapando", eu recomendaria PDO.
fonte
Se você estiver usando PDO, você pode usar o
PDO::quote
método.fonte
Para a conversão para obter os valores hexadecimais em SQL de volta para ASCII, aqui está a solução que encontrei (usando a função do caos do usuário para codificar em hexadecimal)
fonte
É melhor também escapar das palavras reservadas do SQL. Por exemplo:
fonte
Tenho usado isso como uma alternativa de
mysql_real_escape_string()
:fonte
Você poderia rolar sua própria versão
mysql_real_escape_string
, (e melhorá-lo) com a seguinte expressão regular:[\000\010\011\012\015\032\042\047\134\140]
. Isso cuida dos seguintes caracteres: nulo, backspace, tabulação horizontal, nova linha, retorno de carro, substituto, aspas duplas, aspas simples, barra invertida, acento grave. Backspace e tabulação horizontal não são suportados pormysql_real_escape_string
.fonte