Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql_escape_string / magic_quotes
Forum PHP.pl > Forum > PHP
My4tic
Jest jakas funkcja odwrotna do mysql_escape_string ?

Wrzucam z CMS'a dane do SQL i pozniej chce wyświetlić tekst ale juz bez znaków unikowych.

Po kilkukrotnym przesłaniu danych mam np takie coś:

Kod
<font face=\"\\&quot;\\\\&quot;\\\\\\\\&quot;\\\\\\\\\\\\\\\\&quot;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\&quot;Tahoma\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\&

dry.gif
dr_bonzo
Nie ma, jest co pradwa strip_slashes ale ono chyba nie dziala identycznie odwrotnie jak mysql_escape_string.

A poza tym masz blad gdzie indziej, bo mysql_escape_string() powinno byc uzywane TYLKO przy wstawianiu stringow do bazy danych, gdy je wyciagasz to dostajesz czysty text, bez zadnych slashy.
My4tic
CMS wrzuca to tak:

Kod
<?php
include ("config.php");

$aNaglowek = mysql_escape_string($aNaglowek);

$aDBLink = @mysql_connect( "$SQLhost", "$SQLlogin", "$SQLpass" );
  if ( !empty( $aDBLink ) )
      {
           if ( mysql_select_db( "$db", $aDBLink ) == True )
           {
             $aSQL = "select * from content";
             $aQResult = mysql_query( $aSQL, $aDBLink );
               if ( $aQResult == True )
               {
               // -------------------------------------------------------- //

$aSQL = "UPDATE content SET naglowek='$aNaglowek' WHERE id='$id'";
$aQResult = mysql_query( $aSQL );


Jak w PhpMyAdmin sprawdze co jest w komórkach to widać ze są slashe.

Pozniej wyświetlam zawartość bazy:

Kod
<?php
include ("admin/config.php");

$aDBLink = mysql_connect( "$SQLhost", "$SQLlogin", "$SQLpass" );
  if ( !empty( $aDBLink ) )
      {
           if ( mysql_select_db( "$db", $aDBLink ) == True )
           {
             $aSQL = "select * from content";
             $aQResult = mysql_query( $aSQL, $aDBLink );
               if ( $aQResult == True )
               {
                  $aSQL = "SELECT id, naglowek, wstep FROM content WHERE id=1";
                   $aQResult = mysql_query( $aSQL );
                   $aRow = mysql_fetch_array( $aQResult );
                   $aNaglowek = $aRow["naglowek"];


i pozniej normalnie:

Kod
print($aNaglowek);


Kurcze sadsmiley02.gif
chmolu
Wyłącz wszystkie magic_quotes w php.ini. Wtedy wystarczy, że uzyjesz mysql_real_escape_string i masz problem z głowy. MySQL nie przechowuje slashów w tabeli, więc absolutnie nie ma potrzeby uzywania strip_slashes().

The magic quotes are the only evil.
My4tic
No niestety dalej ładuje mi slashe do SQL. Uzywam mysql_escape_string. Moze być ta funkcja zamiast mysql_real_escape_string?

Komórka w SQL wygląda tak:

Kod
<font size=\"2\">Mitsubishi Motors i PSA Peugeot Citro&euml;n podpisują umowę dotyczącą produkcji nowych samochod&oacute;w klasy SUV.</font>


a plik php.ini:

Kod
; 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
chmolu
Hmm... dziwne. Sprawdź jeszcze ten kod (może jednak magic_quotes są włączone):

  1. <?php
  2.  
  3. echo "magic_quotes_runtime: ";
  4. echo ini_get('magic_quotes_runtime') . '<br />';
  5. // i analogicznie do pozostałych
  6.  
  7. ?>



Powinieneś uzyć tu funkcji mysql_real_escape_string. To ona jest zalecana dla mysqla. W zasadzie to ktoś może też powiedzieć (np ja winksmiley.jpg ), że używanie natywnych funkcji dostępu do baz danych jest poniekąd złą praktyką. Lepiej użyć do tego jakiejś abstrakcji, lub najlepiej rozszerzenia PDO winksmiley.jpg
My4tic
Okazało sie ze kolejny restart serwera pomógł :-) Pewnie za pierszym razem czegoś nie uruchomiłem ponownie aarambo.gif

Cytat
że używanie natywnych funkcji dostępu do baz danych


Nie mam pojecia co to znaczy winksmiley.jpg ale uwierze na słowo ze tak bedzie lepiej :-)

Dzięki za pomoc.
chmolu
miałem na myśli funkcje typu mysql_*, pg_*, oci*
My4tic
Na localu chodzi wszystko ok ale co jesli na serwerze u providera mam włączone magic_quotes i nie chcą tego wyłączyć? Można rozwiązać to w inny sposób?


----------- Edit --------------

OK. Już sobie poradziłem.



Rozwiązanie:

- plik .htaccess w folderze gdzie uruchamiamy skrypty

Treść .htaccess:
Kod
<IfModule mod_php4.c>
php_flag magic_quotes_gpc off
</IfModule>


Do sprawdzenia czy wszystko działa korzystałem z tego skryptu:

  1. <?php
  2.  
  3. if (get_magic_quotes_gpc()==1) {
  4.  
  5. echo ( "Magic quotes gpc - on" );
  6.  
  7. } else {
  8.  
  9. echo ( "Magic quotes gpc - off" );
  10.  
  11. }
  12.  
  13. ?>

gdyż podany przez Chmolu niestety mi nie działał.

Dzięki wszystkim za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.