Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MSSQL][PHP]Niedziałający warunek sprawdzania uprawnień użytkownika
Adym
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Cześć,

Mam problem z warunkiem spawdzającym uprawnienia użytkownika do wykonania funkcji usunięcia zamówienia, który ma realizować poniższy kod:

  1. public function delete(){
  2. if($this->order_id) {
  3. if($_SESSION['user_type'] == 1 || $_SESSION['userid'] == $order['user_id']) {
  4. $stmt_A = $this->conn->prepare("
  5. DELETE FROM ".$this->orderTable."
  6. WHERE order_id = ?");
  7.  
  8. $order_id = htmlspecialchars(strip_tags($this->order_id));
  9.  
  10. $stmt_A->bind_param("i", $order_id);
  11.  
  12. if ($stmt_A->execute()) {
  13. $stmt_B = $this->conn->prepare("
  14. DELETE FROM ".$this->orderProductsTable."
  15. WHERE order_id = ?");
  16.  
  17. $stmt_B->bind_param("i", $order_id);
  18.  
  19. if ($stmt_B->execute()) {
  20. $stmt_C = $this->conn->prepare("
  21. DELETE FROM ".$this->orderRelationsTable."
  22. WHERE relation_order_id = ?");
  23.  
  24. $stmt_C->bind_param("i", $order_id);
  25. }
  26. if ($stmt_C->execute()) {
  27. return true;
  28. }
  29. }
  30. }
  31. }
  32. else {return false;}
  33. }

Na początku sprawdzam czy funkcja została "nakarmiona" numerem id zamówienia (order_id) a później czy zalogowany użytkownik jest adminem ($_SESSION['user_type'] == 1) albo czy jest autorem kasowanego zamówienia ($_SESSION['userid'] == $order['user_id']). Jeżeli któryś z tych warunków jest prawdziwy funkcja powinna przejść dalej. W moim przypadku mimo tego warunku użytkownik albo kasuje wszystko albo admin nie może kasować. Nie wiem co jest przyczyną takiego działania. Czy ktoś może mi wytłumaczyć co robię źle?

Pozdrawiam

Ten post edytował Adym 8.02.2021, 10:25:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Nigdzie w tej funkcji nie widze by $order byla ustawiana. Zmienne w magiczny sposob nie pojawiaja sie w funkcjach.

Tak ciezko sprawdzic przy uzyciu VAR_DUMP czy zmienne zawieraja to co myslisz ze zawieraja?
Tak ciezko wlaczyc wyswietlanie wszystkich bledow by na ekranie tudziez w logach zobaczyc od razu co jest nie tak?
Go to the top of the page
+Quote Post
trueblue
post
Post #3





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A swoją drogą, dlaczego nie masz pozakładanych relacji pomiędzy tabelą orderTable, a orderProductsTable oraz orderRelationsTable? Wystarczyłoby wtedy usuwać wyłączenie rekord z tabeli orderTable.
Go to the top of the page
+Quote Post
Adym
post
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


@Nospor, nie bez przyczyny piszę w dziale przedszkole. Proszę więc się nie spinać. Sprawdzę co mi ten var_dump wyrzuca (nie znałem go wcześniej).


@trueblue masz rację, rzeczywiście mogę tak zrobić.



Ten post edytował Adym 8.02.2021, 12:37:18
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Sie nie spinam. Tez kiedys zaczynalem. Jednak zamiast leciec na forum z kazda pierda, najpierw sam sprawdzalem co zawieraja zmienne. Znajomosc var_dump jest ti nie potrzebna. moze byc zwykle ECHO czy PRINT.
Go to the top of the page
+Quote Post
gino
post
Post #6





Grupa: Zarejestrowani
Postów: 324
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


Cytat
Nigdzie w tej funkcji nie widze by $order byla ustawiana. Zmienne w magiczny sposob nie pojawiaja sie w funkcjach.


Chyba, że to jest OOP i $this->order_id to jakaś właściwość klasy, bo jeszcze to public function...

edit: error mihi @nospor, bo świtało już, jak się kładłem, ale to nie zienia faktu, że to wycinek jakiejś klasy, dziwny trochę u człowieka który początkuje jak sam pisze (IMG:style_emoticons/default/smile.gif)

Ten post edytował gino 8.02.2021, 13:27:50
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




gino ja mowilem o zmiennej $order a nie $this->order_id. Wyraznie napisalem (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Adym
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Tak jak małe dziecko uczy sie mówić naśladując zasłyszane słowa od rodziców tak ja uczę się php wykorzystując fragmenty kodu bardziej doświadczonych kolegów.

Rzeczywiście nie mam z czym porównywać drugiego warunku. Pytanie czy lepiej zrobić teraz zapytanie do bazy i przez SELECTa pobrać user_id autora danego zapotrzebowania (mając order_id) i porównać czy jest on taki sam jak zalogowanego użytkownika czy też jest jakieś inne prostsze rozwiązanie?
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Tak jak małe dziecko uczy sie mówić naśladując zasłyszane słowa od rodziców tak ja uczę się php wykorzystując fragmenty kodu bardziej doświadczonych kolegów.

Tylko ze male dziecko, z racji faktu ze nie ma wybory, to musi tak robic. Ty zdaje sie umiesz czytac i jakies podstawy wpierw bys mogl ogarnac sam, nie sadzisz?

Skoro to $order gdzies tam przeciez masz, to nie mozesz go przekazac do funkcji delete() jako parametr? Ewentualnie jako wlasciwosc klasy na podobnej zasadzie co $this->order_id
Go to the top of the page
+Quote Post
Adym
post
Post #10





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Kliknięcie przycisku usuń wyzwala skrypt:

  1. $(document).on('click', '.delete', function(){
  2. var orderId = $(this).attr("id");
  3. var action = "orderDelete";
  4. if(confirm("Czy jesteś pewien, że chcesz usunąć to zapotrzebowanie?")) {
  5. $.ajax({
  6. url:"manage_orders.php",
  7. method:"POST",
  8. data:{orderId:orderId, action:action},
  9. success:function(data) {
  10. orderData.ajax.reload();
  11. }
  12. })
  13. } else {
  14. return false;
  15. }
  16. });
  17. });


Potwierdzenie powoduje:

  1. <?php
  2. include_once 'config/Database.php';
  3. include_once 'class/Order.php';
  4. $database = new Database();
  5. $db = $database->getConnection();
  6.  
  7. $order = new Order($db);
  8.  
  9. if (!empty($_POST['action']) && $_POST['action'] == 'orderDelete') {
  10. $order->order_id = (isset($_POST['orderId']) && $_POST['orderId']) ? $_POST['orderId'] : '0';
  11. $order->delete();
  12. }
  13. ?>



i jak tu wcisnąć jeszcze id autora zamówienia?

Ten post edytował Adym 8.02.2021, 13:55:21
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Czyli jednak nigdzie nie masz rekordu $order calego. Z racji faktu ze w funkcji uzywales $order sadzilem ze jednak takowy masz. W takim wypadku musisz niestety pobrac go z bazy wpierw.
Go to the top of the page
+Quote Post
Adym
post
Post #12





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Cześć,

Warunek już działa (IMG:style_emoticons/default/smile.gif) . Rzeczywiście zmienna z którą porównywałem $_SESSION['userid'] nie była zdefiniowana. Trochę to trwało ale się udało i frustracja zamieniła się w satysfakcję (IMG:style_emoticons/default/smile.gif) . Czy coś jeszcze jest do poprawienia wg was?:


  1. public function delete(){
  2. if($this->order_id) {
  3. $sqlQuery = "
  4. SELECT user_id
  5. FROM ". $this->orderTable ."
  6. WHERE order_id = '". $this->order_id ."' ";
  7.  
  8. $stmt = $this->conn->prepare($sqlQuery);
  9. $stmt->execute();
  10. $result = $stmt->get_result();
  11. $order_row = $result->fetch_assoc();
  12.  
  13. if($_SESSION['user_type'] == 1 || $_SESSION['userid'] == $order_row['user_id']) {
  14. $order_id = htmlspecialchars(strip_tags($this->order_id));
  15.  
  16. $stmt_A = $this->conn->prepare("
  17. DELETE FROM ".$this->orderTable."
  18. WHERE order_id = ?");
  19.  
  20. $stmt_A->bind_param("i", $order_id);
  21.  
  22. if ($stmt_A->execute()) {
  23. $stmt_B = $this->conn->prepare("
  24. DELETE FROM ".$this->orderProductsTable."
  25. WHERE order_id = ?");
  26.  
  27. $stmt_B->bind_param("i", $order_id);
  28.  
  29. if ($stmt_B->execute()) {
  30. $stmt_C = $this->conn->prepare("
  31. DELETE FROM ".$this->orderRelationsTable."
  32. WHERE relation_order_id = ?");
  33.  
  34. $stmt_C->bind_param("i", $order_id);
  35. }
  36. if ($stmt_C->execute()) {
  37. return true;
  38. }
  39. }
  40. }
  41. }
  42. }


Ten post edytował Adym 10.02.2021, 12:41:57
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cos do poprawy? Hm... wszystko?
Pomijajac fakt, ze mega mieszasz logike i odpowiedzialnosc klas, to:

nie
$order_id = htmlspecialchars(strip_tags($this->order_id));

a:
$order_id = (int) $this->order_id);
Id to liczba i jako liczba masz to przedstawiac a zadne inne bezsensowne filtrowania nie beda potrzebne.

No i czemu do jednego zapytania to zabezpieczasz a do innego juz nie?
Czemu w jednym bindujesz a w innym juz walisz jako string?

nie ==
a ===

Jak juz zwracasz TRUE gdy sie powiedzie, to badz konsekwentny i zwracaj FALSE gdy sie nie powiedzie
Go to the top of the page
+Quote Post
Adym
post
Post #14





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Czy teraz lepiej czy coś jeszcze razi Cię w oczy (IMG:style_emoticons/default/wink.gif) ?

  1. public function delete(){
  2. if($this->order_id) {
  3. $order_id = $this->order_id;
  4.  
  5. $stmt = $this->conn->prepare(" SELECT user_id FROM ". $this->orderTable ." WHERE order_id = ? ");
  6. $stmt->bind_param("i", $order_id);
  7. $stmt->execute();
  8. $result = $stmt->get_result();
  9. $order_row = $result->fetch_assoc();
  10.  
  11. if($_SESSION['user_type'] === 1 || $_SESSION['userid'] === $order_row['user_id']) {
  12. $stmt_A = $this->conn->prepare("DELETE FROM ".$this->orderTable." WHERE order_id = ?");
  13. $stmt_A->bind_param("i", $order_id);
  14.  
  15. if ($stmt_A->execute()) {
  16. $stmt_B = $this->conn->prepare("DELETE FROM ".$this->orderProductsTable." WHERE order_id = ?");
  17. $stmt_B->bind_param("i", $order_id);
  18.  
  19. if ($stmt_B->execute()) {
  20. $stmt_C = $this->conn->prepare("
  21. DELETE FROM ".$this->orderRelationsTable."
  22. WHERE relation_order_id = ?");
  23.  
  24. $stmt_C->bind_param("i", $order_id);
  25. }
  26. if ($stmt_C->execute()) {
  27. return true;
  28. } else {return false;}
  29. }
  30. }
  31. }
  32. }


Ten post edytował Adym 10.02.2021, 13:01:53
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




to jest zbedne
$order_id = $this->order_id;

Dzialaja bezposrednio na $this->order_id


return false leci tylko w okreslonym wypadku. Po drodze jest cala masa IFow, ktore nie zwracaja nic. Zamiast ten else co dodales, daj poprostu
return false
na samym koncu funkcji

Unikaj zagniezdzen.

Zamiast kobylastdego IF
if($this->order_id) {
.......
}


daj tak

if(!$this->order_id) {
return false;
}
......
Go to the top of the page
+Quote Post
Adym
post
Post #16





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 16.12.2020

Ostrzeżenie: (0%)
-----


Dzięki za pomoc NOSPOR. Zdaję sobie oczywiście sprawę, że kod można pewnie napisać lepiej, wydajniej, ładniej ale do tego będę dochodził małymi kroczkami.

Pozdrawiam!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 07:11