Jake Bunce
Well-known member
- Affected version
- 2.1.5a
This was initially reported by my customer as a problem with the IPB importer. The users step was failing due to one of the tables not existing. The reason for the error is because the table in question wasn't being properly prefixed in the executed query.
I have tracked this down to a problem with XenForo's db adapter:
src/XF/Db/AbstractAdapter.php
This code doesn't handle multiple spaces between the JOIN and the table name. I suggest adding the + to fix this:
The importer code which triggered this bug is in:
src/addons/XFI/Import/Importer/IpsForums.php
This query has two spaces before the table name which is not properly handled without the code fix above:
I have tracked this down to a problem with XenForo's db adapter:
src/XF/Db/AbstractAdapter.php
This code doesn't handle multiple spaces between the JOIN and the table name. I suggest adding the + to fix this:
Rich (BB code):
protected function prependPrefixToTables($prefix, $query)
{
if ($prefix == '')
{
return $query;
}
if (in_array('noPrefix', $this->getModifiersFromQuery($query)))
{
return $query;
}
return preg_replace('/((?:\s|^)(?:UPDATE|INTO|FROM|JOIN|STRAIGHT_JOIN)\s+)([a-z0-9_-]+(?:\s|$))/siU', '$1' . $prefix . '$2$3', $query);
}
The importer code which triggered this bug is in:
src/addons/XFI/Import/Importer/IpsForums.php
This query has two spaces before the table name which is not properly handled without the code fix above:
Rich (BB code):
$users = $this->sourceDb->fetchAllKeyed("
SELECT
moderator.*,
pfields_content.*,
uapr.row_perm_cache AS user_row_perm_cache,
gapr.row_perm_cache AS group_row_perm_cache,
members.*
FROM core_members AS members
LEFT JOIN core_pfields_content AS pfields_content ON
(pfields_content.member_id = members.member_id)
LEFT JOIN core_admin_permission_rows AS uapr ON
(uapr.row_id = members.member_id AND uapr.row_id_type = 'member')
LEFT JOIN core_admin_permission_rows AS gapr ON
(gapr.row_id = members.member_group_id AND gapr.row_id_type = 'group')
LEFT JOIN core_moderators AS moderator ON
(members.member_id = moderator.id AND moderator.type = 'm')
WHERE members.member_id > ? AND members.member_id <= ?
ORDER BY members.member_id
LIMIT {$limit}
", 'member_id', [$state->startAfter, $state->end]);