Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem w zapytaniu (PDO)
Forum PHP.pl > Forum > Przedszkole
brzoza91
Witam
Mam taką funkcje

  1. public function getAll($table) {
  2. $sel=$this->pdo->prepare("SELECT * FROM :table");
  3. $sel -> bindValue(':table', $table, PDO::PARAM_STR);
  4. $sel -> execute();
  5. $sel->setFetchMode(PDO::FETCH_ASSOC);
  6. foreach ($sel as $row){
  7. $data[]=$row;
  8. }
  9. $sel->closeCursor();
  10.  
  11. return($data);
  12. }


i gdy używam takiego wywołania

  1. getAll('dish');

wyskakuje mi taki błąd. Dlaczego tak się dzieje ? Bo gdy wpiszę na sztywno w zapytaniu
  1. SELECT * FROM dish
to działa.


Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dish'' at line 1' in model.php on line 59
Rysh
Dodaje Ci ' ' zapewne podczas bindValue.

BTW, dlaczego nie używasz fetchAll()?
brzoza91
Cytat(Rysh @ 20.07.2012, 22:00:30 ) *
BTW, dlaczego nie używasz fetchAll()?



teraz już używam smile.gif

próbowałem tak, ale dalej taki sam błąd
  1. $table=str_replace("'", '', $table)
Rysh
Kolego zauważ, że PDO przy bindowaniu zamienia ciąg znaków :test na zmienną. Tylko zmienną osadza jeszcze w ' ' czyli co?

Przykład:
Kod
SELECT * FROM tabela WHERE name = :name

zamieni na:
Kod
SELECT * FROM tabela WHERE name = 'zmienna'

zauważ, że do stringa i tak nie dajesz '' jako wartość SQL, ponieważ PDO sam to uczyni.

Czyli to Twój przykład:
Kod
SELECT * FROM :tabela

zamieni na:
Kod
SELECT * FROM 'tabela'


A domyślam się, że phpmyadmin też Ci identyczny błąd w tym przypadku wywali.
brzoza91
kurcze, to już nie wiem jak to rozwiązać
!*!
Nie można bindować nazw tabel.
markonix
Cytat(brzoza91 @ 22.07.2012, 12:58:00 ) *
kurcze, to już nie wiem jak to rozwiązać

Użyj tradycyjnego sposobu i wlej nazwę tabeli do zapytania zwykłą zmienną.
I tak funkcja jest pewnie wykonywana tylko przez skrypty, wątpię, żeby jej argument był wysyłany z formularza, a nawet gdyby to po prostu proste wyrażenie regularne na początku dla bezpieczeństwa.

Druga sprawa kopiujesz funkcjonalność metody PDO, która istnieje tj PDOStatement::fetchAll
(ktoś wie jaką dać nazwę aby tag "manual" prawidłowo zalinkował?)
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.