Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PostgreSQL][PHP] PDO - problem z funkcja prepare
Forum PHP.pl > Forum > Przedszkole
pawlo546
Witam,

Stworzyłem klase:

class Lista {
public $what;
public $from;
public $orderBy;

public function __construct($what,$from,$orderBy, PDO $pdo){
$this->what = $what;
$this->from = $from;
$this->orderBy = $orderBy;
$this->pdo = $pdo;
}

public function stworz(){

$pdo = $this->pdo;
$stmt = $pdo->prepare('select ? from ? order by ?');
$stmt->bindParam (1,$what, PDO::PARAM_STR);
$stmt->bindParam (2,$from, PDO::PARAM_STR);
$stmt->bindParam (3,$orderBy, PDO::PARAM_STR);

$what =$this->what;
$from = $this->from;
$orderBy = $this->orderBy;

$stmt->execute(array($what, $from, $orderBy));

print "<select name=\"punkt[]\" style=\"width: 150px;\">\n";
foreach($stmt as $row){
print "<option value=\"$row[$what]\">$row[$what]</option>\n";
}
print "</select>\n";

$stmt->closeCursor();
}
}

którą następnie wywołuję:


try{
$pdo = new PDO('pgsql:host=localhost;dbname=db;port=5432', 'aaaa', 'bbbb');
$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$listanrpkt = new Lista("nrpkt", "punkt", "nrpkt", $pdo);
$listanrpkt->stworz();
}
catch(PDOException $e)
{
echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
}

jednak pomimo moich juz licznych kombinacji nawsz strona wyrzuca mi błąd: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: select $1 from $2 order by $3 ^

sprawdzałem pisownie nazw tabeli i kolumn i wszystko na pewno jest tak samo jak w PostgreSQL tym bardziej, że przez query zamiast prepare wszystko działa.
ZaXaZ
może zamień
  1. print "<option value=\"$row[$what]\">$row[$what]</option>\n";
  2. #na
  3. print '<option value="'.$row[$what].'">'.$row[$what]."</option>\n";

lepiej wygląda, szybsze i może poprawniejsze.

co do błędu: podales za krótki, podales i błąd i kod taki jaki jest?
bo w błędzie masz $1 $2 itd a jeśli to zmienne, to zmienne takie nie są "poprawne", trzeba $a1 $x2 np.

edit:
Cytat
przez query zamiast prepare wszystko działa.

nie doczytalem. Podaj jak robisz z query.
pawlo546
Powyżej zamieściłem pełny skrypt aplikacji i wynikowy błąd. I osobiście wydaje mi się, że te zmienne $1,$2,$3 to są przerobione podczas podpinania zmienne $what, $from, $orderBy.
pawlo546
Wersja z query:

$pdo = $this->pdo;
$stmt = $pdo->query('select nrpkt from punkt order by nrpkt');
//$stmt->bindParam (1,$what, PDO::PARAM_STR);
//$stmt->bindParam (2,$from, PDO::PARAM_STR);
//$stmt->bindParam (3,$orderBy, PDO::PARAM_STR);

$what =$this->what;
$from = $this->from;
$orderBy = $this->orderBy;

$stmt->execute(array($what, $from, $orderBy));

print "<select name=\"punkt[]\" style=\"width: 150px;\">\n";
foreach($stmt as $row){
print "<option value=\"$row[$what]\">$row[$what]</option>\n";
}
print "</select>\n";

$stmt->closeCursor();
ZaXaZ
  1. $stmt = $pdo->prepare('SELECT :nrpkt FROM :tabela ORDER BY :nrpkt2');
  2. $stmt->bindParam(':nrpkt', $what, PDO::PARAM_STR);
  3. $stmt->bindParam(':tabela', $from, PDO::PARAM_STR);
  4. $stmt->bindParam(':nrpkt2', $orderBy, PDO::PARAM_STR);


a teraz jak?, zamien też to co pisałem w poprzednim poscie

ps. $what musi zawierac teraz 1, $from 2, $orderBy 3,
ale napewno masz tabele o nazwie 2?
Kod
"WYBIERZ 1 Z 2 KOLEJNOŚCIĄ PRZEZ 3"

(mało logiczne z tymi cyframi)
pawlo546
Nadal błąd:
Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: select $1 from $2 order by $3 ^

Kod wyglada następująco:
public function stworz(){

$pdo = $this->pdo;
$stmt = $pdo->prepare('select :nrpkt from :tabela order by :nrpkt2');
$stmt->bindParam (':nrpkt',$what, PDO::PARAM_STR);
$stmt->bindParam (':tabela',$from, PDO::PARAM_STR);
$stmt->bindParam (':nrpkt2',$orderBy, PDO::PARAM_STR);

$what =$this->what;
$from = $this->from;
$orderBy = $this->orderBy;

$stmt->execute(array($what, $from, $orderBy));

print "<select name=\"punkt[]\" style=\"width: 150px;\">\n";
foreach($stmt as $row){
print "<option value=".$row[$what].">$row[$what]</option>\n";
}
print "</select>\n";

$stmt->closeCursor();
}
}

Dla mnie to wyglada jakby on dopisywal cos do tych zmiennych.
pawlo546
Nie mam tabeli o nazwach 1,2,3

pod zmienne what, from ,orderBy poprzez construktora przypisane sa wartosci "nrpkt" "punkt" "nrpkt"
ZaXaZ
  1. #zamien
  2. $stmt->execute(array($what, $from, $orderBy));
  3. #na
  4. $stmt->execute();


bo dwa razy wykonujesz kod o.O, w bindParam już wykonane

edit: + jeśli dalej nie działa zamien SELECT na EXPLAIN SELECT i pokaż co zwraca.
pawlo546
tak przez przypadek zostało w wyniku różnych prób.

ale niestety zmiana tego nie zniwelowała błędu.
pawlo546
Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: explain select $1 from $2 order by $3 ^
pawlo546
W ten sposób działa:

$what =$this->what;
$from = $this->from;
$orderBy = $this->orderBy;
$pdo = $this->pdo;
$sql = "Select ".$what." from ".$from." Order by ".$orderBy;
$stmt = $pdo->prepare($sql);
/*$stmt->bindParam (':nrpkt',$what, PDO::PARAM_STR);
$stmt->bindParam (':tabela',$from, PDO::PARAM_STR);
$stmt->bindParam (':nrpkt2',$orderBy, PDO::PARAM_STR); */



$stmt->execute();

Jednak nie wiem jak wtedy wykonać podpinanie.
pawlo546
a gdy zrobilem w ten sposob:

$sql = "Select ".$pdo->quote($what, PDO::PARAM_STR)." from ".$pdo->quote($from , PDO::PARAM_STR)." Order by ".$pdo->quote($orderBy, PDO::PARAM_STR);
$stmt = $pdo->prepare($sql);

to wyskoczył błąd:
Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "'punkt'" LINE 1: Select 'nrpkt' from 'punkt' Order by 'nrpkt' ^

i mysle ze te cydzyslowia moga byc wskazowka sak sie bral ten poprzedni blad ale nad nie wiem dlaczego sa one dopisywane do zmiennych
ZaXaZ
Cytat(pawlo546 @ 27.04.2014, 02:11:08 ) *
a gdy zrobilem w ten sposob:

$sql = "Select ".$pdo->quote($what, PDO::PARAM_STR)." from ".$pdo->quote($from , PDO::PARAM_STR)." Order by ".$pdo->quote($orderBy, PDO::PARAM_STR);
$stmt = $pdo->prepare($sql);

to wyskoczył błąd:
Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "'punkt'" LINE 1: Select 'nrpkt' from 'punkt' Order by 'nrpkt' ^

i mysle ze te cydzyslowia moga byc wskazowka sak sie bral ten poprzedni blad ale nad nie wiem dlaczego sa one dopisywane do zmiennych


  1. public function stworz()
  2. { global $what,$from,$orderBy,$pdo;
  3. $stmt = $pdo->prepare('SELECT :nrpkt FROM :tabela ORDER BY :nrpkt2');
  4. $stmt->bindParam(':nrpkt', $what, PDO::PARAM_STR);
  5. $stmt->bindParam(':tabela', $from, PDO::PARAM_STR);
  6. $stmt->bindParam(':nrpkt2', $orderBy, PDO::PARAM_STR);
  7. $stmt->execute();
  8. echo '<select name="punkt[]" style="width: 150px;">'."\n";
  9. foreach($stmt as $row) echo '<option value="'.$row[$what].'">'.$row[$what]."</option>\n";
  10. echo "</select>\n";
  11. $stmt->closeCursor();
  12. }


zamien całą funkcję na to co ja zrobiłem wyżej, nie rób quote bo w bindParam jesteś bezpieczny a quote dodaje z lewej i prawej apostrof.
pawlo546
Wówczas zmienne what, from i orderby nie maja zadnych wartosci, a jak probuje im przypisac prze = $this-> to wyskakuje błąd Fatal error: Cannot access empty property in /var/www/klasalista.php on line 20
ZaXaZ
  1. <?php
  2. class Lista
  3. { public $what;
  4. public $from;
  5. public $orderBy;
  6.  
  7. public function __construct($what,$from,$orderBy, PDO $pdo)
  8. {
  9. $this->what=$what;
  10. $this->from=$from;
  11. $this->orderBy=$orderBy;
  12. $this->pdo=$pdo;
  13. }
  14. public function stworz()
  15. {
  16. $what=$this->what;
  17. $from=$this->from;
  18. $orderBy=$this->orderBy;
  19. # ^ zrób jeszcze echo tych trzech
  20. # jak nadal nie działa
  21. # czy jest nrpkt punkt nrpkt
  22. $stmt = $pdo->prepare('SELECT :nrpkt FROM :tabela ORDER BY :nrpkt2');
  23. $stmt->bindParam(':nrpkt', $what, PDO::PARAM_STR);
  24. $stmt->bindParam(':tabela', $from, PDO::PARAM_STR);
  25. $stmt->bindParam(':nrpkt2', $orderBy, PDO::PARAM_STR);
  26. $stmt->execute();
  27. echo '<select name="punkt[]" style="width: 150px;">'."\n";
  28. foreach($stmt as $row) echo '<option value="'.$row[$what].'">'.$row[$what]."</option>\n";
  29. echo "</select>\n";
  30. $stmt->closeCursor();
  31. }
  32. }
  33.  
  34. try
  35. {
  36. $pdo = new PDO('pgsql:host=localhost;dbname=db;port=5432;charset=utf-8', 'aaaa', 'bbbb', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
  37. $listanrpkt = new Lista('nrpkt', 'punkt', 'nrpkt', $pdo);
  38. $listanrpkt->stworz();
  39. }
  40. catch(PDOException $e)
  41. {
  42. echo 'Połączenie nie mogło zostać utworzone: '.$e->getMessage();
  43. }
  44. ?>


w funkcji sugerowalem się twoją wypowiedzią
Cytat
W ten sposób działa: (...)
pawlo546
generalnie to jest praktycznie stan wyjsciowy co przedstawiłeś, zmienne po wypisaniu funkcja print wypisuja sie z odpowiednimi przypisanymi wartosciami (nrpkt, punkt, nrpkt).

Jednak dodałem do kodu:
var_dump($stmt->queryString);
var_dump($stmt->execute());

i co ciekawe pojawił się komunikat:

punkt nrpkt
from punkt
orderBy nrpkt
string(51) "EXPLAIN SELECT :nrpkt FROM :tabela ORDER BY :nrpkt2" Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: EXPLAIN SELECT $1 FROM $2 ORDER BY $3 ^

Co by sugerowalo ze (:nrpkt itd) w ogole nie sa zamieniane na tekst
ZaXaZ
Cytat(pawlo546 @ 27.04.2014, 03:01:18 ) *
(...)
string(51) "EXPLAIN SELECT :nrpkt FROM :tabela ORDER BY :nrpkt2" Połączenie nie mogło zostać utworzone: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: EXPLAIN SELECT $1 FROM $2 ORDER BY $3 ^

Co by sugerowalo ze (:nrpkt itd) w ogole nie sa zamieniane na tekst


to wyświetla kod SQL jaki jest zrobiony, ps. zrób dokładnie taki kod jak dałem w poscie poprzednim, nic nie zmieniaj póki co. . . EXPLAIN miało być tylko chwilę żeby zobaczyć ewentualne dodatkowe błędy.
edit: a ponieważ nie masz bezpośrednio np. zmiennej do zapytania to nie powinno wyświetlić zamienionych rzeczy..
pawlo546
przy Twoim kodzie nic sie nie pojawia.
ZaXaZ
Cytat(pawlo546 @ 27.04.2014, 03:13:43 ) *
przy Twoim kodzie nic sie nie pojawia.


dodaj do stworz()
$pdo = $this->pdo;
bo zapomniałem, idę spać.
viking
Nazwy tabel nie mogą być bindowane.
Zobacz np http://stackoverflow.com/questions/182287/...me-as-parameter
pawlo546
Dzięki wielkie za odpowiedź, wszystko stało się jasne.
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.