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

PHP nie potrafi zwrócić wartości z zapytania SQL.

Object Storage Arubacloud
0 głosów
224 wizyt
pytanie zadane 9 października 2020 w PHP przez Bartx Bywalec (2,120 p.)

Witam, poniższy kod:

$start = "Gdańsk";
$end = "Gdynia";
$stations = "";

$connection = mysqli_connect("localhost", "root", "", "path");
$sql = "SELECT * FROM linie WHERE stacje LIKE (SELECT CONCAT(\'%\', (SELECT id FROM stacje WHERE nazwa = \'$start\'), \';%\')) AND stacje LIKE (SELECT CONCAT(\'%\', (SELECT id FROM stacje WHERE nazwa = \'$end\'), \';%\'));";
$query = mysqli_query($connection, $sql);

while ($result = mysqli_fetch_assoc($query)){
    echo $result["stacje"];
}

po wykonaniu zwraca:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in ... line 11

Komenda Sql podana wyżej działa, jeżeli użyje jej w phpmyadmin.

Gdy w zmiennej sql zostawię tylko "SELECT * FROM linie" nic więcej nie zmieniając to normalnie mi zwraca, ale nie o to mi jednak chodzi.

W czym może tkwić problem?

2 odpowiedzi

0 głosów
odpowiedź 9 października 2020 przez Comandeer Guru (601,590 p.)
Zapytanie ewidentnie rzuca błąd, więc wypada sprawdzić jaki → https://www.php.net/mysqli_error

Tak na oko, to niepotrzebnie escape'ujesz apostrofy.
komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
Jak usunę apostrofy to nie zwraca ani wyniku ani ostrzeżenia/błędu, a przypominam, ze phpmyadmin zwaraca.
komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)

A co zwraca mysqli_error?

komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
Jak usunę "\" to nic nie zwraca, ani błędu ani wyniku, a jak nie zmieniam nic to: "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\'Gdańsk\'), \';%\')) AND stacje LIKE (SELECT CONCAT(\'%\', (SELECT id FROM ' at line 1"
komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)

Więc zapytanie z apostrofami jest niepoprawne składniowo. Bez nich jest poprawne, ale jest zwracany pusty wynik. Zrób sobie var_dump( $sql ) i zobacz, czy się na pewno dobre zapytanie utworzyło.

komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
var_dump zwraca "bool(false)", kompletnie nie wiem dlaczego.
komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)

Chodziło mi o var_dump na zmiennej zawierającej tekst zapytania i zobaczenie, czy na pewno jest ono poprawne (np. czy zmienne się odpowiednio podstawiły).

komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)

Po usunięciu "\" var_dump($query) zwraca:

"mysqli_result Object ( [current_field] => 0 [field_count] => 9 [lengths] => [num_rows] => 0 [type] => 0 )"

Za to te same zapytanie w phpmyadmin zwraca:

komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)

Czyli to nie jest to samo zapytanie. Pozwól, że po raz trzeci powtórzę:

var_dump na zmiennej zawierającej tekst zapytania

TEKST, nie WYNIK

komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
Jeśli zastosuję var_dump na zmiennej zawierającej zapytanie, czyli $sql, to zwraca to "string(204)" i wartość zmiennej. A co do zapytania, w jednym i drugim przypadku jest ono identyczne.
komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)
No nie może być, bo identyczne zapytanie zwracałoby identyczne wyniki. Jak przekleisz to zapytanie z kodu do phpMyAdmin, to zwraca pożądany wynik?
komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
Tak dokładnie jest
komentarz 9 października 2020 przez Comandeer Guru (601,590 p.)
Hmm, trudno coś więcej tak na sucho powiedzieć, nie mając pod ręką bazy, na której to można przetestować na żywo.
komentarz 9 października 2020 przez Bartx Bywalec (2,120 p.)
No ok, niezbyt jest możliwość aby tę bazę łatwo udostępnić do użytku komuś innemu, ale dzięki za pomoc.
0 głosów
odpowiedź 10 października 2020 przez hoktaur Pasjonat (22,250 p.)

Rozumiem że to:

(SELECT id FROM stacje WHERE nazwa = \'$start\')

zwraca jakieś ID czyli cyfrę

to po co jakieś tam LIKE i to jeszcze z %?

stacje = (SELECT id FROM stacje WHERE nazwa = \'$start\')

dla jednego ID lub dla wielu:

stacje IN (SELECT id FROM stacje WHERE nazwa = \'$start\')

 

komentarz 10 października 2020 przez hoktaur Pasjonat (22,250 p.)

swoją drogą rozumiem że bazy nie możesz podesłać ale chociaż pokaż strukturę tabel

DESC nazwa_tabeli;

 

komentarz 10 października 2020 przez hoktaur Pasjonat (22,250 p.)

załapałem chyba ty nie masz w stacjach liczby bo stacja Gdańsk  i Gdynia nie może mieć tego samego ID wiec warunek był by bezsensu no chyba że nie podałeś nam całego zapytania?

ty masz tam stringa z ID'kami

'11 43 22 33'

i po to ten LIKE ;)

... od razu ci powiem że źle kombinujesz musisz dodać kolejną table z relacjami linia do stacje

i LEFT JOIN łączyć tabele a następnie użyć GROUP BY

 

 

 

komentarz 10 października 2020 przez hoktaur Pasjonat (22,250 p.)
ehhh dawno mnie tu nie było nie zauważyłem 8 poprzednich komentarzy które były zwinięte ale dobrze się domyśliłem

te twoje relacje

1;2;4;5 itd

to zły pomysł zrób jak ci pisałem wyżej

Podobne pytania

+1 głos
1 odpowiedź 265 wizyt
pytanie zadane 10 grudnia 2020 w PHP przez ariva6152 Użytkownik (570 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 6 października 2020 w PHP przez KumberTwo Dyskutant (8,270 p.)
+1 głos
1 odpowiedź 124 wizyt
pytanie zadane 27 września 2020 w PHP przez Xele Początkujący (310 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...