mysql_real_escape_string e orçamento único

Estou bastante frustrado. Eu quero inserir no meu database com citações simples – por exemplo, O’Connor.

Então, ao inserir no database, eu faço:

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

E então insiro $ lname no database.

Quando está no database, ele aparece como O \ ‘Connor.

Então, se eu devesse lembrar esse último nome no meu aplicativo web, terei que usar:

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

Tudo isso parece funcionar bem. No entanto, eu tenho uma function de pesquisa que procurará os nomes dos sobrenomes e exibirá os resultados. Quando procuro, tenho que procurar O \ ‘Connor para obter quaisquer resultados.

Você vê, depois de pesquisar, a checkbox de texto armazena automaticamente o valor do que foi buscado (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 busco, eu tenho que usar “O \ ‘Connor” e, depois de pesquisar, o valor na checkbox de texto se torna “O \\\\’ Connor”

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

EDITAR:

Aqui está meu arquivo php5.ini, referente a citações mágicas:

  ; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = On ; Magic quotes for runtime-generated data, eg 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, meu site está hospedado no GoDaddy e não tenho permissão para editar o arquivo 🙁

Parece que Magic Quotes está habilitado na sua configuração do PHP.

Para verificar se ele realmente está habilitado:

 echo get_magic_quotes_gpc(); 

Para desabilitar , edite seu arquivo php.ini:

 ; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, eg 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 .htaccess:

 php_flag magic_quotes_gpc Off 

Aspas mágicas estão habilitadas. O que isso significa é que qualquer coisa colocada em postagem ou get ou outros locais semelhantes é escapada automaticamente para que os programadores iniciais não tenham que se preocupar tanto com isso. Está obsoleto na versão atual do PHP, se eu me lembro corretamente.

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

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

Você pode querer modificar isso ainda para envolver dados não-numéricos entre aspas, que é uma variação comum, mas acho melhor colocá-las manualmente.

Pouca edição para a function fixinput para verificar se a sua instalação do PHP realmente possui corda de escape real (versões 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 está no database, ele aparece como O \ ‘Connor.

Então, se eu devesse lembrar esse último nome no meu aplicativo web, terei que usar:

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

Errado! Quando você escapa de strings com mysql_real_escape_string , eles são apenas escapados na consulta. O database interpreta a consulta, então os dados acabam no database sem nenhum caractere de escape. Você não precisa usar stripslashes ao extrair dados do database. Se você acha que sim, isso significa que os dados em sua base de dados são destruídos. Muito provavelmente porque você tem citações mágicas ativadas.

Você deve:

  • Desative as citações mágicas ou reverte seu efeito globalmente. Consulte o manual para obter detalhes.
  • Ou use parâmetros vinculados (A melhor solução) ou escorra todas as variables ​​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ê tira do database.

Em particular, não faça uma function para o fixinput e as variantes que estão listadas em algumas das respostas aqui. É a maneira errada de resolver o problema, porque irá estragar qualquer informação que não provenha de um pedido http.

Não consigo verificar se get_magic_quotes_gpc está ligado / desligado.

Eu apenas $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); então, se não houver nenhum texto citado, ele não tira barras oblíquas. Se houver citações, irá retirá-las.

e isso funciona maravilhas para mim!

Tudo o que você precisa fazer é pegar a consulta de pesquisa, mysql_real_escape_string, e deve estar perfeitamente bem. A melhor maneira de fazer isso, porém, é nunca armazenar ele escapou e, em vez disso, simplesmente escaping dele, tudo está no database.

Em vez disso, faça isso:

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