Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z addslashes
Forum PHP.pl > Forum > Przedszkole
cezarek
Witam,
mam taki kod:
  1. $id= addslashes(trim($_POST["id"]));
  2. $zmienna = addslashes(trim($_POST["zmienna"]));
  3.  
  4. $zapytanie = "update tabela
  5. set zmienna = '$zmienna'
  6. where id= '$id'";
  7. $wynik = mysql_query($zapytanie) or die ("Błąd nr ".mysql_errno().": ".mysql_error()."!");
  8. echo "Zmienna ".stripslashes($zmienna)." została zmieniona.";

gdzie $zmienna to ścieżka dostępu do pliku (np. "C:\Documents and Settings\User\Moje dokumenty\Moja muzyka\fotki\"). I problem polega na tym, że do bazy zapisuje się wartość bez dodanych backslash'y i po wyciągnięciu tego z bazy za pomocą stripslashes otrzymuję ścieżkę w postaci "C:Documents and SettingsUserMoje dokumentyMoja muzykafotki". Natomiast ostatnia linia powyższego kodu wyświetla zmienną w postaci prawidłowej, czyli "C:\Documents and Settings\User\Moje dokumenty\Moja muzyka\fotki". Czyli funkcja addslashes działa dopóki nie dodaję danych do bazy.
W czym tkwi problem? Co robię źle?

Pozdrawiam
cezarek
wookieb
1) Nie addslashes bo do tego nie służy
2) mysql_real_escape_string
3) Nie stripslashes.
cezarek
Czyli zamiast addslashes powinienem użyć mysql_real_escape_string, a stripslashes wyrzucić, bo jest niepotrzebne? W ten sposób gdy w zmiennej pojawi się np. cudzysłów znów robi się zamieszanie.
wookieb
Cytat(cezarek @ 14.11.2010, 22:08:38 ) *
Czyli zamiast addslashes powinienem użyć mysql_real_escape_string, a stripslashes wyrzucić, bo jest niepotrzebne?

Tak
Cytat(cezarek @ 14.11.2010, 22:08:38 ) *
W ten sposób gdy w zmiennej pojawi się np. cudzysłów znów robi się zamieszanie.

Nie
cezarek
Być może znów popełniam jakiś błąd, ale gdy wyciągam tą zmienną z cudzysłowem z bazy i umieszczam w polu input
  1. <input name="zmienna" value="<?= $zmienna; ?>">

aby ją wyedytować, to nic mi się nie pojawia. Gdy tą zmienną umieszczam gdzieś np. między znacznikami <p></p> wszystko jest, jak być powinno.

Poza tym dlaczego piszesz, że addslashes nie do tego służy? Między innymi tutaj utaj http://forum.php.pl/index.php?showtopic=158959, http://forum.php.pl/index.php?showtopic=157979 polecana jest właśnie ta funkcja wraz z stripslashes. Sam z książek stosowałem właśnie te funkcje. Jeśli dobrze rozumiem manual, to addslashes właśnie do tego celu powinna być używana.

Najdziwniejsze jest to, że kod, który podałem na początku działa na serwerze webd.pl, a na dreamhost.com nie.
Fifi209
Do zabezpieczenia przez SQL Injection służy wspomniany wyżej mysql_real_escape_string. To, że ktoś używa addslashes w tym celu, oznacza tylko, że przeczytał zły kurs/książkę lub źle zinterpretował manual.
wookieb
Wszystko jest ok, ale jeżeli chcesz dodać takie pole do atrybutu VALUE w inputcie użyj http://pl2.php.net/html_entities
Warto pamiętać o podaniu kodowania jako 3 argument.
thek
To, że używasz starych kursów widać poprzez <?= bo choć jest to poprawne, oznacza, że używasz dyrektywy, która powoduje problemy z XML.

Addslashes jest podawane w kursach, bo wspomniana przez chłopaków funkcja nie jest staruszkiem aż takim ( wyszła w gałęzi 4.3, czyli ostatniej z serii PHP4 ) i wcześniej tak się robiło. Ale trzeba było uważać na magic_quotes_gpc (które robi właśnie addslashes, przez co możesz je podwójnie wykonać, nie wiedząc o tym) i inne syfy, więc nie jest to lubiane i akceptowane rozwiązanie w chwili obecnej, gdy nigdy nie wiesz czym Cię uraczy hosting w php.ini przy zakupie serwera i czy da się prosto pewne rzeczy włączyć/wyłączyć czy też nie. W efekcie musisz sprawdzać czy owa, nienawidzona prze wielu, dyrektywa jest włączona i wedle niej aplikować bądź nie addslashes, a sam widzisz, że to mało eleganckie, a przede wszystkim upierdliwe.

Jeśli walisz cokolwiek do value formularzy to zawsze może zajść konflikt apostrofów (pojedynczych i podwójnych) i dlatego wrzucanie tam treści zakończy się problemami. Tekst zobaczysz w Źródle strony, ale nie na samej stronie, bo przeglądarka tego nie zinterpretuje dobrze. Tutaj trzeba użyć wspomnianej html_entities z właściwą dla Ciebie w skrypcie flagą quotów (nie zawsze jest to wartość domyślna).
cezarek
Super, wszystko hula jak należy. Wielkie dzięki, chłopaki za pomoc i wyjaśnienie. Po odpowiedzi wookieb miałem właśnie pytać o to dlaczego nie addslashes, ale w pracy nie miałem czasu się zalogować - dzięki thek.
Fakt podstawy PHP poznawałem kilka lat temu i przez dłuższy czas nie dłubałem nic. Trochę się pozmieniało.
A jeśli chodzi o "<?=", to lepiej używać zwykłego "<? echo"?
Mephistofeles
Tak, ponieważ short tages są czasami wyłączone, a poza tym powodują błędy przy zagnieżdżaniu XMLa.
Fifi209
Osobiście używam "pełnej" wersji czyli: <?php
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.