K SQL dotazu se automaticky připojí LIMIT

K SQL dotazu se automaticky připojí LIMIT

autor Ivan Šiška -
Počet odpovědí: 3

Dobrý den,

 

snažím se dostat z databáze jednoduchý limitovaný výpis. Ovšem k mému limitu Moodle automaticky připojí svůj. Nevíte, jak "automatiku" obejít?

 

Debug info: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1', 20 LIMIT 2, 18446744073709551615' at line 1
SELECT * FROM mdl_dotaznik_vyplneno WHERE dotaznik = ? ORDER by cas_odevzdani DESC LIMIT ?, 20 LIMIT 2, 18446744073709551615
[array (
0 => '1',
1 => 1,
)]
Error code: dmlreadexception
Stack trace:
  • line 441 of /lib/dml/moodle_database.php: dml_read_exception thrown
  • line 996 of /lib/dml/mysqli_native_moodle_database.php: call to moodle_database->query_end()
  • line 47 of /mod/dotaznik/respondenti.php: call to mysqli_native_moodle_database->get_records_sql()
  • line 89 of /mod/dotaznik/odpovedi.php: call to require_once()
Počet hodnocení: -
V odpovědi na Ivan Šiška

Re: K SQL dotazu se automaticky připojí LIMIT

autor David Mudrák -
Obrázek: Moodle HQ Obrázek: Obzvláště nápomocní moodlisté Obrázek: Překladatelé Obrázek: Vývojáři
A jak vypadá ten řádek 47 vašeho souboru /mod/dotaznik/respondenti.php ?
V odpovědi na David Mudrák

Re: K SQL dotazu se automaticky připojí LIMIT

autor Ivan Šiška -
$DB->get_records_sql('SELECT * FROM mdl_dotaznik_vyplneno WHERE dotaznik = '.$dotaznik->id.' ORDER by cas_odevzdani DESC LIMIT '.$radkyod.', '.$radkydo, array(''), $strictness=MUST_EXIST);

 

Navíc ten automatický LIMIT začíná od 2. Chybí mi tedy pak dva záznamy ve výpisu.

 

EDIT: Vymazal jsem 

$strictness=MUST_EXIST

a už to frčí.

 

Děkuju za ochotu.

 

V odpovědi na Ivan Šiška

Re: K SQL dotazu se automaticky připojí LIMIT

autor David Mudrák -
Obrázek: Moodle HQ Obrázek: Obzvláště nápomocní moodlisté Obrázek: Překladatelé Obrázek: Vývojáři

Mno, já tam vidím ještě pár problémů.

  • Předpona názvů tabulek mdl_ je konfigurovatelná, tudíž ji nemůžete takto natvrdo zapsat do kódu (na jiném serveru, který používá jinou či žádnou, by to nefungovalo).
  • Váš způsob doplňování proměnných do dotazu je potenciálně nebezpečný, proto se používají vázané parametry.
  • Klauzule LIMIT není obecně cross-db kompatibilní, proto ji mají $DB metody implementovanou zvlášť.

Váš kód by měl vypadat nějak takto

$records = $DB->get_records_sql("SELECT * FROM {dotaznik_vyplneno} WHERE dotaznik = ? ORDER BY cas_odevzdani",
    array($dotaznik->id), $radkyod, $pocetradku);

případně ještě lépe

$records = $DB->get_records("dotaznik_vyplneno", array("dotaznik" => $dotaznik->id), "cas_odevzdani",
    "*", $radkyod, $pocetradku);

Podrobnosti na http://docs.moodle.org/dev/Data_manipulation_API