php
  • mysql
  • 2013-05-07 67 views 1 likes 
    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調用中拖出字段名稱,並使用刻度轉義它們。我不明白如果只是在一秒前從數據庫中讀取該列時不能找到該列。

    任何幫助表示讚賞。

    回答

    1

    請勿使用show columns。這從來沒有真正用於你如何使用它。使用information_schema meta-db代替:

    select COLUMN_NAME 
    from information_schema.COLUMNS 
    where (TABLE_SCHEMA='name of db') AND (TABLE_NAME = 'name of your table') 
    
    +0

    謝謝!有沒有辦法保持它的db_name不可知,以便我可以將它指向一個測試數據庫? – 2013-05-07 19:53:23

    +0

    只是讓table_schema成爲您在別處重置的變量。把它命名爲開發的一件事,另一件用於生產。 – 2013-05-07 20:16:56

    +0

    我喜歡這樣的代碼片段,它是「正確的方式」,但是在實現它之後,這並沒有解決我的問題(也不可能,因爲它會產生同樣錯誤的查詢字符串) – 2013-05-07 20:21:12

    相關問題