Trimitere comanda fara inregistrare.

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

bullex
PHPRomania Supporter
Mesaje: 13
Membru din: Joi Dec 06, 2012 3:49 pm

Trimitere comanda fara inregistrare.

Mesajde bullex » Lun Mai 13, 2013 3:23 pm

Salutare,

Numele meu este Bogdan , ma ocup de administrarea unui magazin online, site-ul este scris de la zero in php/sql/html/javascript, nu uitilizeaza o platforma cms cunoscuta.
Intampin o mare problema intrucat exista un user care reuseste sa lanseze o comanda fara sa fie inregistrat, in tabela in care sunt salvate comenzile exista o coloana cu userul care a creat comanda, aceasta valoare este preluata automat din tabela in care sunt salvati userii. problema este ca valoarea pentru userul respectiv este 0 , el practic nu este intregistrat pe site (coloana id din tabela useri este auto increment si nu exista user cu valoarea 0 inregistrat).

Am verificat toate fisierele php ce sunt apelate in momentul lansarii unei comenzi si nici un fisiere nu poate fi executat fara sa fie inregistrat.
Va rog sa ma ajutati cu cateva indicii sau verificari pe care le-as putea face pe site in vederea remedierii acestei erori.

Va multumesc!



toxicristi
PHPRomania Supporter
Mesaje: 26
Membru din: Vin Apr 26, 2013 6:10 pm

Re: Trimitere comanda fara inregistrare.

Mesajde toxicristi » Lun Mai 13, 2013 3:41 pm

Cel mai simplu ar fi ca in phpMyAdmin sau alt soft de administrare mysql sa setezi un constraint foreign key pe coloana 'UserID' din tabelul de comenzi cu referinta la coloana 'ID' din tabelul useri.

Asta va limita ID-urile din coloana UserID la un id de user existent, iar cand cineva incearca sa creeze o comanda fara sa fie autentificat va primi o eroare.

Cod: Selectaţi tot

ALTER TABLE orders 
    ADD CONSTRAINT fk_orders_users
    FOREIGN KEY (UserID)
    REFERENCES users (UserID) ;


Dar sigur scriptul nu functioneaza corect, din moment ce cineva reuseste sa creeze o comanda nefiind autentificat.
Ultima oară modificat Lun Mai 13, 2013 3:48 pm de către toxicristi, modificat de 2 ori în total.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Trimitere comanda fara inregistrare.

Mesajde Birkoff » Lun Mai 13, 2013 3:45 pm

testeaza daca poti in felul urmator:

- pagina care salveaza comanda in bd primeste datele dintr-un formular
- copiezi formularul (doar codul html -> view source din browser) intr-o pagina noua sa zicem comanda.html
- modifici la acest formular form action="calea catre scriptul care salveaza comanda de la tine de pe server"
- salvezi comanda.html pe un alt server (de exemplu pe pc-ul local unde faci teste)
- deschizi comanda.html in browser si dai send -> datele ar trebui sa se duca pe server si acolo daca nu sunt verificarile bine facute ar trebui sa vezi comanda in baza de date cu user 0

in functie de erorile sau mesajele care iti apar cand dai send iti pot zice daca de acolo e buba sau din alta parte...
(ideea e ca formularul de comanda sa fie separat de restul site-ului si sa incerci sa trimiti date la site-ul tau din exterior sa vezi ce se intampla)
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

toxicristi
PHPRomania Supporter
Mesaje: 26
Membru din: Vin Apr 26, 2013 6:10 pm

Re: Trimitere comanda fara inregistrare.

Mesajde toxicristi » Lun Mai 13, 2013 3:57 pm

Inainte de a urma pasii scrisi de birkoff, nu uita sa dai logout. Altfel comanda se va executa cu userul autentificat in browserul tau, chiar daca formularul e pe alt server.

badtiger
Senior Member
Mesaje: 598
Membru din: Vin Noi 03, 2006 7:54 pm
Contact:

Re: Trimitere comanda fara inregistrare.

Mesajde badtiger » Lun Mai 13, 2013 8:41 pm

Eu cred ca problema pleaca de la modul in care testezi daca userul este logat
Scenariu:
initializezi sesiunea userului pentru a disparea eventualele atentionari
iar verificarea o faci cu is_numeric care la '' nu returneaza FALSE
iar 0 apare ca "bla bla bla" coloanele int au nevoie de val numerica

Pirahna
Senior Member
Mesaje: 5985
Membru din: Dum Aug 22, 2004 2:04 am
Localitate: la birou
Contact:

Re: Trimitere comanda fara inregistrare.

Mesajde Pirahna » Mar Mai 14, 2013 5:28 am

Pune-i un if la campul respectiv, verifica folosind is_numeric(), vezi daca valoarea > 0 si poate ii aplici si un (int) inainte sa te asiguri ca nu introduci ceva cu virgula.

Sau aplici metoda cu constraint, mult mai eleganta, propusa de toxicristi.

ViezuREX
Senior Member
Mesaje: 502
Membru din: Joi Dec 13, 2012 1:35 pm

Re: Trimitere comanda fara inregistrare.

Mesajde ViezuREX » Mar Mai 14, 2013 9:00 am

Vin si eu cu o intrebare, pe langa celelalte sugestii date mai sus. Trimiti cumva user_id-ul prin formular? sau il ai in $_SESSION sau alta variabila server-side?

Si inca ceva ... vezi sa nu ai o vulnerabilitate la SQL-Injection ca ar putea fi mult mai rau decat ca iti face cineva comanda aiurea.

bullex
PHPRomania Supporter
Mesaje: 13
Membru din: Joi Dec 06, 2012 3:49 pm

Re: Trimitere comanda fara inregistrare.

Mesajde bullex » Mar Mai 14, 2013 11:33 am

Va multumesc foarte mult pentru ajutorul oferit , este pentru prima data cand postez pe acest forum si am fost placut surprins de numarul de raspunsuri pe care l-am primit.

Problema am rezolvat-o, am efectuat testul pe care mi l-a recomandat Birkoff si de acolo era problema. Exista un form in pagina ce afiseaza produsele adaugate in cosul de cumparatiri si prin acest form sunt transmise datele catre pagina de confirmare a comanzii unde erau inserate in tebele. Am pus un " if ( mysql_num_rows($q) >= 1 ) " in aceasta pagina pentu a verifica daca userul este inregistrat , exista doar un ""if ( isset($_POST['trimite']) ) " si in aceste conditii userul putea transmite date printr-un form direct catre aceea pagina fara sa fie inregistrat.

@ViezuREX - user_id nu este trnsmis printr-un form , este intregistrat in tabela cu useri de unde era si preluat pentru a fi introdus in tabela de comenzi, datele transmise prin form sunt securizate cu "strip_tags(mysql_real_escape_string(trim($_POST['continut'])))".


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 4 vizitatori