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
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ěď.
- Bart
- Člen | 11
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);
}
?>