Dlaczego próbujesz zrobić swoje przygotowanie w funkcji otwartej sesji? Nie wierzę, że funkcja zapisu jest wywoływana więcej niż raz w trakcie sesji, więc przygotowanie jej na otwartej przestrzeni niewiele dla ciebie daje, równie dobrze możesz to zrobić podczas sesji zapisu.
W każdym razie uważam, że potrzebujesz trochę spacji po nazwie tabeli, a przed listą kolumn. Uważam, że bez odstępu mysql działałby tak, jakbyś próbował wywołać nieistniejącą funkcję o nazwie session().
REPLACE INTO session (phpsessid, data) VALUES(?, ?)
Ciekawe, kiedy uruchamiam poniższe w mysql CLI, wydaje mi się, że otrzymuję inny wynik.
mysql> select count (*);
ERROR 1064 (42000): 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 '*)' at line 1
mysql> select count(*);
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)