Read this when changing MySQL connections, mappers, transactions, or persistence invariants.
| File | Key symbols |
|---|---|
src/Core/System/System.php |
F3 DB\SQL connection and PDO options |
src/Core/System/User.php |
users mapper, role serialization, password hash generation |
src/Core/System/Notifications.php |
notifications mapper and table-wide clear operation |
src/Core/Api/UserController.php |
Account CRUD, row locks, transactions, duplicate detection |
phpengine.sql |
Schema, unique index, and sample data |
System.System creates the DB\SQL connection with PDO exceptions and stores it as F3 DB.| Boundary | Mechanism | Location |
|---|---|---|
| Connection secrets | Values originate in runtime configuration, not request input | cfg/config.bin loaded by index.php |
| Request values in queries | Mapper predicates use placeholders for username/ID lookups | User, AuthController, UserController |
| Duplicate identities | Application precheck plus uq_users_username database constraint |
UserController, phpengine.sql |
| Final administrator race | Transaction and SELECT id FROM users FOR UPDATE serialize checks and mutations |
UserController |
| Role deserialization | unserialize(..., ['allowed_classes' => false]) prevents object instantiation |
User::__construct() |
| Table-wide notification deletion | Only authenticated, CSRF-protected notification API path reaches emptyAll() |
NotificationController::delete() |
DSN global.ERRMODE_EXCEPTION is set; persistence is enabled on Linux or CLI.$db->log(false) to avoid known framework memory leakage.See database conventions and identity spec.