Pergunta

Estou bastante frustrado. Eu quero ser capaz de inserir em meus nomes de banco de dados com aspas simples -. Por exemplo, O'Connor

Assim, ao inserir na base de dados, eu faço:

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

E então eu inserir $ lname para o DB.

Quando se está no DB, ele aparece como O \ 'Connor.

Então, se eu fosse para lembrar que o último nome na minha aplicação web, vou ter de usar:

 $lname = stripslashes($r["lname"]);

Isso tudo parece funcionar bem. No entanto, tenho uma função de pesquisa que irá procurar sobrenomes e exibir os resultados. Quando eu procurar, eu tenho que procurar O \ 'Connor, a fim de obter quaisquer resultados.

Você vê, depois de eu procurar, a caixa de texto armazena automaticamente o valor do que estava apenas procurou (usando sessões). Então meu código é o seguinte:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

Como eu disse antes, quando eu procuro, eu tenho que usar "O \ 'Connor", e então depois que procuro, o valor na caixa de texto torna-se "O \\\\' Connor"

Tem sido frustrante tentar descobrir isso. Alguém sabe o que estou fazendo de errado? Obrigado!

EDIT:

Aqui está o meu arquivo php5.ini, sobre magic quotes:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

No entanto, o meu site está hospedado no GoDaddy, e eu não ter permissões para editar o arquivo: (

Foi útil?

Solução

Parece Magic Quotes são ativados em sua configuração do PHP.

Para verificar se ele está realmente habilitado:

echo get_magic_quotes_gpc();

para desativar , editar o arquivo php.ini:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

Ou adicione esta linha ao seu arquivo .htaccess:

php_flag magic_quotes_gpc Off

Outras dicas

Magic Quotes é habilitado. O que isto significa é que qualquer coisa colocada no correio ou obter ou outros locais semelhantes é automaticamente escapou para que programadores iniciantes não tem que se preocupar tanto. Ele está obsoleta na versão atual do PHP, se bem me lembro.

O que você quer fazer para lidar com isso, e tem o script executar o mesmo a partir de qualquer configuração é a seguinte:

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

Você pode querer modificar ainda mais esta para embrulhar dados não numéricos entre aspas, que é uma variação comum, mas acho que é melhor para colocar essas citações manualmente.

Little edição para a função fixinput para verificar se a instalação do PHP tem de facto corda verdadeira fuga (versões mais antigas não):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }

Quando se está no DB, ele aparece como O \ 'Connor.

Então, se eu fosse para lembrar que o último nome na minha aplicação web, vou ter de usar:

 $lname = stripslashes($r["lname"]);

Errado! Quando você escapar strings com mysql_real_escape_string, eles só são escapou na consulta. Os interpreta banco de dados da consulta, para que os dados acaba no banco de dados sem qualquer fuga-caracteres. Você não tem que usar stripslashes ao puxar os dados fora do banco de dados. Se você acha que fazer, então isso significa que os dados em seu banco de dados é mutilado. Muito provavelmente porque você tem magic quotes ligado.

Você deve:

  • Desligue magic quotes ou reverter o seu efeito global. Consulte manual para obter detalhes.
  • De qualquer uso parâmetros vinculados (A melhor solução) ou escapar todas as variáveis ??com mysql_real_escape_string. Você deve fazer isso onde você está construindo a consulta.
  • Não faça nada sobre as coisas que você puxar para fora do banco de dados.

Em particular, não fazer uma função a la a fixinput e variantes que está listado em algumas das respostas aqui. É o caminho errado para resolver o problema, porque vai atrapalhar quaisquer dados que não vêm de um http-request.

Eu não verificar se há get_magic_quotes_gpc é on / off.

Eu só faço $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); por isso, se não há qualquer texto citado ele não vai retirar barras .. se não é citado que vai tira-los fora.

e funciona maravilhas para mim!

Tudo que você precisa fazer é tomar a consulta de pesquisa, mysql_real_escape_string-lo, e ele deve estar perfeitamente bem. A melhor maneira de fazer isso, porém, é a nunca armazená-lo escapou, e simplesmente fugir dela tudo é vai para o banco de dados.

Em vez disso, faça o seguinte:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top