Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Modifikátor %s se nenahrazuje hodnotou

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)

 

#2 před 8 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Modifikátor %s se nenahrazuje hodnotou

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 | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#3 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Re: Modifikátor %s se nenahrazuje hodnotou

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)

 

#4 před 8 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Modifikátor %s se nenahrazuje hodnotou

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 | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#5 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Re: Modifikátor %s se nenahrazuje hodnotou

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)

 

#6 před 8 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Modifikátor %s se nenahrazuje hodnotou

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 | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#7 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Re: Modifikátor %s se nenahrazuje hodnotou

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)

 

#8 před 8 měsíci

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Modifikátor %s se nenahrazuje hodnotou

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)

 

#9 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Re: Modifikátor %s se nenahrazuje hodnotou

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!

 

#10 před 8 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Modifikátor %s se nenahrazuje hodnotou

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 | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#11 před 8 měsíci

al1716
Nový člen
Registrovaný: 21. 9. 2011
Příspěvky: 6

Re: Modifikátor %s se nenahrazuje hodnotou

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().

 

Zápatí