Bindování parametrů dotazu

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

Zdravím, mám následující jednoduchý databázový dotaz:

<?php
        $result = $this->query("SELECT *
                                FROM `distribution`
                                WHERE person_id = ?", 319)
                       ->fetchAll();

        foreach ($result as $row) {
            Debugger::fireLog($row);
        }
?>

volání skončí vyjímkou:
Nette\Database\DriverException #HY093
SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

<?php
 ...\database\src\Database\Drivers\MySqlDriver.php:65	source  Nette\Database\DriverException::from(arguments)

55:            } elseif (in_array($code, array(1062, 1557, 1569, 1586), TRUE)) {
56:                return Nette\Database\UniqueConstraintViolationException::from($e);
57:
58:            } elseif ($code >= 2001 && $code <= 2028) {
59:                return Nette\Database\ConnectionException::from($e);
60:
61:            } elseif (in_array($code, array(1048, 1121, 1138, 1171, 1252, 1263, 1566), TRUE)) {
62:                return Nette\Database\NotNullConstraintViolationException::from($e);
63:
64:            } else {
65:                return Nette\Database\DriverException::from($e);
66:            }
67:        }
68:
69:

...\vendor\nette\database\src\Database\ResultSet.php:75	source  Nette\Database\Drivers\MySqlDriver->convertException(arguments)

...\vendor\nette\database\src\Database\Connection.php:187	source  Nette\Database\ResultSet->__construct(arguments)

...\vendor\nette\database\src\Database\Context.php:80	source  Nette\Database\Connection->query(arguments)

C:\PHP\sktscore\app\model\Table.php:80	source  Nette\Database\Context->query(arguments)

C:\PHP\sktscore\app\model\Distribution.php:43	source  App\Model\Table->query(arguments)

C:\PHP\sktscore\app\presenters\ResultPresenter.php:36	source  App\Model\Distribution->getResultsByPersonsAndCategories(arguments)

inner-code	App\Presenters\ResultPresenter->renderSetter()

...\src\Application\UI\PresenterComponent.php:87	source  ReflectionMethod->invokeArgs(arguments)

...\nette\application\src\Application\UI\Presenter.php:206	source  Nette\Application\UI\PresenterComponent->tryCall(arguments)

...\nette\application\src\Application\Application.php:141	source  Nette\Application\UI\Presenter->run(arguments)

...\nette\application\src\Application\Application.php:81	source  Nette\Application\Application->processRequest(arguments)

C:\PHP\sktscore\www\index.php:8	source  Nette\Application\Application->run()
?>

Nevíte prosím proč se tak děje? Proč se parametr nedosadí?
Volání (SELECT * FROM distribution) bez parametru mi proběhne v pořádku a data se načtou.

config.local.neon mám následující:

<?php
database:
    localhost:
        dsn: 'mysql:host=127.0.0.1;dbname=sktscore'
        user: root
        password: root
        options:
            lazy: yes
?>

Děkuji za odpověď.

CZechBoY
Člen | 3608
+
0
-

To tvoje by melo snad fungovat… No zkus jeste variantu 2:

$result = $context->queryArgs($sql, [319]);

Btw. Muzes jeste poslat tu tvoji metodu query? Pro uplnost…

Bart
Člen | 11
+
0
-

Varianta 2 mi funguje.
Metoda query:

<?php
...
    public function __construct(Nette\Database\Context $db) {
        $this->connection = $db;
    }

    public function query($sql) {
        return $this->connection->query($sql);
    }
...
?>

Když tak na to koukám, už mě to trklo, bodejď by to fungovalo, on se tam ten parametr skutečně nepředádvá :)
Toto už funguje:

<?php
    public function query($sql, $params = []) {
        return $this->connection->query($sql, $params);
    }
?>