1
我有一段代碼,看起來像這樣相生:蜱逃脫連字符列名「在‘字段列表’未知列」
// 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調用中拖出字段名稱,並使用刻度轉義它們。我不明白如果只是在一秒前從數據庫中讀取該列時不能找到該列。
任何幫助表示讚賞。
謝謝!有沒有辦法保持它的db_name不可知,以便我可以將它指向一個測試數據庫? – 2013-05-07 19:53:23
只是讓table_schema成爲您在別處重置的變量。把它命名爲開發的一件事,另一件用於生產。 – 2013-05-07 20:16:56
我喜歡這樣的代碼片段,它是「正確的方式」,但是在實現它之後,這並沒有解決我的問題(也不可能,因爲它會產生同樣錯誤的查詢字符串) – 2013-05-07 20:21:12