dynamický query database, problém s parametrami

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ruller
Člen | 29
+
0
-

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
+
0
-
  1. použij pohled nebo dočasný pohled
  2. použij vnořený dotaz
$id = 2;
$database->table('(SELECT * FROM slozity_dotaz) AS mytable')->where('id=?', $id)->where('valid=1')

Pak můžeš používat fluent syntaxi WHERE dle libovůle.

ruller
Člen | 29
+
0
-

možeš mi prosím vysvetliť čo znamená „pohled nebo dočasný pohled“? dík
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

Ot@s
Backer | 476
+
0
-

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
+
0
-

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)

marek-m
Člen | 66
+
0
-

Sak im napis pekny email, neprisposobuj sa serveru, radsej migruj

ruller
Člen | 29
+
0
-

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
+
0
-

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.

ruller
Člen | 29
+
0
-

no čo som ja z toho pochopil tak ano, a tiež som mal problémy zostaviť dotaz, väčšinou to zhorelo na case sensitive slovíčkach ako IN, SELECT atd. skús poskladať niečo podľa môjho príkladu