Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proste zapytanie a zwraca błąd. Gdzie jest problem?
Forum PHP.pl > Forum > Bazy danych > MySQL
adbacz
Witam,

Mam bazę danych z dwoma tabelami: `artykuly` oraz `komentarze`. W pierwszej tabeli mam między innymi: `tytul`, `tresc`, `artykul_id` itd. a w komentarzacz: `artykul_id`, `komentarz_id`, `tresc` itd. Dodatkowo w tabeli z artykułami, zrobiłem kolumnę w której jest zapisywany tytuł małymi literami a spacje zamienione są na podkreślniki. Wykorzystuję to do robienia prostych adresów URL (używam CodeIgniter).

No i na początku w tabeli komentarze zamiast `artykul_id` miałem `artykul_url`. Chcąc wyciągnąć komentarze dla konkretnego artykuły, pobierałem z adresu URL ostatni segment nazwy (gdzie jest właśnie napis z kolumny `tytul_url` z tabeli `artykuly`) i zapisywałem do zmiennej $id.

Zapytanie brzmiało tak:
  1. $this->bd->query('SELECT * FROM komentarze WHERE artykul_url = '.$id.'')


Niestety, i w kodzie PHP i nawet wpisywane ręcznie zapytanie do PHPMyAdmin dawało ostrzeżenie: "Unknown column '(tutaj zawsze sie pojawiał napis z `artykul_url`, np. 'testowy_artykul_13')' in WHERE clause"

Czy ja źle robię czy to wina skryptu? Przecież zmienna $id nie jest kolumną - a tak mi pokazuje komunikat błędu. No chyba, że źle czytam.
yoshinobi
Odwołujesz się do komórki w bazie, której nie ma.
wcześniej odwoływałeś się do `artykul_url` (którą jak napisałeś zmieniłeś na `artykul_id`), więc już ta kolumna nie istnieje.

spróbuj tak:
  1. $this->bd->query('SELECT * FROM komentarze WHERE artykul_id = '.$id.'')
adbacz
Może źle się wyraziłem. Zapytanie określone na artykul_id, gdy taka kolumna istnieje i w zapytanie jest WHERE artykul_id = 2, (liczba, nie ciąg znaków) wszystko działa tak jak powinno.

Zmieniam nazwę tej kolumny na artykul_url i zadaje pytanie z frazą WHERE artykul_url = test_16, (ciąg znaków istnieje bo wpisałem ręcznie do tej kolumny) niestety, wyskakuje błąd.

EDIT:
Zauważyłem, że jak chcę wyszukać w obojętnie jakiej tabeli i chce wyszukać obojętnie jaki ciąg znaków, np. WHERE adres_url = test_1234, to mi wyskakuje błąd, że nie ma takiej kolumny, mimo, że za kolumnę podaję istniejącą kolumnę w danej tabeli.

Ale gdy wyszukuję liczbę po indeksowanej kolumnie, nie wyświetla mi błędu i wszystko ładnie wyszukuje.

W czym może tkwić problem?
nospor
Przecież to są podstawy podstaw

Tekst to tekst. Tekst ma być brany w apostrofy.

NIe: WHERE artykul_url = test_16
a: WHERE artykul_url = 'test_16'
adbacz
Oj tam. Wiem, że tekst sie bierze w apostrofy. Tutaj w moim przypadku trzeba było zastosować zamiast znaku równości wyraz LIKE.

  1. "SELECT * FORM tabela WHERE costam LIKE 'costam2'"


Po takim złożeniu zapytania wszystko ładnie działa.
nospor
No wybacz, ale jak dostajesz komunikat błędu:
"Unknown column '(tutaj zawsze sie pojawiał napis z `artykul_url`, np. 'testowy_artykul_13')' in WHERE clause"
albo to:
"chce wyszukać obojętnie jaki ciąg znaków, np. WHERE adres_url = test_1234, to mi wyskakuje błąd, że nie ma takiej kolumny, mimo, że za kolumnę podaję istniejącą kolumnę w danej tabeli."

To ewidentnie widać, że masz tekst bez apostrofów. Być może zanim napisałem posta to już to poprawiłeś, ale taki błąd miałeś

Cytat
Tutaj w moim przypadku trzeba było zastosować zamiast znaku równości wyraz LIKE.

[SQL] pobierz, plaintext
"SELECT * FORM tabela WHERE costam LIKE 'costam2'"


Po takim złożeniu zapytania wszystko ładnie działa.

Przy takim zapisie:
like 'costam2'
jest równoznaczne z
= 'costam2'

Zadziałało ci, bo ty mialeś
= costam2
a dopiero przy like raczyłeś dać apostrof
like 'costam2'
smile.gif
adbacz
W tabeli miałem kolumnę w której zapisywałem ciąg znaków potrzebny mi do generowania prostych adresów URL. W tych ciągach nie było żadnych znaków białych (no bo jak w URL można spacje dać, oprócz %20 czy jakos tak?).

Więc najpierw dawałem takie zapytania, które generowały błędy:
  1. $nazwa_url = $this->uri->segment(3); //nazwa pobrana z adresu URL za pomocą helpera w CI.
  2.  
  3. $this->db->query('SELECT * FROM artykuly WHERE nazwa_url = '.$nazwa_url.'');

Później jak zmądrzałem (masz racje, zmądrzałem zanim napisałeś posta), znalazłem rozwiązanie i pisałem już inaczej zapytania, które nie generowały błędów:
  1. $this->db->query("SELECT * FROM artykuly WHERE nazwa_url LIKE '".$nazwa_url." '");


Ważne, że znalazłem błąd. Dzięki za pomoc i wytknięcie błędu nospor.
nospor
Ja ci nie wytykałem błędu a powiedziałem gdzie błąd robiłeś. Napisałem to na podstawie postów, które wskazywały na ten błąd.
szok
Cytat(adbacz @ 10.05.2011, 04:05:54 ) *
W tabeli miałem kolumnę w której zapisywałem ciąg znaków potrzebny mi do generowania prostych adresów URL. W tych ciągach nie było żadnych znaków białych (no bo jak w URL można spacje dać, oprócz %20 czy jakos tak?).

Więc najpierw dawałem takie zapytania, które generowały błędy:
  1. $nazwa_url = $this->uri->segment(3); //nazwa pobrana z adresu URL za pomocą helpera w CI.
  2.  
  3. $this->db->query('SELECT * FROM artykuly WHERE nazwa_url = '.$nazwa_url.'');

Później jak zmądrzałem (masz racje, zmądrzałem zanim napisałeś posta), znalazłem rozwiązanie i pisałem już inaczej zapytania, które nie generowały błędów:
  1. $this->db->query("SELECT * FROM artykuly WHERE nazwa_url LIKE '".$nazwa_url." '");


Ważne, że znalazłem błąd. Dzięki za pomoc i wytknięcie błędu nospor.


Widzę że korzystasz w CI, nie lepiej zrobić to w ActiveRecords ? I problemy same się rozwiążą.

  1. $cos = $this->db->where('nazwa_url', $nazwa_url)->get('artykuly')->result_array();
  2. // czy tam z like:
  3. $cos = $this->db->like('nazwa_url', $nazwa_url)->get('artykuly')->result_array();
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.