創業過程當中的63個技術問題

1.Eclipse Marketplace搜索Hibernate,比較靠前的位置有「Hibernate Tools」,使用代碼自動生成,提升開發效率! 須要選擇正確的版本,我用的是Indigo! Eclipse插件:Hibernate Tools安裝以後,沒有找到自動生成代碼的菜單。 只好在Myeclipse下使用,而後再拷貝到工程中。 遇到一個問題,建立工程時,須要先「增長對Hibernate的支持」,而後才能生成代碼,要否則沒法選擇SrcFolder! 2.把Java Web項目部署到Tomcat的根目錄。  項目--右鍵--屬性--項目屬性裏面找到一個 web project setttings選項菜單,裏面有一個context root能夠設置`````` 3. <!-- Properties文件讀取配置,*.properties --> <context:property-placeholder location="classpath*:*.properties" /> <!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  <property name="locations"> <list> <value>classpath:*.properties</value>  </list> </property> </bean> --> <!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  <property name="locations"> <list> <value>classpath*:*.properties</value>  </list> </property> </bean> --> 4.SpringMVC後端只能接收到get方式發送的請求參數,沒法接收到post。  @RequestParam  @RequestBody    5.調整iframe高度 <iframe id="frm_footer" name="frm" src="<s:url value='/common/footer.jsp'/> " frameborder="0" height="750px" scrolling="no" width="100%"  style="height:750px;"></iframe> ie8和Firefox怎麼都不支持iframe的height字段??? 經過style="height:700px"設置有效。 6.$.ajax({             url : this.dataSource,                 data : this.params && JSON.stringify(this.params),                 contentType : "application/json",                 type : this.method || 'POST',                 dataType : 'json',                 context : this,                 success : function(data){fill(that, data);},                 error : this.onerror             });  設置了   contentType : "application/json",使用SpringMVC的@RequestBody才能接收到參數,而不是@RequestParam。 不設置這個參數,使用@RequestParam。 7.直接使用addEntity(java.util.Map.class) 使用的原生sql查詢 SQLQuery sqlQuery = doCreateSQLQuery(sql); if (clazz != null) { sqlQuery.addEntity(clazz); } 沒法查詢 經過下面的方式是能夠的sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 這種方法爲何不行呢??  sqlQuery.setResultTransformer(Transformers.aliasToBean(clazz)); String sql = "select count(*) as count,create_time as createTime from " + tableName + " group by create_time order by create_time desc"; return getDao().sqlList(sql, Fans.class); public class Fans { private Integer count;//必須定義爲「BigInteger」,不然會報錯(太難發現了啊) private Date createTime; } org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of cn.coderzone.admin.Fans.count at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128) at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:91) at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:96) at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:361) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) at org.hibernate.loader.Loader.list(Loader.java:2271) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157) at cn.coderzone.admin.dao.base.BaseHqlDao.doQuery(BaseHqlDao.java:280) at cn.coderzone.admin.dao.base.BaseDao.sqlList(BaseDao.java:23) at cn.coderzone.admin.service.BaseService.countByDay(BaseService.java:117) at cn.coderzone.admin.service.BaseService$$FastClassByCGLIB$$55a6ed4c.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) at cn.coderzone.admin.service.ArticleService$$EnhancerByCGLIB$$39dcde90.countByDay(<generated>) at cn.coderzone.admin.test.service.ArticleServiceTest.testArticleCountByDay(ArticleServiceTest.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66) ... 51 more 8.HQL語句沒法執行更新,可是能夠執行查詢!! update Article  set status=:status and updateTime=:updateTime where id=:id Spring和Hibernate註解、事務等配置項,順序不對,致使沒法執行,可是具體爲啥不對,殊不知道。 又一個坑爹的問題!    9.在Hibernate中能夠利用@DynamicInsert和@DynamicUpdate生成動態SQL語句,即在插入和修改數據的時候,語句中只包括要插入或者修改的字段。 10.爲了減小代碼重複率,st-grid默認按照id降序。 可是有的統計頁面,根本不存在id字段,必須手動指定排序字段,「覆蓋默認的」! 這種統計頁面必須指定「排序字段」,挺奇怪的。 最終改成,在前端指定排序字段。 11.JavaScript寫的代碼,常常會遇到瀏覽器兼容性問題。   仍是應該用Jquery等第三方框架比較合適! 12.JQuery與JavaScript。    a.2個相同的jquery對象,直接使用 == ,返回false。      用attr('id')比較,比較合適。  ul.children('li').each(function(i){ if($(this).attr('id')==id){ //這裏的this應該也是JavaScript對象,使用$以後是Jquery對象 $(this).css("background-color","black"); }else{ } }); b.區分Jquery對象和JavaScript對象     var liList=ul.children('li'); for ( var i = 0; i < liList.length; i++) { //致使liList[i]元素是JavaScript對象,而不是jquery對象,沒有attr方法 var li = $(liList[i]); } 13.聯表查詢時參數的衝突應該由前端來設置!!!(前端就和業務緊密相聯) 14.64位JDK,64位Eclipse http://aquilo.diandian.com/post/2012-05-27/21832516 15.nodejs的文件編碼爲GBK,致使Express接收的參數爲亂碼。 16.mysql的配置,charset設置爲「utf8」會報錯。   nodejs中的mysql鏈接參數中,編碼參數與 Java中的mysql不同。   「 charset : The charset for the connection. (Default:  'UTF8_GENERAL_CI' . Value needs to be all in upper case letters!)」   mysqldb:{   username:"root",   password:"lw198962",     database:"itfriend",     host:"192.168.0.12",   port:3306   },     https://github.com/felixge/node-mysql    17.nodejs運行過程當中,不能使用SmartSVN等SVN軟件進行更新,會報錯。 18.有的政府網站很是坑爹,註冊表單的驗證碼區分大小寫。 19.百度加速樂真心不給力 使用以後,域名常常沒法解析。 阿里雲頻繁發出 監控報警,1天要收到好幾條短信。 「您的域名沒法訪問,您的域名恢復了」。 煩死了! 20.update article_category set name =:name, update_time =now() where id=:id  錯誤的寫法:update article_category set name =:name and update_time =now() where id=:id  讓人蛋疼的是,上面的update方法不會報錯,只是沒有更新成功而已   21.JS中,0也爲false。 期待結果:若是status的值爲null,或者status未定義,修改status的值。 //有問題 var data={status:0}; data.status=data.status||1; //正確 var data={}; (data.status== null)&&(data.status=1) 22.nodejs 查詢方法,至少返回{}數組,增長方法返回insertId 23.Nodejs批量插入  insert into article_tag(name)   values("tag"),("tag2");      拼接values值   MySQL支持,其它數據庫不必定支持「非標準」SQL語法。      async each    tags =[{userId:article.userId,articleId:result.insertId,name:"tag5"}]; async.each(tags, ArticleTagDao.add, function(err){        // if any of the saves produced an error, err would equal that error    });    24.級聯查詢1篇文章的「評論數」、「贊數」、「踩數」 select * from (select a.*,count(ac.article_id) as commentCount from article a left join article_comment ac  on a.id = ac.article_id   where a.user_id=1 group by a.id) A left join  (select a.id,count(am.type) as likeMarkCount from article a left join article_mark am on a.id = am.article_id  where type = 1 group by a.id)  B on A.id = B.id   left join (select a.id,count(am.type) as unlikeMarkCount from article a left join article_mark am on a.id = am.article_id  where type = 2 group by a.id) C on C.id = A.id limit 0,10 25.偷懶,不記住URL,總期望着複製-粘貼,QQ發送    26.sql-count的 indexOf(' from '),from的左右必須有1個空格。   var fromIndex = sql.indexOf(' from ');   var countSql = 'select count(*) as totalCount' + sql.substring(fromIndex);   普通的sql語句   var sql="select * from article";必定能夠   子查詢sql右邊,能夠不要空格,爲了使用Pager組件,增長空格   var sql ="select * from(select id,title,create_time from topic) A ";    27.app.use(express.session({         cookie:{             maxAge  :  2*60*1000(2分鐘,而不是20分鐘,cookie的單位是毫秒)         },         store:redisStore,         secret:settings.cookieSecret     })); 28.result爲[]空數組,result[0]不會報錯,可是在使用result[0].password會報錯 UserDao.getByEmailAndAccount(data,function(err,result){ console.log(JSON.stringify(result)); if(err) return callback(err); callback(err,result[0]); -------------優化工做------- 查詢有必要查詢的字段,而不是select *  var finalResult=result[0] || {};(null值判斷) var db = null; var dbConfig = settings.mongodb; var uri = 'mongodb://' + dbConfig.host + ':' + dbConfig.port + '/' + dbConfig.database db = mongoose.createConnection(uri,{server:{poolSize:dbConfig.poolSize}}); db.on('error',function(err){ winston.error("mongodb connection,error"); }); (使用鏈接池和不使用鏈接池,綁定事件的對象不同,不使用鏈接池的方式mongoose.connection.on('error',fun) Mongodb防火牆,致使沒法遠程訪問 29.JS只有函數做用域,沒有塊做用域!!! 變量重名,容易被「覆蓋」! 30.routes裏,不該該直接用 字符串保存json,而是用var json={},而不是 var json=""; jquery的post「很慢」,局域網發送須要1125ms,使用本身寫的JS封裝的POST組件,只須要215ms。 31.當即返回結果。消息通知繼續執行,不須要等待其返回。 exports.add=function(data,callback){     MessageDao.add(data,function(err,result){         callback && callback(err,result);         if(err)return;                  var notify=[];         //通知空間做者         if(data.fromUserId != data.toUserId){           var notifyUser={fromUserId:data.fromUserId,toUserId:data.toUserId,type:NotifyType.MESSAGE,resourceId:data.topId,title:data.title};           notify.push(notifyUser);         }         //通知被回覆的人         if(data.refUserId && data.refUserId != -1 && data.refUserId != data.fromUserId){            var notifyRefUser={fromUserId:data.fromUserId,toUserId:data.refUserId,type:NotifyType.MESSAGE_COMMENT,resourceId:data.topId,title:data.title};            notify.push(notifyRefUser);         }         NotifyDao.batchAdd(notify);     }); }; 32.重複的get函數,下面的會覆蓋上面的。 33.    //1.統計積分     caculateScore(function(err,scoreArray){     //new Date() == 2014-04-25 09:11:00 765512 (帶上了毫秒)          var currentTime = DateUtils.toYMDHDS(new Date());          //2.保存新的積分          ScoreUpdate.insertScore(scoreArray,function(err,result){           var deleteOldScoreSql ="update user_score_grade set status =:status,delete_time = now() where create_time < :currentTime";           var data ={status:Status.DELETED,currentTime:currentTime};           //3.刪除舊的積分           BaseDao.queryWithTransaction(deleteOldScoreSql,data,function(err,result){              callback&&callback(err,result);           });                      });      });    當前時間:2014-04-25 09:11:00 765512 新插入積分的時間是:currentTime 2014-04-25 09:11:00 須要刪除的積分時間:create_time 小於 currentTime insertScore方法執行的時候,create_time應該已經大於currentTime,不會被刪除。 因爲insertScore的時間是 2014-04-25 09:11:00(若是帶上毫秒,應該是2014-04-25 09:11:00 800) 沒有毫秒,因此 2014-04-25 09:11:00 <2014-04-25 09:11:00 765 這個問題,在數據量很小,執行速度很是快的時候,會出現。 解決方法:時間格式統一,都不要毫秒。 34. 數據庫id起始大小     alter table zone AUTO_INCREMENT=100001; 35. Bootstrap的Modal對話框組件,與form一塊兒使用的時候,按Enter會致使頁面刷新,Bug! 36. 互動百科PHP兼容性 http://kaiyuan.hudong.com/bbs/viewthread.php?tid=116485&extra=&page=1 control\index.php文件的開頭,找到相似的代碼,修改對應的代碼爲描紅部分,即: 將$this->base( & $get, &$post);  修改成$this->base(  $get,$post); 37.延遲初始化和初始化這次,節省時間! JavaWeb開發,Spring框架,默認是@Service和@Repository默認都是單例而且當即初始化。 可是我發現構造函數執行了2次。 根據個人理解,若是ArticleService不使用接口的方式,那麼須要CGLIB的庫,生成1個加強的類。 所以,執行2次。 若是有接口ArticleService implements IArticleService; @Autowired private IArticleService articleService; 沒有接口 @Autowired private ArticleService articleService; @Service @Lazy(true) public class ArticleService {} 使用@Lazy(true)能夠延遲初始化1個類。 Java程序,尤爲是Spring最麻煩的地方是,系統啓動時間實在是太長了,Tomcat部署初始化之類的過程,至少要10s。 平均在20s。 而node.js只須要2s。 延遲初始化的壞處是,系統啓動的時候,有的錯誤不能及時發現。 Dao不管是否延遲初始化,都初始化了1次,難道是Dao,不管是否使用接口,都不須要使用CGLIB加強。 若是全部的Service都使用了延遲初始化,Dao不設置,那麼使用@Repository標記的Dao,仍是會初始化, 除非也使用@Lazy(true)標記。 Service和Dao所有使用延遲初始化後,發現啓動時間減少了不到1s,唉,大部分時間仍是花在了部署上了。 仍是去掉@Lazy(true),只當是研究1個問題了。 38. JQuery根據元素的class選擇至少有2種方法 $("div.page-node").remove(); $("div[class='page-node show']").remove(); <div class="page-node show"></div> 使用div[class='page-node show'],必須是「全等」,若是隻是class='page-node',是選擇不到的。 39. Mysql備份。   之前,使用Windows系統,每次更換數據庫,都是mysqldump數據庫成sql文件備份,   如今其實有更好的方法,把Mysql的數據目錄,遷移到D盤,下次更換數據庫,只須要更換mysql數據庫的datadir配置就行了。 40.Spring中的一些提醒   私有方法,沒有執行sql語句,事務沒有起做用。   下面這篇總結很好。   參考資料:http://hi.baidu.com/coolwork/item/593855c6131a0bcf994aa0ff    41.Mysql沒法啓動或者常常掛。 阿里雲服務器512MB內存(爲了省錢,內存很低) 默認狀況下,mysql的max_connections是150,致使須要的內存很是高。 當mysql佔居內存達到80%左右的時候,會被操做系統kill。 下面是個好網站:http://www.mysqlcalculator.com/ 計算mysql須要使用多少內存,真是先進呀 42.X-UA-Compatible http://www.cnblogs.com/nidilzhang/archive/2010/01/09/1642887.html 43.textarea設置值 <textarea id="remark" style="width:100%" placeholder="寫幾句,介紹下本身吧"  maxlength="250"><%= user.remark != null?user.remark:''%></textarea> textarea沒有value屬性 Eclipse下編輯有警告,而Sublime沒有。 44.QQ瀏覽器下-上傳頭像,會出現下載對話框 返回數據不能用JSON。 res.set('Content-Type', 'text/plain'); 45.目錄和文件取名的不一樣  Linux下,這是一個文件  scoreTmpFile:"/var/www/scoregrade/upload/score",  而Windows下C:/upload/score是一個目錄,有個後綴就是文件了C:/upload/score.txt   47. 若是在啓動warning: World-writable config file /home/mysql/my.cnf is ignored  緣由:my.cnf的讀取權限進行了設置,不容許World-writable(字面意思是全世界均可讀寫)  解決方法:  sudo chmod 644 /home/mysql/my.cnf  參考資料:http://www.cnblogs.com/ylan2009/archive/2012/02/25/2368027.html   48.Ubuntu下完全卸載mysql  sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-get remove mysql-common (很是重要) 49. 又拍雲配置圖片白名單:www.itfriend.cn會致使不帶www訪問,itfriend.cn的圖片沒法打開,403forbidden。 50.網上下載的Placeholder插件不給力。 /*;(function($) {   $.fn.extend({     placeholder: function() {       if ('placeholder' in document.createElement('input')) {         return this       } else {         return this.each(function() {           var that = $(this);           var thatPlaceholder = that.attr('placeholder');           if(thatPlaceholder){             that.val(thatPlaceholder).focus(function() {               if (that.val() === thatPlaceholder) {                   if(that.attr('realType')=='password'){                       that.attr('type','password');                   }                   that.val('');               }             }).blur(function() {               if (that.val().length === 0) {                   that.val(thatPlaceholder);                  if(that.attr('realType')=='password'){                       that.attr('type','text');                   }               }             });             if(that.attr('type') == 'password'){                that.attr('type','text');                that.attr('realType','password');             }           }         })       }     }   }) })(jQuery); $("input[type=text]").placeholder(); $("input[type=password]").placeholder(); $("textarea").placeholder();*/ 下面這個還不錯,問題也是有的,咱們進行了定製和修復。 http://www.ifrans.cn/placehoder/ 51.修改頭像失敗 Z.getXiuXiuUploadUrl = function(){ var url= "http://localhost/data/user/modifyImg"; //必定要帶www //path = "http://www.itfriend.cn/data/user/modifyImg"; return url; }; 錯誤症狀:若是域名中,帶有www,QQ瀏覽器能夠修改頭像,chrome失敗; 不帶www,QQ和chrome都成功。 最終診斷出緣由:"http://www.itfriend.cn/data/user/modifyImg";這個url若是不帶www, 就有可能不能修改頭像,出現403之類的錯誤。 這個可能和瀏覽器也存在必定的關係。 解決方案就是,這個url必定帶上www,不管url的訪問路徑是否帶了www。 52.圖片沒法訪問。 http://www.itfriend.cn/user/fansunion/photo fansunion小寫,訪問不到又拍雲的圖片。 FansUnion大寫才行。 hname應該使用數據庫中保存的user.name,而不是從url參數中解析出來的name。 53.展現html的須要xss, 展現純文本的須要轉義。 54.ueditor修改編輯器的默認字體大小 //ueditor.all.js 6708行      //設置默認字體和字號 //font-family不能呢隨便改,在safari下fillchar會有解析問題 'body{margin:8px;font-family:sans-serif;font-size:14px;}' + 55.爲防止xss攻擊,對html內容進行了處理。   結果,把某個合法的內容給過濾了。    56.查看本身的積分排名。 轉化下:有多少我的的分數大於等於本身的分數,就是本身的排名。 select name,nickname,image,total_score,( select count(*) from user_score_grade where total_score>= (select total_score from user_score_grade where user_id = 16 and status=0 order by total_score desc limit 1)  and status=0) as rank  from user_score_grade usg left join user u on u.id = usg.user_id where user_id = 16 and status =0; 57.nodejs中"__dirname"是當前文件所在的目錄。 exports.croosdomain = function(req, res, next) { res.sendfile(__dirname+'/crossdomain.xml'); }; 上傳圖片須要配置跨域文件。 58.部署方式:源程序A,複製一份爲B,覆蓋B程序,把B做爲A,減小系統「停機」時間。 (這種,會不會出現不一致的狀況,在A運行的時候,產生了新的內容) 59.百度Social_uid值很大,int11位不夠存儲,改成bigint40。 60.發一份郵件,打印如下,至少知道哪些發送成功了。 emailSender.sendEmail(l, subject, content); System.out.println("mail:"+mail); 須要捕捉異常。 61.   var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+     " left join user_score_grade usg on (usg.user_id=u.id and usg.status=:status) "+     " where u.id =:userId ";  var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+     " left join user_score_grade usg on (usg.user_id=u.id ) "+     " where u.id =:userId and usg.status=:status"; 「and usg.status=:status」放在 on後面和where後面,效果是不同的。 若是在where後面,若是usg沒有這個用戶,會找不到結果 62.停用百度跟蹤,注重我的隱私 http://www.baidu.com/duty/safe_control.html 63.!important聲明的樣式優先級最高,若是衝突再進行計算。font-size:20px !important; 
相關文章
相關標籤/搜索