[wp-trac] [WordPress Trac] #30655: dbdelta(): issues when using backticks for reserved SQL keywords
WordPress Trac
noreply at wordpress.org
Wed Dec 10 05:53:52 UTC 2014
#30655: dbdelta(): issues when using backticks for reserved SQL keywords
--------------------------+-----------------------------
Reporter: harmr | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Database | Version: 4.0.1
Severity: normal | Keywords:
Focuses: |
--------------------------+-----------------------------
Within my plugin "Leaflet Maps Marker"
(http://wordpress.org/extend/plugins/leaflet-maps-marker/) I am using the
following dbdelta()-statement within /inc/install-and-updates.php to
create the tables I need for my plugin:
{{{
$table_name_layers = $wpdb->prefix.'leafletmapsmarker_layers';
$sql_layers_table = "CREATE TABLE " . $table_name_layers . " (
id int(6) unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
basemap varchar(25) NOT NULL,
layerzoom int(2) NOT NULL,
mapwidth int(4) NOT NULL,
mapwidthunit varchar(2) NOT NULL,
mapheight int(4) NOT NULL,
panel tinyint(1) NOT NULL,
layerviewlat decimal(9,6) NOT NULL,
layerviewlon decimal(9,6) NOT NULL,
createdby varchar(30) NOT NULL,
createdon datetime NOT NULL,
updatedby varchar(30) DEFAULT NULL,
updatedon datetime DEFAULT NULL,
controlbox int(1) NOT NULL,
overlays_custom int(1) NOT NULL,
overlays_custom2 int(1) NOT NULL,
overlays_custom3 int(1) NOT NULL,
overlays_custom4 int(1) NOT NULL,
wms tinyint(1) NOT NULL,
wms2 tinyint(1) NOT NULL,
wms3 tinyint(1) NOT NULL,
wms4 tinyint(1) NOT NULL,
wms5 tinyint(1) NOT NULL,
wms6 tinyint(1) NOT NULL,
wms7 tinyint(1) NOT NULL,
wms8 tinyint(1) NOT NULL,
wms9 tinyint(1) NOT NULL,
wms10 tinyint(1) NOT NULL,
listmarkers tinyint(1) NOT NULL,
multi_layer_map tinyint(1) NOT NULL,
multi_layer_map_list varchar(4000) DEFAULT NULL,
address varchar(255) NOT NULL,
clustering tinyint(1) unsigned NOT NULL,
gpx_url varchar(2083) NOT NULL,
gpx_panel tinyint(1) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
dbDelta($sql_layers_table);
}}}
I now found out that some mySQL-servers (clustered edition) have
clustering as defined keyword (although it is not mentioned in their doc
at https://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-
reference-reservedwords-5-5.html or https://dev.mysql.com/doc/mysqld-
version-reference/en/mysqld-version-reference-reservedwords-5-6.html -
have told the mySQLs guys about it, but they did not add it yet).
To fix this for my plugin users, I added backticks to corresponding SQL
statements, including the dbdelta()-function:
{{{
$table_name_layers = $wpdb->prefix.'leafletmapsmarker_layers';
$sql_layers_table = "CREATE TABLE " . $table_name_layers . " (
id int(6) unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
basemap varchar(25) NOT NULL,
layerzoom int(2) NOT NULL,
mapwidth int(4) NOT NULL,
mapwidthunit varchar(2) NOT NULL,
mapheight int(4) NOT NULL,
panel tinyint(1) NOT NULL,
layerviewlat decimal(9,6) NOT NULL,
layerviewlon decimal(9,6) NOT NULL,
createdby varchar(30) NOT NULL,
createdon datetime NOT NULL,
updatedby varchar(30) DEFAULT NULL,
updatedon datetime DEFAULT NULL,
controlbox int(1) NOT NULL,
overlays_custom int(1) NOT NULL,
overlays_custom2 int(1) NOT NULL,
overlays_custom3 int(1) NOT NULL,
overlays_custom4 int(1) NOT NULL,
wms tinyint(1) NOT NULL,
wms2 tinyint(1) NOT NULL,
wms3 tinyint(1) NOT NULL,
wms4 tinyint(1) NOT NULL,
wms5 tinyint(1) NOT NULL,
wms6 tinyint(1) NOT NULL,
wms7 tinyint(1) NOT NULL,
wms8 tinyint(1) NOT NULL,
wms9 tinyint(1) NOT NULL,
wms10 tinyint(1) NOT NULL,
listmarkers tinyint(1) NOT NULL,
multi_layer_map tinyint(1) NOT NULL,
multi_layer_map_list varchar(4000) DEFAULT NULL,
address varchar(255) NOT NULL,
`clustering` tinyint(1) unsigned NOT NULL,
gpx_url varchar(2083) NOT NULL,
gpx_panel tinyint(1) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
dbDelta($sql_layers_table);
}}}
This workaround is ok and works for my users (tested on several different
installations) - it produces a PHP error (Undefined offset: 1) though in
the PHP log files.
I now read in the Codex
(http://codex.wordpress.org/Creating_Tables_with_Plugins) the following:
'''You must not use any apostrophes or backticks around field names.'''
Which is really bad - I know that backticks work in dbdelta(), but it is
officially not supported. Changing the column name to an unreserved name
is not really an option, as dbdelta() does not support renaming existing
columns and just adds a new column at the end of the table with the new
name (as well as other dependencies I would not want to change because of
this if there is another workaround).
Is the info in the codex about backticks still valid? If yes, is there a
way to officially support backticks within dbdelta() in one of the next
releases, as currently I do not know another way how to solve this within
my plugin.
Thanks for any help!
Robert
--
Ticket URL: <https://core.trac.wordpress.org/ticket/30655>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list