dynamický query database, problém s parametrami
- ruller
- Člen | 29
Ola.
Mám taký problém, že snažím sa poskladať zložitejší query pomocou
$database = new Connection('mysql:dbname=...', '..', '..');
$query=$database->query(..,..);
musím použiť tento spôsob a nie „nette“ spôsob lebo potrebujem
spájať tabuľky ale hosting podporuje iba MyISAM.. smola..
K tomu problému: skladám query na základe premenných ktoré mi prídu
v url
v poli $conditions mám uložené podmienky ktoré sa použijú.
if(count($conditions) > 0) {
$query .= "WHERE " . implode (' AND ', $conditions);
}
problém nastáva pri priradení parametrov pre ten query. Musí tam byť presný počet ako som použil do query, ale ten parameter nebere array() s hodnotami, ale musia byť oddelené čiarkami.
$query1=$database->query($query,array($parameters)); // nevezme, a nevezme ani bez array()
vie mi niekto poradiť s týmto problémom ? Ďakujem
Editoval ruller (26. 7. 2012 20:34)
- Ot@s
- Backer | 476
ruller napsal(a):
možeš mi prosím vysvetliť čo znamená „pohled nebo dočasný pohled“? dík
Někde ve správci databáze (třeba v Admineru) si založ klasický (maximalistický) pohled:
CREATE VIEW v_osobnikontakty AS SELECT * FROM osoby JOIN kontakty ON (a.id=b.osoba_id);
V modelu pak dynamicky přidávej where podle potřeby
$mywhere = array('typ'=>'email','prijmeni'=>'Novák');
$list = $this->database->table('v_osobnikontakty');
foreach ($mywhere as $k=>$v) $list->where($k, $v);
// v $list budu mit vsechny emailove konakty na Novaky
Není to vhodné v situacích, kdy potřebuješ do základního SQL pro
pohled dostat závislé proměnné, popř. je dat tolik, že práce
s výsledným pohledem je pomalá. Resp. dá se to obejít dočasným pohledem,
kdy si po dobu životnosti připojení k DB vytvoříš dočasný pohled
(CREATE temporary VIEW seznamosob AS ...
), který zohledňuje
např. ony závislé proměnné.
a ten druhý spôsob čo si napísal sa dá použiť aj na tabuľky ktoré nemajú cudzie kľúče a nie sú modely vytvorené v nette ? ďakujem
Nevím, vyzkoušej. Teoreticky tam můžeš dát jakýkoli SQL dotaz (SELECT).
Editoval Ot@s (28. 7. 2012 10:50)
- ruller
- Člen | 29
hm no tak tí hajzlíci vo forpsi nedovolia ani posraný create view, píše
mi že CREATE VIEW command denied to user bla bla.. na lokále som si to pekne
spravil s tym viewom a teraz to budem musieť spraviť ináč.
viete mi prosím poradiť ako to spraviť touto cestou ?
$database->table('(SELECT * FROM slozity_dotaz) AS mytable')->where('id=?', $id)->where('valid=1')
Ot@s to načrtol ale neviem zapísať ten query. keď skúšam
$query="SELECT * FROM nieco JOIN ine ON nieco.id=ine.id";
$database->table('(SELECT * FROM '.$query.') AS mytable');
tak ladenka mi hlási chybu v query, ako to mám zapísať keď je
zložitejší query? Ďakujem
btw od forpsi uz nikdy webhosting, urcite nie databazu! neda sa ani foreign keys
ani create view.. LOL
Editoval ruller (27. 7. 2012 19:30)
- ruller
- Člen | 29
no len zamestnavatel zaplatil na rok dopredu hosting :'(, //EDIT
tak vyriesil som, keby niekto potreboval tak :
$database->table("
(SELECT
t1.*,
t3.abc,
t3.cde,
t2.fd AS fd
FROM
(
SELECT *
FROM bc
) t1
INNER JOIN
(
SELECT *
FROM datum
) t2 ON t1.id = t2.id
INNER JOIN
(
SELECT *
FROM gf
) t3 ON t1.id = t3.id) AS mytable");
Editoval ruller (28. 7. 2012 10:47)
- bumprask
- Člen | 59
ruller napsal(a):
no len zamestnavatel zaplatil na rok dopredu hosting :'(, //EDIT
tak vyriesil som, keby niekto potreboval tak :
$database->table(" (SELECT t1.*, t3.abc, t3.cde, t2.fd AS fd FROM ( SELECT * FROM bc ) t1 INNER JOIN ( SELECT * FROM datum ) t2 ON t1.id = t2.id INNER JOIN ( SELECT * FROM gf ) t3 ON t1.id = t3.id) AS mytable");
takže tento zápis vrací to samé jako kdybych přímo vlozil existujici
tabulku
$database->table(„libovolna_tabulka“) ? Moc tento zápis nechápu a moje
první pokusy skončili vždycky chybou z laďěnky. Děkuji za reakce.