cezarek
14.11.2010, 21:44:48
Witam,
mam taki kod:
$zapytanie = "update tabela
set zmienna = '$zmienna'
where id= '$id'";
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
14.11.2010, 21:47:25
1) Nie addslashes bo do tego nie służy
2)
mysql_real_escape_string3) Nie stripslashes.
cezarek
14.11.2010, 22:08:38
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
14.11.2010, 22:11:06
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
14.11.2010, 22:18:02
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
<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
15.11.2010, 00:14:03
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
15.11.2010, 07:01:46
Wszystko jest ok, ale jeżeli chcesz dodać takie pole do atrybutu VALUE w inputcie użyj
http://pl2.php.net/html_entitiesWarto pamiętać o podaniu kodowania jako 3 argument.
thek
15.11.2010, 14:15:06
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
15.11.2010, 20:59:52
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
15.11.2010, 21:09:47
Tak, ponieważ short tages są czasami wyłączone, a poza tym powodują błędy przy zagnieżdżaniu XMLa.
Fifi209
15.11.2010, 22:02:15
Osobiście używam "pełnej" wersji czyli: <?php