pawlo546
26.04.2014, 23:41:34
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
27.04.2014, 00:07:45
może zamień
print "<option value=\"$row[$what]\">$row[$what]</option>\n"; #na
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
27.04.2014, 00:19:12
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
27.04.2014, 00:21:26
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
27.04.2014, 00:36:27
$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);
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
27.04.2014, 00:42:15
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
27.04.2014, 00:44:08
Nie mam tabeli o nazwach 1,2,3
pod zmienne what, from ,orderBy poprzez construktora przypisane sa wartosci "nrpkt" "punkt" "nrpkt"
ZaXaZ
27.04.2014, 00:45:25
#zamien
$stmt->execute(array($what, $from, $orderBy)); #na
$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
27.04.2014, 00:49:06
tak przez przypadek zostało w wyniku różnych prób.
ale niestety zmiana tego nie zniwelowała błędu.
pawlo546
27.04.2014, 00:56:04
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
27.04.2014, 01:03:00
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
27.04.2014, 01: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
ZaXaZ
27.04.2014, 01:16:12
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
public function stworz()
{ global $what,$from,$orderBy,$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);
$stmt->execute();
echo '<select name="punkt[]" style="width: 150px;">'."\n"; foreach($stmt as $row) echo '<option value="'.$row[$what].'">'.$row[$what]."</option>\n"; $stmt->closeCursor();
}
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
27.04.2014, 01:26:38
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
27.04.2014, 01:46:41
<?php
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()
{
$what=$this->what;
$from=$this->from;
$orderBy=$this->orderBy;
# ^ zrób jeszcze echo tych trzech
# jak nadal nie działa
# czy jest nrpkt punkt nrpkt
$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);
$stmt->execute();
echo '<select name="punkt[]" style="width: 150px;">'."\n"; foreach($stmt as $row) echo '<option value="'.$row[$what].'">'.$row[$what]."</option>\n"; $stmt->closeCursor();
}
}
try
{
$pdo = new PDO
('pgsql:host=localhost;dbname=db;port=5432;charset=utf-8', 'aaaa', 'bbbb', array(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(); }
?>
w funkcji sugerowalem się twoją wypowiedzią
Cytat
W ten sposób działa: (...)
pawlo546
27.04.2014, 02:01:18
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
27.04.2014, 02:06:57
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
27.04.2014, 02:13:43
przy Twoim kodzie nic sie nie pojawia.
ZaXaZ
27.04.2014, 02:18:44
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
27.04.2014, 06:44:10
pawlo546
27.04.2014, 08:56:12
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.