Wiele parametrów w URL i używanie ich w query

Wiele parametrów w URL i używanie ich w query
XS
  • Rejestracja:około 11 lat
  • Ostatnio:około 12 godzin
  • Postów:139
0

Cześć,

Mam pytanie. W jaki sposób obsługiwać, ogarniać sytuacje gdy mamy wiele parametrów przekazanych w URL do backendu?
Np. taki adres:

Kopiuj
www.strona.com/api/pakiety?a=1,2,3,4,5,6

W jaki sposób dodać 1,2,3,4,5,6 do SQLa? Chciałbym to zrobić przy pomocy SQL IN. Używam PHP PDO.

Kopiuj
$sql = "SELECT *
        FROM tabela_name 
        WHERE ";
$sql .= "a IN (:a_values)";

Jak ogarniać takie case?

edytowany 2x, ostatnio: Riddle
CH
to chyba nie musisz nic wiecej robic powinno dzialac
66
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:53
0

do tego musiałbyś użyć bindParam dla każdej wartości z osobna https://www.php.net/manual/en/pdostatement.bindparam.php lub napisać raw query i wstawić WHERE a in (".$_GET['a'].") (oczywiście po uprzednim zwalidowaniu wartości, bo każdy może wstawić w link co zechce i popsuć ci bazę danych)

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Koszalin
  • Postów:10094
2
xavi_sof napisał(a):

Cześć,

Mam pytanie. W jaki sposób obsługiwać, ogarniać sytuacje gdy mamy wiele parametrów przekazanych w URL do backendu?
Np. taki adres:

Kopiuj
www.strona.com/api/pakiety?a=1,2,3,4,5,6

No więc po pierwsze, na razie to nie jest kilka parametrów tylko jeden.

Kopiuj
<?php
$_GET['a']; // string ("1,2,3,4,5,6")

Jeśli chcesz, żeby to była lista parametrów oddzielonych przecinkami, to powinieneś zrobić coś takiego:

Kopiuj
<?php
$arguments = explode($_GET['a']); // array ("1", "2", "3", "4", "5", "6")

Niestety PDO nie udostępnia żadnego interfejsu na bindowanie wielu wartości na raz. Tutaj jest podpowiedź jak można zbudować prepared query, do którego potem można zbindować wiele parametrów: https://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition-in-a-pdo-query

Kopiuj
<?php
$arguments = explode($_GET['a']);
$placeholders = str_repeat('?,', count($array) - 1) . '?'; // string ("?,?,?,?,?,?")

$pdo = new PDO(...);
$stmt = $pdo->prepare(
    'SELECT *
     FROM table
     WHERE id IN(' . $placeholders . ')'
);

$stmt->execute($arguments);
666 napisał(a):

[...] lub napisać raw query i wstawić WHERE a in (".$_GET['a'].") (oczywiście po uprzednim zwalidowaniu wartości, bo każdy może wstawić w link co zechce i popsuć ci bazę danych)

To jest potencjalna opcja, ale bardzo niezalecałbym w ogóle jej rozważać. Nie ma powodu się ku temu skłaniać, skoro są inne, lepsze sposoby żeby osiągnąć WHERE IN.

edytowany 2x, ostatnio: Riddle
XS
  • Rejestracja:około 11 lat
  • Ostatnio:około 12 godzin
  • Postów:139
0

Dzięki za pomoc. W odpowiedzi z bazy brakuje mi polish znaków, w bazie je mam. Co może być powodem? UTF-8? Gdy używałem mysqli ustawiałem utf-8 i działało. Jak mogę to zrobić w PDO?

edytowany 2x, ostatnio: xavi_sof
66
dodałeś w head <meta charset="utf-8">?
XS
w head na froncie tak
XS
te dane są zwracane bez polskich znaków z bazy
XS
same pytajniki zamiast ążśłó
XS
Ok chyba ogarnąłem. Dane które są zwracane z bazy są w takiej formie "D\u0105br\u00f3wki", to jest ok? Takie coś widze w odpowiedzi z back endu

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.