我有一段像这样的代码:
// get media table columns
$media_columns = $this->many( "SHOW COLUMNS FROM media;" );
$media_fields = array(); // array to filter out unnecessary col data
$pk_name = 'ignore_this';
foreach( $media_columns as $col ) {
$field = $col['Field'];
if( $field !== $pk_name ) {
array_push($media_fields, '`'.$field.'`');
}
}
$fields_str = "(".implode(",", $media_fields).")"; // put in string
// we will be overriding the campaign_uid with parent_uid
$insert_str = str_replace("`campaign_uid`", "'$parent_uid'", implode(',', $media_fields) );
// duplicate draft media, pointing to parent campaign
$this->none(
"INSERT INTO media ".
"$fields_str ".
"SELECT $insert_str ".
"FROM media WHERE `campaign_uid`='$campaign_uid' "
);
抛出错误:
exception 'Exception' with message 'ADO Error: Unknown column 'margin-left' in 'field list' { INSERT INTO media (`ignore_this`,`nonprofit_uid`,`campaign_uid`,`meta_id`,`image_name`,`url`,`type`,`subtype`,`mark`,`last_updated`,`deleted`,`margin-left`,`margin-top`)
SELECT `ignore_this`,`nonprofit_uid`,'XXXXXX',`meta_id`,`image_name`,`url`,`type`,`subtype`,`mark`,`last_updated`,`deleted`,`margin-left`,`margin-top` FROM media
WHERE `campaign_uid`='XXXXXXXXXXX }'
在您询问有关时髦的sql包装函数之前:不要。我从前任那里继承了一堆乱糟糟的代码库,基本上只能使用他的函数。
出于同样的原因,我们在mysql列名中使用连字符。因为是margin-left
失败了,我怀疑这就是问题所在,但是到处都有对该列名的硬编码引用,重构并不是一个非常有吸引力的选择。
有趣的是,我直接从SHOW COLUMNS调用中提取字段名,并用刻度转义它们。我不明白为什么一秒钟前刚从数据库中读取的列找不到。
不要使用show columns
。这不是你真正想要的用法。使用information_schema
元数据库代替:
select COLUMN_NAME
from information_schema.COLUMNS
where (TABLE_SCHEMA='name of db') AND (TABLE_NAME = 'name of your table')