• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak wpisywać zmienne $_SESSION w kwerendach php

Object Storage Arubacloud
0 głosów
391 wizyt
pytanie zadane 20 sierpnia 2018 w PHP przez Śwież4k Bywalec (2,570 p.)

Siema, mam taką kwerendę, ale mi nie działa. Nigdzie w internecie, ani  w doc nie mogłem znaleźć jak prawidłowo wpisać zmienne do kwerendy, aby się ona wykonała. Proszę o podpowiedź

mysqli_query($conn, "INSERT INTO `rozmowa_nr_$_SESSION['id']` VALUES('$_SESSION['id']', '$_SESSION['nicky']')");

Z góry dzięki za każdą odpowiedź.

2 odpowiedzi

+1 głos
odpowiedź 20 sierpnia 2018 przez Comandeer Guru (601,110 p.)

Co to znaczy "nie działa"? Mysqli rzuca błędy, wypada sprawdzić, co dostajemy.

Inna rzecz, że powinieneś używać prepared statements do wartości i intval​ w przypadku podstawiania do nazwy tabeli.

Na marginesie: baza jest źle zaprojektowana i trzymanie każdej rozmowy w innej tabeli jest bez sensu. Powinna być tabela zawierająca metadane rozmowy (kto z kim itd.) oraz tabela zawierająca wiadomości rozmowy, z kluczami obcymi dla identyfikatora użytkownika i identyfikatora rozmowy.

0 głosów
odpowiedź 20 sierpnia 2018 przez marcin99b Szeryf (82,160 p.)
Użyłbym tu jakiegoś bindowania, dawno nie pisałem w php więc nie powiem co i jak w tym przypadku
Ale żeby podmieniało dajmy na to {id}, {nicky} na dane z $_SESSION['id'] i $_SESSION['nicky']
No i też coś takiego jest bezpieczniejsze, bo dodatkowo często w metodach bindujących, np bindParam
dodatkowo sprawdza ci, czy przypadkiem nie siedzi w środku jakieś sql injection
komentarz 20 sierpnia 2018 przez Comandeer Guru (601,110 p.)
Nie da się bindować nazw tabel.
komentarz 20 sierpnia 2018 przez marcin99b Szeryf (82,160 p.)
nie zauważyłem że przypisuje też do nazwy tabeli

ale (przynajmniej dla mnie) trochę średnią opcją może być osobna tabela dla każdej rozmowy
nie lepiej zrobić to na podstawie relacji?

w jednej tabeli rozmowy idRozmowy | osobyJakoJson | dodatkoweOpcjeJakoJson

w drugiej już same wiadomości
idWiadomości | idRozmowy | idOsoby | wiadomość

później pobierasz wszystkie wiadomości dla danej rozmowy
i na podstawie idOsoby wyświetlasz która osoba co napisała
ten system pozwala zarówno na rozmowy grupowe, jak i 1 z 1

osobyJakoJson warto trzymać, żeby mieć pewność, że dana osoba może wysłać wiadomość, do danej rozmowy
zamiast json można zrobić osobną tabelę, ja osobiście zrobiłbym jako json ze względu na prostotę i operacje na nie dużym tekście - ale tutaj specjalistą nie jestem, to nie będę się dużo wypowiadał

mniej więcej (napisane po polsku dla prostszego zrozumienia, nie polecam stosowania polskich nazw w rzeczywistych projektach, lepiej od razu budować nawyk pisania po angielsku)
komentarz 20 sierpnia 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
Po co bindować zmienne, które nie pochodzą od użytkownika?
komentarz 20 sierpnia 2018 przez Comandeer Guru (601,110 p.)
@OdsetekGlupoty id może nie pochodzi, ale już nick raczej tak. Poza tym lepiej przyjąć zasadę, że bindujemy wszystko – choćby dla spójności.
komentarz 20 sierpnia 2018 przez Śwież4k Bywalec (2,570 p.)

@marcin99b, osobyJakoJson? Trochę tego nie rozumiem, bo po co mam przesyłać dane w jsonie skoro mogę zrobić zwykły wpis nazw dwóch uzytkownków do dwóch kolumn. Bo rozumiem, że w kolumnie osobyJakoJson miałyby się znajdować nickname'y obu lub więcej rozmówców?

komentarz 20 sierpnia 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)

@Comandeer, Czyli dla zasady się binduje nawet zmienne, które nie pochodzą od usera?

To nie jest ironiczne, po prostu nie wiem

komentarz 20 sierpnia 2018 przez marcin99b Szeryf (82,160 p.)

@Śwież4k, tylko trudno stwierdzić która osoba jest którą 
przynajmniej ja wolałbym sprawdzać czy json zawiera element z id użytkownika
niż czy jedna z kolumn (osobaA, osobaB, osobaC, osobaD itd) zawiera to id

nawet kiedy z rozmowy korzystać będą zawsze 2 osoby, to rozwiązanie nie wydaje mi się jakoś super, przynajmniej ze strony estetycznej 

if(userId == conversationUserA || userId == conversationUserB)

lepiej dać 

 

if(conversationUsers.DeserializeJson<Guid>().Contains(userId))
//albo po prostu
if(conversationUsers.Contains(userId))

Ale to tylko sposób, w jaki ja bym zrobił 

komentarz 20 sierpnia 2018 przez Comandeer Guru (601,110 p.)

Czyli dla zasady się binduje nawet zmienne, które nie pochodzą od usera?

W sumie tak. A second level SQL injection tylko to potwierdzają ;)

@marcin99b dobre bazy danych mają typ array (np. PostgreSQL). Zresztą jak się odpowiednio pobawi, to da się to zrobić na poziomie samego zapytania. Inna rzecz: albo coś mi umyka, albo nie wiem, po co to kombinowanie, skoro każda wiadomość może mieć jednego autora? W tym wypadku konieczne jest wyłącznie id rozmowy, by móc ją całą złożyć do kupy.

Edit: dobra, widzę. W takim wypadku powstaje kolejna tabela, osobyWRozmowie ;)

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 2 marca 2020 w PHP przez macieju1 Nowicjusz (160 p.)
0 głosów
4 odpowiedzi 346 wizyt
pytanie zadane 17 marca 2016 w PHP przez Widemo Użytkownik (920 p.)
0 głosów
2 odpowiedzi 848 wizyt
pytanie zadane 25 lipca 2017 w SQL, bazy danych przez BlvckFox Gaduła (4,240 p.)

92,566 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...