MB/8 Club Poland - Klub i forum miłośników samochodów Mercedes-Benz https://forum.w114-115.org.pl/ |
|
Prośba do tych biegłych w PHP + MySQL https://forum.w114-115.org.pl/viewtopic.php?f=1&t=23602 |
Strona 1 z 2 |
Autor: | and6412 [ czw lut 01, 2007 9:57 pm ] |
Tytuł: | Prośba do tych biegłych w PHP + MySQL |
Czesc Panowie mam problem i już zgłupiałem. Albo ja robie jakiś potwornie trywialny błąd i już się tak głęboko gdzieś zasugerowałem, albo czegoś nie wiem. Moze coś czegoś [poprostu nie obsługuje a ja o tym nie wiem. Panowie looknijcie prosze. puszczam do bazy nastepujace zapytanie w transakcji z php: Kod: $query_result=mysql_query(" Zero błędu, zero ostrzeżenia, ale dane się nie wpisują. Transakcja prawdopodobnie zadziałała gdyż w bazie nie pojawia się żaden z 2 rekordów. Za chwilę podmieniam $query_result=mysql_query na echo aby sobie podejrzeć co za zapytanie mi sie wygenerowało. W przegladarce naciskam F5 aby wszystko poszlo na tych samych danych z POST i wyswietla mi sie zapytanie. Nastepnie kopiuje je i uruchamiam w kliencie phpMyAdmin i..... wszystko dziala calkowicie poprawnie. Acha zapomnialem jeszcze dodać że oczywiscie obie tabele są typu InnoDB Pytanie: Dlaczego z poziomu phpmyadmina to dziala a z poziomu php nie ?? Z góry dzieki ![]() PS. Kozystam z zestawu serwerów easyPHP PS2. Wiem że na tym forum to chyba juz tylko kwestii porad miłosnych nie poruszaliśmy wiec liczę na to ze ktos znajacy PHP mi cos podsunie ![]() |
Autor: | Mike_THE_GR8 [ czw lut 01, 2007 11:28 pm ] |
Tytuł: | |
Jako, że mam nieco doświadczenia w tej kwestii zapytam może w ten sposób: a znak kończący komendę jest ustawiony na ';'? To pierwsze, co przyszło mi do głowy. Drugie, co mi się nasuwa, to: zapytanie jest w " więc jest parsowane, a zawiera znak końca linii interpretowany również przez parser PHP, czyli ; -> a może zmień ciapki zamykające i otwierające zapytanie na ' i escape'uj te ' które są w środku zapytania. A po drugie: nie wiem, czy to jest docelowe zapytanie, czy tylko wklejasz taki przykład "na brudno", ale jeśli to jest docelowe, to mocno wskazane jest zrobienie jakiegokolwiek escape'owania i zabezpieczania danych wejściowych, zwłaszcza przekazywanych w POST/GET (zakładam, że wpisywane przez użytkownika gdzieś w serwisie) przed wszelkimi zapędami typu SQL Injection czy też Union Select. |
Autor: | and6412 [ pt lut 02, 2007 4:18 pm ] |
Tytuł: | |
Próbowałem zaminay pazurów z cudzysłowiami i nie działa ;/ A co do parsowania danych wejsciowych to oczywiscie masz racje ale i tak ten formularz jest już za logowaniem wiec jesli user tam juz jest to ma i tak prawie wszystkie mozliwosci. Ale oczywiscie jesli mialo by to byc wystawione do netu to musialo by byc sprawdzane. Ale i tak dzieki <br>Dodano po 57 minutach.:<br> Dało radę ![]() Trzeba było wysyłać zapytania w osobnych wywołaniach funkcji ;/ Kod: function transaction($queries) |
Autor: | Mike_THE_GR8 [ pt lut 02, 2007 8:00 pm ] |
Tytuł: | |
and6412 pisze: A co do parsowania danych wejsciowych to oczywiscie masz racje ale i tak ten formularz jest już za logowaniem wiec jesli user tam juz jest to ma i tak prawie wszystkie mozliwosci. Ale oczywiscie jesli mialo by to byc wystawione do netu to musialo by byc sprawdzane. To takie przyzwyczajenie, pierwsze na co patrzę w kodzie to zabezpieczenia przed podstawowymi atakami. Widziałem już kilka "profesjonalnie" napisanych serwisów, do których byłem proszony o analizę "co się stało, że zniknęło i mam stronę z krzaczkami" ![]() and6412 pisze: Dało radę
![]() Trzeba było wysyłać zapytania w osobnych wywołaniach funkcji ;/ Kod: function transaction($queries) No tak, za małe mam doświadczenie w MySQL5 - rzadko piszę rzeczy wymagające transakcji czy też innych "fjuczerów" zawartych w 5. Póki co 4 stabilniejsza ![]() |
Autor: | and6412 [ pt lut 02, 2007 9:20 pm ] |
Tytuł: | |
Wogole ja gdyby nie to że przeważnie programujac w PHP musisz sie zdać na to co admin ci serwuje na docelowym serwerze (a jest to przewaznie PHP4 z MySQL5) to wogole bym tego gówna jakim jest MySQL nie tykał. Napisałem z kumplem pracę inżynierską nt. porównania MySQL i Postgresa i tak naprawde to PostgreSQL w niczym (no moze dalikatnie poza predkosciom) nie ustepuje MySQL a za to ma prawie wszystkie zabawki które maja "duzi bracia" jak Oracle czy DB2. No choćby to co powyżej to przecież jakaś porażka, co za różnica czy dostanie to w jednym zapytaniu czy w kilku. |
Autor: | Patro [ sob lut 03, 2007 1:11 am ] |
Tytuł: | |
and6412 pisze: puszczam do bazy nastepujace zapytanie w transakcji z php:
Kod: $query_result=mysql_query(" begin; insert into users (user_id,login, first_name,surname) VALUES (".$wiersz[0].",'".$_POST['login']."','".$_POST['firstname']."','".$_POST['surname']."'); insert into passwords (user_id,pass) VALUES (".$wiersz[0].",md5('".$_POST['pass1']."')); commit; "); Zero błędu, zero ostrzeżenia, ale dane się nie wpisują. Transakcja prawdopodobnie zadziałała gdyż w bazie nie pojawia się żaden z 2 rekordów. Spróbowałbym w ten sposób: ____________________________________________________________ //Przypisanie zmiennych tablicowych do zmiennych zdefiniowanych $u_id = $wiersz[0]; //INT $login = $_POST['login']; //VARCHAR(xx) lub TEXT $f_name = $_POST['firstname']; //VARCHAR(xx) lub TEXT $s_name = $_POST['surname']; //VARCHAR(xx) lub TEXT $pass = $_POST['pass1']; //VARCHAR(xx) lub TEXT //Tam gdzie pole jest INT można pominąć apostrofy ($u_id) $query="insert into users (user_id, login, first_name, surname) VALUES ($u_id, '$login', '$f_name', '$s_name')"; $result = mysql_query($query); $query_passwd = "insert into passwords (user_id,pass) VALUES ($u_id, md5('$pass'))"; //lub $query_passwd = "insert into passwords (user_id,pass) VALUES ($u_id, PASSWORD('$pass'))"; $result_passwd = mysql_query($query_passwd); _______________________________________________________ W niektórych wersjach PHP zamiast "$_POST['cos_tam']" może być konieczne użycie "$HTTP_POST_VARS['cos_tam']. Osobiście używam tej drugiej opcji. Przytoczony przez Ciebie sposób mógł nie zadziałać ze względu na użycie apostrofów (') zarówno w definicji kwerendy, jak również w zmiennych sesyjnych oraz POST (tablicowych). |
Autor: | and6412 [ sob lut 03, 2007 9:01 pm ] |
Tytuł: | |
Patro: Szczerze powiedziawszy to nie masz racji w obu kwestiach. 1) Twoj kod oczywiscie dziala tylko że w nim nie używasz transakcji a to o to sie w moim problemie rozchodzilo ![]() 2) Z tego co wiem to ' i " sa zamienne. A z całą pewnoscia powinno sie używać ' w indeksach tablic (choc i bez nich także dziala). |
Autor: | harrier [ sob lut 03, 2007 11:44 pm ] |
Tytuł: | |
Mike_THE_GR8 pisze: czy też innych "fjuczerów" zawartych w 5 Z tego co wiem, bo wspomniałeś o bezpieczeństwie, to sie zope'a używa do bezpiecznego skryptowania, albo pythona... a PIEjczPi, to z sendmailem może jeszcze nie wygra, ale sitowie troche jest. ;p and6412 pisze: no moze dalikatnie poza predkosciom Prędkość prędkością, do małych gównianych, nie wymagających zapytań to oczywiście MySQL jest szybszy, ale PostgereSQL, to już jest wyczesana baza z ficzerami... a na dodatek na licencji BSD, a za MySQL'a trzeba płacić jak się go komercyjnie wykorzystuje. Patro pisze: W niektórych wersjach PHP zamiast "$_POST['cos_tam']" może być konieczne użycie "$HTTP_POST_VARS['cos_tam']. To z tego co kiedyś czytałem to kewsja ustawień w php.ini, ale nie dam sobie członków żadnych odkrajać. ;p and6412 pisze: Z tego co wiem to ' i " sa zamienne.
.... are you sure? ;p Mi się zawsze wydawało, że text zamkniety w ' jest wrzucany dalej dosłownie, a zamknięty w ", jak zawiera jakieś zmienne, to zmienia je na wartości tych zmiennych. <i>harrier kiedyś pisał interface do OpenLDAP'a w PHP i wspomina to jako pasjonujące zadanie... ;p</i> Pozdrawiam, |
Autor: | and6412 [ ndz lut 04, 2007 1:42 pm ] |
Tytuł: | |
harrier pisze: and6412 napisał: no moze dalikatnie poza predkosciom Prędkość prędkością, do małych gównianych, nie wymagających zapytań to oczywiście MySQL jest szybszy, ale PostgereSQL, to już jest wyczesana baza z ficzerami... a na dodatek na licencji BSD, a za MySQL'a trzeba płacić jak się go komercyjnie wykorzystuje. Tu jestes w błędzie. MySQL jest całkowicie darmowy. Jeśli chcesz mozesz wykupić licencję komercyjną która daje Ci support, ale na 100% nie masz takiego obowiązku w żadnym przypadku. harrier pisze: and6412 napisał:
Z tego co wiem to ' i " sa zamienne. .... are you sure? ;p Mi się zawsze wydawało, że text zamkniety w ' jest wrzucany dalej dosłownie, a zamknięty w ", jak zawiera jakieś zmienne, to zmienia je na wartości tych zmiennych. Szczerze powiem żeście mnie zastrzelili w tym momencie. Zawsze używałem ich całkowicie zamiennie i mogłem nawet nie zwrócić uwagi na to o czym piszecie. Sprawdze ![]() |
Autor: | Mike_THE_GR8 [ ndz lut 04, 2007 2:24 pm ] |
Tytuł: | |
and6412 pisze: harrier pisze: and6412 napisał: Z tego co wiem to ' i " sa zamienne. .... are you sure? ;p Mi się zawsze wydawało, że text zamkniety w ' jest wrzucany dalej dosłownie, a zamknięty w ", jak zawiera jakieś zmienne, to zmienia je na wartości tych zmiennych. Szczerze powiem żeście mnie zastrzelili w tym momencie. Zawsze używałem ich całkowicie zamiennie i mogłem nawet nie zwrócić uwagi na to o czym piszecie. Sprawdze ![]() harrier ma rację, jest dokładnie tak jak napisał, dlatego sugerowałem zamianę jednego na drugie ![]() |
Autor: | and6412 [ ndz lut 04, 2007 8:49 pm ] |
Tytuł: | |
Czyli takie dwa stringi sa jednoznaczne?? Kod: $zmienna = 'Mercedes'; |
Autor: | harrier [ ndz lut 04, 2007 10:34 pm ] |
Tytuł: | |
and6412 pisze: Czyli takie dwa stringi sa jednoznaczne?? Dokładnie tak. :) Przecież to łatwo sprawdzić, wrzucasz ten kod do pliku *.php zamknięty w <php> (nie wierze, że nie wiesz jak to się robi ;p) wrzucasz na serwer i odpalasz z przeglądarki. Ja u siebie odpaliłem to w terminalu poleceniem: Cytuj: [22:26]harrier@bsdtruck:~/public_html/files> php -F test.php i dostałem wynik: Cytuj: Marka Mercedes jest najlepsza ;-DMarka Mercedes jest najlepsza ;-D
Pozdrawiam, |
Autor: | Patro [ pn lut 05, 2007 10:56 am ] |
Tytuł: | |
and6412 pisze: Czyli takie dwa stringi sa jednoznaczne??
Kod: $zmienna = 'Mercedes'; echo('Marka '.$zmienna.' jest najlepsza ;-D'); echo("Marka $zmienna jest najlepsza ;-D"); W pierwszym przykładzie możesz zastosować ' i " zamiennie: echo('Marka '.$zmienna.' jest najlepsza ;-D'); = echo("Marka ".$zmienna." jest najlepsza ;-D"); Dodatkowo możesz zastosować coś takiego: echo("Marka %s jest najlepsza", $zmienna); Dlaczego??? Mały test. echo ("Ile procent wolnego czasu poświęcasz swojej Mercedes?"); $zmienna = "99%"; echo ("Swojej Mercedes poświęcam $zmienna wolnego czasu"); //wywali errora echo ("Swojej Mercedes poświęcam " . $zmienna . " wolnego czasu"); //również wywali errora echo ("Swojej Mercedes poświęcam %s wolego czasu", $zmienna); //OK |
Autor: | harrier [ pn lut 05, 2007 11:26 am ] |
Tytuł: | |
Patro: Ale tutaj akurat, o ile dobrze pamiętam, chodzi o użycie znaku '%' w kodzie html generowanym przez PHP. :) Pozdrawiam, |
Autor: | Patro [ pn lut 05, 2007 12:42 pm ] |
Tytuł: | |
harrier pisze: Patro: Ale tutaj akurat, o ile dobrze pamiętam, chodzi o użycie znaku '%' w kodzie html generowanym przez PHP.
![]() Dokłdnie tak. Założyłem poprostu, że PHP będzie wykorzystywany w WWW, a niedawno poprawiałem stronkę, w której pierwotnie znaki specjalne były powodem wysypywania się strony. |
Strona 1 z 2 | Strefa czasowa UTC+02:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |