Problem s nette database po aktualizaci na PHP 5.5.25

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

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
+
0
-

No where se mi nezdá že by se vynechávalo, spíše ve funkci ->table()-> nemáte vyplněnou tabulku.

Rypi
Člen | 38
+
0
-

to mi chybi pouze tady. Po downgrade PHP to bez zasahu kodu zaclo fungovat.. :)

Namespace
Člen | 81
+
0
-

Napada me snad jen smazání cache, jestli tam nevisí nějaká špatnost.

leninzprahy
Člen | 150
+
0
-

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
+
0
-
David Grudl
Nette Core | 8228
+
0
-

Affected versions are probably

  • 5.6.9
  • 5.5.25
  • 5.4.41
Jan Tvrdík
Nette guru | 2595
+
0
-

Is the issue reproducible? Is it a PHP bug or PCRE bug?

David Grudl
Nette Core | 8228
+
0
-

On my computer (Windows) it is not.

leninzprahy
Člen | 150
+
0
-

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)

Jan Tvrdík
Nette guru | 2595
+
0
-

@leninzprahy And could you isolate it?

Milo
Nette Core | 1283
+
0
-

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
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8228
+
0
-