Pergunta

Estou tendo problemas escapando / descascamento cordas com PHP / MySQL -. Há sempre parece ser barras redundantes


Vamos dar a seguinte cadeia como um exemplo:

<span style="text-decoration:underline;">underline</span>


Ao adicionar uma string para o banco de dados, eu estou fugindo com mysql_real_escape_string() eo seguinte é armazenada no banco de dados ( Editar : verificado este, consultando o banco de dados diretamente com aplicativo mysql):

<span style=\\\"text-decoration:underline;\\\">underline</span>


Ao ler de volta para fora do banco de dados, eu estou passando a corda através stripslashes() eo seguinte é devolvido:

<span style=\"text-decoration:underline;\">underline</span>


Desde as cotações ainda estão escapou, ele quebra o html eo texto não está sublinhado.


  1. Por que é mysql_real_escape_string() adição de três barras e stripslashes() removendo duas barras? Eu esperaria que eles tanto para adicionar / remover uma barra.
  2. Como posso evitar que isso aconteça?
  3. Am I aproximando esta a maneira correta?
Foi útil?

Solução

Melhor Solução

Em seu arquivo php.ini, as probabilidades são que a magic_quotes_gpc directiva está ativado. Este deve ser desativado por motivos de segurança. Se você não tem acesso ao arquivo php.ini (ex. Em um servidor compartilhado), você sempre pode fazer o mesmo usando uma diretiva .htaccess (assumindo que este é um servidor apache).

Em seu php.ini

magic_quotes_gpc Off

Em um arquivo .htaccess:

php_flag magic_quotes_gpc Off

Por que isso está acontecendo?

A razão que esta está acontecendo é devido ao seguinte curso de lógica.

  1. Uma cadeia que as necessidades que se escapa é enviado para o servidor.
    • This is my string. It's awesome.
  2. Magic Quotes escapa o apóstrofo antes que ele chegue ao seu código.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string agora tem dois personagens de escapar, o \\ barra invertida, bem como a \' apóstrofo.
    • This is my string. It\\\'s awesome
  4. Esta nova string escapou super é armazenado no banco de dados.
  5. Quando a corda é recuperado do banco de dados, se do passado para stripslashes. Isso remove os dois escapes adicionou na etapa 3, mas desde que uma das barras invertidas foi escapou stripslashes pensa que pertence.
    • This is my string. It\'s awesome

Este problema pode realmente sair da mão quando você voltar a apresentar essas seqüências no banco de dados, já que cada vez que o número de barras invertidas multiplica.

Alternativa Solução

Uma alternativa rápida e fácil seria a de simplesmente remover as barras adicionadas por magic_quotes antes de passar a corda para mysql_real_escape_string.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

Outras dicas

Ao adicionar uma string para o banco de dados, eu estou fugindo com mysql_real_escape_string() eo seguinte é armazenada no banco de dados:

<span style=\\\"text-decoration:underline;\\\">underline</span>

Não, não é. Quando você escapar cordas em uma consulta SQL, é apenas para transportar os dados na consulta. O banco de dados analisa a consulta e armazena os dados no banco de dados, sem quaisquer cortes extras. Assim, quando você recuperar dados do banco de dados, você deve não nada unescape. É um equívoco comum.

Se você achar que há barras excesso na saída, você provavelmente tem magic quotes ligado. Transformá-los fora .

Editar:

mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar                                                         |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> | 
+-------------------------------------------------------------+
1 row in set (0.00 sec)

Como você pode ver, a consulta tem mais um nível de escapar do que os dados aparecem no banco de dados e, consequentemente, como ele sai ao consultar por ele. No seu caso, o que é provavelmente acontecendo, é que você tem magic quotes ligados e então você escapar strings antes de integrá-las em uma consulta. Isto leva a dobrar-escapar, adulteração seus dados. A solução apropriada é manter escapar strings como você faz, mas desligar magic quotes. E não fazer nada sobre os dados à medida que sai da base de dados. Tenha em atenção que os dados já nas necessidades do sistema para ser limpo em primeiro lugar.

Se get_magic_quotes_gpc() está desligado no SERVER, por isso só podemos usar

$data= mysql_real_escape_string($_POST['data']);

Se get_magic_quotes_gpc() está no SERVER, temos que usar

$data= mysql_real_escape_string(stripslashes($_POST['data']));

caso contrário adicionar duas barras invertidas com os seus dados.

Também uma outra solução é que podemos usar stripslashes($data) enquanto buscar a partir datadase Se usarmos apenas usar mysql_real_escape_string($_POST['data']);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top