Skip to content

Frequently asked questions

This FAQ condenses recurring questions from open and closed MRBS support issues. The answers have been checked against MRBS 1.12.2; an old workaround is not included merely because it once appeared in an issue.

How this FAQ was selected

The review covered issues carrying at least one of these labels: Help, Help from scratch, LDAP help need, Problems with room's capacity, support, spanish help, support request, help wanted, and custom view help.

On 26 July 2026, the support request label alone contained 3,076 issues: 1,590 open and 1,486 closed. Many are imported historical cases, one-off customizations, feature requests, or questions without a confirmed answer. Only recurring questions with an answer that is still useful for 1.12.2 are included below. Issue links provide provenance, not a replacement for the current configuration reference.

Installation and diagnosis

Why do I see a blank page or HTTP 500?

Read the web-server and PHP error logs first. A blank page is only the visible symptom; the useful error is normally in a log. Then check:

  1. the supported PHP version and required extensions;
  2. config.inc.php with php -l config.inc.php;
  3. database connectivity and the matching PDO driver;
  4. file permissions and the active PHP configuration; and
  5. whether the failing request reaches the intended MRBS installation.

Do not enable public PHP error display on a production system and do not paste credentials into an issue. See Troubleshooting. The original support case #1007 had no confirmed product-specific fix, which is why this answer starts with evidence from the local logs.

Why does the database login fail on cPanel or shared hosting?

Use the exact database and username created by the hosting control panel. cPanel often prefixes both with the hosting-account name. Also verify that the user has privileges on that database. SQLSTATE[28000] or “Access denied for user” is a database authentication or grant error, not an MRBS table error.

Keep $db_database, $db_login, and $db_password consistent with the control-panel values. Create the schema only after the connection succeeds. See issue #3801 and Installation.

Why does a configuration change have no effect?

Check that you edited the config.inc.php loaded by this deployment and site. Values assigned later override earlier ones. Settings saved for existing areas live in the database; changing areadefaults.inc.php changes defaults for new areas only. In multisite mode, confirm the selected site and its configuration. Finally, clear or restart PHP opcode caching where applicable.

See config.inc.php in depth and Troubleshooting.

Login and LDAP

How can I require users to sign in before they see the calendar?

Set:

$auth['deny_public_access'] = true;

Test the signed-out view in a private browser window. This setting blocks public calendar access; it does not choose or configure the authentication backend. See issue #3979 and Users and permissions.

Why does MRBS say that the PHP LDAP extension is missing?

Install or enable the LDAP extension for the PHP runtime used by the web server, then restart that runtime. Command-line PHP and web-server PHP can load different php.ini files, so verify the web runtime rather than relying only on php -m. The exact package name and restart command depend on the operating system and PHP installation.

See issue #1022 and LDAP authentication.

How do I find the correct LDAP base DN and user DN?

Do not infer the directory tree from an organization name. Query it with an LDAP client such as ldapsearch, using the same server, TLS mode, base DN, search identity, and username attribute that MRBS will use. Active Directory commonly uses sAMAccountName; OpenLDAP commonly uses uid, but the directory schema is authoritative.

Test the search identity separately from the end-user bind and never publish bind passwords. A wrong DN was the root cause in issue #1083.

How can LDAP access be limited to a group?

Use $ldap_filter to decide which directory users may access MRBS. For an Active Directory layout where membership is stored on the user object, a filter can match memberof. For an OpenLDAP-style layout where membership is stored on group objects, configure $ldap_filter_base_dn, $ldap_filter_user_attr, and an appropriate $ldap_filter.

Use the exact DN and attribute names from the directory, test an allowed and a rejected account, and confirm how nested groups behave. These access filters are separate from $ldap_admin_group_dn, which identifies MRBS administrators. See issue #2033 and LDAP authentication.

LDAP login works; why is the user not an MRBS administrator?

When $ldap_admin_group_dn is set, MRBS uses that group instead of $auth['admin']. Confirm:

  • the full group DN;
  • $ldap_group_member_attrib — memberof by default;
  • that the LDAP search identity may read the user's membership attributes; and
  • whether the directory returns direct or nested membership.

Temporarily enable LDAP diagnostics only in a protected test environment and remove them afterward. In issue #3943, the search identity could not initially read the required group information.

Why can LDAP fail after an MRBS upgrade although password binding works?

Current MRBS may need to search for a user's DN and attributes such as display name or email. If anonymous search is unavailable, configure:

$ldap_dn_search_attrib = 'sAMAccountName'; // use the directory's real attribute
$ldap_dn_search_dn = 'search-account@example.org';
$ldap_dn_search_password = 'read-from-a-protected-secret';

Give the search identity only the read permissions it needs. Keep its password outside the document root and include it from a protected configuration file. See issue #3895.

Can MRBS search more than one LDAP directory?

Yes. Many LDAP settings, including $ldap_host, $ldap_port, $ldap_base_dn, and search attributes, can be arrays. If one array-capable LDAP parameter is an array, every array-capable parameter must have the same number of elements, one per directory.

Test login, attribute lookup, access filters, and administrator mapping for each directory. See issue #3981 and the LDAP section in systemdefaults.inc.php.

Bookings, rooms, and permissions

Why does a custom booking field work for one booking but fail for a series?

Every custom booking column must exist in both the entry and repeat tables with the same name, type, length, nullability, and default. Treat both columns as one schema change.

See issue #3986 and Custom fields.

Does room capacity prevent a booking with too many participants?

No. The room capacity value is room metadata displayed by MRBS; it is not automatically compared with a booking's attendee count. If a site must enforce this rule, add an identical participant-count custom field to entry and repeat, then implement and maintain server-side validation. Client-side validation alone is insufficient.

If registration is enabled, its event capacity controls registration for that event; it does not automatically select a suitably sized room. See issue #1055, Areas and rooms, and Custom fields.

Can one area use 30-minute slots in the morning and 15-minute slots later?

Not through standard area configuration. An area has one time resolution. Use the smallest required resolution for the whole day, or create separate areas when the resources and operating model allow it. A time-dependent resolution requires a maintained code customization.

See issue #4011.

Why can a booking creator not see Edit or Delete?

Check the existing area's booking policy through Rooms. Advance/future editing limits and rules for past bookings can remove those actions even from the creator. Also confirm the signed-in identity, ownership, administrator status, and whether the item is one occurrence or a series.

Changing areadefaults.inc.php does not update an existing area. See issue #3994 and Booking policies.

Are rooms selected in a multiroom booking permanently linked?

No. MRBS creates separate booking entries. If one is later edited or deleted, the others are not a durable linked group. Do not copy a generated list of all selected rooms into every description unless the site also maintains that list throughout create, edit, and delete operations.

See issue #2223.

Can I add more access levels or give a custom role only report access?

Standard MRBS uses access levels 0, 1, and 2. Additional numeric roles and page-specific permissions require a local authorization customization, tests, and review after every upgrade. A patch from an old issue is not a supported configuration option.

Prefer standard area/room delegation and public reports with narrow allowlists where they meet the requirement. See issue #3999 and Users and permissions.

Email, language, and time

Why does email debugging report “No recipients”?

Enable at least one intended recipient role:

$mail_settings['admin_on_bookings'] = true;
$mail_settings['area_admin_on_bookings'] = true;
$mail_settings['room_admin_on_bookings'] = true;
$mail_settings['booker'] = true;

For the first option, set $mail_settings['recipients']. For area and room administrators, maintain their email addresses in MRBS. LDAP users need a readable and correctly mapped email attribute when the booker is notified. Then test create, edit, and delete events separately.

See issue #3795 and Email notifications.

Which value should I use for $override_locale?

Use a BCP 47 language tag such as en, en-GB, de, fr, or es, not an operating-system locale string. The server must still have suitable locale data. On Unix-like systems, locale -a shows installed locales.

Leave $override_locale empty to use MRBS automatic selection. See issue #3984 and Text and translations.

Why are displayed times exactly one hour wrong?

Check, in order:

  1. the room and area timezone;
  2. the global $timezone;
  3. PHP's timezone and timezone-data package;
  4. the affected date's daylight-saving transition; and
  5. whether the stored timestamp or only its display is wrong.

Use an IANA timezone such as Europe/Berlin, not a fixed UTC offset. Old issues mention version-specific formatting workarounds; $force_strftime is not a setting in MRBS 1.12.2 and must not be copied from issue #3967. See Troubleshooting.

How do I customize or translate the Help page and interface text?

The in-application Help page is loaded from web/site_faq/. For example, Spanish uses site_faq_es.html; set $faqfilelang = 'es' when the language must be selected explicitly. Keep a complete translated file for each supported language.

For short interface changes, use $vocab_override[LANG][TOKEN] in config.inc.php instead of editing web/lang/lang.*. Custom database fields use tokens such as entry.catering.

See issue #2432 and Text and translations.

Reports, multisite, and customization

How can a scheduled job export a report or iCalendar data?

Unauthenticated GET reports are disabled by default. If the information may be exposed this way, enable them deliberately and restrict them with:

$report_unauthenticated_get_enabled = true;
$report_keys_enabled = true;
$report_keys = ['a-long-random-secret'];
$report_open_areas = [1];
$report_open_rooms = [];

Use an unguessable key, a narrow area/room allowlist, HTTPS, and a protected scheduler. Test the exact output while signed out. A report URL is effectively a credential and can leak through logs or history.

See issue #3742 and Search and reports.

Can multiple MRBS sites share one set of tables?

No, not if their bookings and settings must be separate. Each site needs its own MRBS tables, either in a separate database or with a unique $db_tbl_prefix in a shared database. The code can be shared, but the table sets must not overlap.

Create every site's tables with the MRBS schema scripts and apply its prefix consistently. See issue #3917 and Multisite.

Is every requested view or theme available through configuration?

No. Requests such as inserting additional room text into a particular calendar layout, linking otherwise independent bookings, adding access levels, or replacing the theme architecture may require code changes. Before applying a patch from a support issue:

  • check whether 1.12.2 already has a setting or extension point;
  • keep the change outside generated and vendor files;
  • add tests for create, edit, delete, privacy, and permissions; and
  • record the customization for the next upgrade.

Examples include custom-view issue #2223 and theme request #22.