Nejste přihlášen(a)
Zdravím,
zkoušel jsem sestavit dotaz pomocí
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('vek = %i', 10),
array('vyska = %i', 100),
));
SELECT *
FROM `table`
WHERE (vek = 10) AND (vyska = 100)
To je v pořádku, ale pokud modifikátor %i nahradím modifikátorem %s, dostanu na dotaz
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('vek = %s', '10'),
array('vyska = %s', '100'),
));
SELECT *
FROM `table`
WHERE (vek = '') AND (vyska = '')
Dělam něco špatně? Stejně to „blbne“ i při použití tekutých
příkazů.
Díky za nějakou radu, nebo nasměrování.
Apache/2.2.19 (Win32) PHP/5.3.8
dibi: 1.5-rc1
Editoval al1716 (21. 9. 2011 12:45)
Zkus to takto:
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('vek%s' => '10', 'vyska%s' => '100'),
));
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
Díky za odpověď. Zkusil jsem tvůj příklad u druhé podmínky malinko obměnit a stejně je to nějaký divný
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('vek%s' => '10', 'vyska = %s' => '100'),
));
SELECT *
FROM `table`
WHERE (10 100)
Promiň, malinko špatně… :)
dibi::test('SELECT * FROM `table` WHERE %and', array(
'vek%s' => '10',
'vyska%s' => '100'
));
Měl jsem tam dvě pole v sobě.
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
Zkusil jsem to a výsledek je stejný jako v prvním příspěvku tedy
dibi::test('SELECT * FROM `table` WHERE %and', array(
'vek%s' => '10',
'vyska%s' => '100'
));
SELECT *
FROM `table`
WHERE (`vek` = '') AND (`vyska` = '')
Nejvíc mě zaráží, že když tam %s vyměním za %i, tak to ten dotaz poskládá správně (napadlo mě, jestli to není verzí, ale zkoušel jsem latest i 1.2 a chová se to stejně) :/
Editoval al1716 (21. 9. 2011 15:27)
Tohle prostě musí fungovat.. jestli ne, tak si stáhni dibi z githubu
dibi::test('SELECT * FROM `table` WHERE %and', array(
'vek' => '10',
'vyska' => '100'
));
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
Tvůj poslední příklad
dibi::test('SELECT * FROM `table` WHERE %and', array(
'vek' => '10',
'vyska' => '100'
));
SELECT *
FROM `table`
WHERE (`vek` = '') AND (`vyska` = '')
Stáhl jsem si klon dibi z githubu a stále to nedělá to, co bych si myslel, že to dělat má. Požadovaného dotazu jsem dosáhl pomocí
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('vek = ', '10'),
array('vyska = ', '100')
));
SELECT *
FROM `table`
WHERE (vek = 10) AND (vyska = 100)
U příkladu s věkem a výškou ty parametry snadno ošetřím pomocí intval(), ale co kdybych chtěl kontrolovat jméno?
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('jmeno = ', "Connan"),
array('prijmeni = ', "O'Brian")
));
prijmeni = O**Alone quote**Brian
podobně v případě, že na ta data použiju mysql_real_escape_string() nebo podobnou funkci
dibi::test('SELECT * FROM `table` WHERE %and', array(
array('jmeno = ', "Connan"),
array('prijmeni = ', mysql_real_escape_string("O'Brian"))
));
prijmeni = O\**Alone quote**Brian // oproti předchozímu je zde ještě zpětné lomítko
Editoval al1716 (21. 9. 2011 16:06)
Syntaxe je OK.
Jsi připojený k databázi když to testuješ? Řetězce se v MySQL
driveru escapují pomocí mysql_real_escape_string() a tahle funkce
vyžaduje aktivní připojení. Jinak je totiž vráceno false a to se
vyhodnotí jako prázdný řetězec. Zapnuté
error_reporting(E_ALL) máš?
Editoval Milo (21. 9. 2011 16:20)
Jáááj! Já mám v php nastaveno error_reporting = E_ALL |
E_STRICT, ale v tom skriptu bylo nastaveno
error_reporting(0). Když jsem to zakomentoval, tak vyskočilo
několik varování a poznámek včetně
Warning: mysql_real_escape_string(): 23 is not a valid MySQL-Link resource in ...\libs\dibi\drivers\mysql.php on line 305
Před tím mým skládáním dotazu je použita nějaká funkce, ve které se
volá mysql_close();
Tímto vám oběma děkuju za nápady a HosipLan(ovi? :)) navíc za trpělivost. Díky!
dibi::test('SELECT * FROM `table` WHERE %and', array( array('vek = ', '10'), array('vyska = ', '100') )); SELECT * FROM `table` WHERE (vek = 10) AND (vyska = 100)
Tohle je myslím bezpečností díra. Nejsem si jistý, jestli dibi správně pozná, že to druhé je parametr… Můžeš ale zkusit ještě alternativní syntaxi, kterou mám osobně mnohem raději, protože je čitelnější
dibi::select('*')->from('table')
->where('vek = %s', '10')
->and('vyska = %s', '100')
->test(); // vypíše SQL, s ->fetch() vykoná dotaz
Nebo pokud potřebuješ dynamicky ty podmínky
$q = dibi::select('*')->from('table');
$podminky = array('vek' => '10', 'vyska' => '100');
foreach ($podminky as $column => $value) {
$q->where('%n = %s', $column, $value);
}
$q->test();
Ale tvůj kód je jinak správně i podle dokumentace… Divné… :-/
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
HosipLan: Znovu díky za nápady, trpělivost a i za tu alternativni
syntaxi. Milo mě nakopl správným směrem. Jak
už jsem psal bylo to tím, že ve funkci před skládáním dotazu byla
volána funkce mysql_close().