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("
                   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.
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)
{
   $err = false;
   mysql_query('BEGIN');
   
   while ($query=each($queries))
   {
     $err=mysql_query($query[1]);
   }
   if(!$err) {
       mysql_query('ROLLBACK');
       return 0;
   } else {
       mysql_query('COMMIT');
       return 1;
   }
}

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" [zlosnik]


and6412 pisze:
Dało radę ;-)
Trzeba było wysyłać zapytania w osobnych wywołaniach funkcji ;/
Kod:
function transaction($queries)
{
   $err = false;
   mysql_query('BEGIN');
   
   while ($query=each($queries))
   {
     $err=mysql_query($query[1]);
   }
   if(!$err) {
       mysql_query('ROLLBACK');
       return 0;
   } else {
       mysql_query('COMMIT');
       return 1;
   }
}


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 [zlosnik]

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 [zlosnik]

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';

echo('Marka '.$zmienna.' jest najlepsza ;-D');
echo("Marka $zmienna jest najlepsza ;-D");

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/