Problem s nette database po aktualizaci na PHP 5.5.25
- Rypi
- Člen | 38
Ahoj,
včera jsem zaktualizoval server na php 5.5.25 (dotdeb). Puvodni byla tusim
5.5.24 dotdeb.
Dneska ráno jsem si všimnul, že mi nejede web a generuje stovky
exceptions.
Pomoci composer update jsem zaktualizoval nette (na 2.2.9), to ale
nepomohlo.
Nakonec jsem server přeinstaloval na php 5.4 a uz to zase jede.
Podle tracy je problém v generování SQL kódu – vynechává se WHERE.
Něco jako:
$this->context->createService('ip')->table()->where(array('ip' => $this->remoteIp))->fetch()
Vygeneruje:
SELECT *
FROM `ip` '1.2.3.4'
Error log:
PHP Warning: preg_replace_callback(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 191 in ...nette/database/src/Database/Table/SqlBuilder.php:395
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 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.2.3.4'' at line 1 in ...nette/database/src/Database/ResultSet.php:68
Omlouvám se za stručnost, i za „neaktuální nette“, ale mám teď jiné starosti. Snad tohle někomu pomůže při řešení problému. Netuším, v čem by mohl být problém.
- filipsedivy
- Člen | 37
No where se mi nezdá že by se vynechávalo, spíše ve funkci
->table()->
nemáte vyplněnou tabulku.
- leninzprahy
- Člen | 150
Narazil jsem na stejný problém po aktualizaci PHP 5.6.7 > 5.6.9 na jednom testovacím serveru, na lokále jsem pak PHP 5.6.9 taky rozjel, ale tam mi to fungovalo.
Cache jsem mazal…
Nejpodivnější na tom je, že se mi to na lokále nepodařilo reprodukovat, ač vše vypadalo stejně, jediný větší rozdíl je, že na lokále mám Apache 2.4.12, na testovacím běží 2.2.22.
Nakonec jsem to vyřešil odstraněním NDBT, místo
->table(...)->where(...)->fetch();
jsem
použil ->query('SELECT ....')->fetch();
Jsem zvědav, kde nakonec bude ta chyba :)
EDIT:
Ještě jsem na to koukal, a pokud zapnu debug mode, vyhodí mi to
varování
preg_replace_callback(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 191
v nette/database/src/Database/Table/SqlBuilder.php:395
při parsování podmínky WHERE (username = ?)
nette/database: v2.2.4
Editoval leninzprahy (25. 5. 2015 19:26)
- David Matějka
- Moderator | 6445
vypada to na bug v php: https://bugs.php.net/bug.php?…
relevantni issues u jinych projektu:
https://github.com/…r/issues/259#…
https://forge.typo3.org/issues/67048
- leninzprahy
- Člen | 150
I can reproduce it on Debian GNU/Linux 7
with
PHP 5.6.9-1~dotdeb+7.1 (cli) (built: May 15 2015 15:18:14)
- Milo
- Nette Core | 1283
Cannot reproduce it with
PHP 5.6.9-1~dotdeb+7.2 (cli) (built: Jun 2 2015 19:39:06)
and
Nette Database v2.2.4
by code:
require __DIR__ . "/../database/vendor/autoload.php";
$stor = new Nette\Caching\Storages\MemoryStorage;
$conn = new Nette\Database\Connection("pgsql:host=localhost;dbname=nette_test;port=50930", "postgres");
$refl = new Nette\Database\Reflection\DiscoveredReflection($conn, $stor);
$ctx = new Nette\Database\Context($conn, $refl, $stor);
$ctx->table('ip')->where(['ip' => '127.0.0.1'])->fetch();
CREATE TABLE ip (ip VARCHAR);
- Unlink
- Člen | 298
It was fixed in 5.6.9-1~dotdeb+7.2
https://www.dotdeb.org/…-for-wheezy/
Editoval Unlink (5. 6. 2015 15:19)
- leninzprahy
- Člen | 150
If I use regexp from
nette/database/src/Database/Table/SqlBuilder.php:386
(v2.2.4)
preg_match('~
(?(DEFINE)
(?P<word> [\w_]*[a-z][\w_]* )
(?P<del> [.:] )
(?P<node> (?&del)? (?&word) (\((?&word)\))? )
)
(?P<chain> (?!\.) (?&node)*) \. (?P<column> (?&word) | \* )
~xi', 'WHERE test = ?');
then I get
Warning: preg_match(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 191 in ...
or
require __DIR__ . "/vendor/autoload.php";
$stor = new Nette\Caching\Storages\MemoryStorage;
$conn = new Nette\Database\Connection("sqlite::memory:");
$refl = new Nette\Database\Reflection\DiscoveredReflection($conn, $stor);
$ctx = new Nette\Database\Context($conn, $refl, $stor);
$ctx->query('CREATE TABLE ip (ip VARCHAR);');
$ctx->table('ip')->where(['ip' => '127.0.0.1'])->fetch();
return the same result
Warning: preg_replace_callback(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 191 in ...
PHP 5.6.9-1~dotdeb+7.1 (cli) (built: May 15 2015 15:18:14)
and
Nette Database v2.2.4