前端經驗

PHP與數據庫

 

1. 判斷鏈接是否成功

$mysqli = new mysqli($DBHOST,$DBUSER,$DBPASS,$DBNAME);javascript

 

if($mysqli->connect_error)//返回字符串則表示有錯誤,不然返回NULLphp

 

2. 判斷查詢是否成功mysqli_query返回值

出錯代碼:html

$dbc = mysqli_connect($DBHOST,$DBUSER,$DBPWD,$DBNAME);java

$q = "select * from user where u_name='yao'";mysql

$a = mysqli_query($dbc,$q);sql

if(mysqli_num_rows($a) == 1){..}數據庫

報錯代碼:apache

 

if(mysqli_num_rows($a) == 1){..}數組

報錯內容:瀏覽器

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in/usr/local/work/apache/htdocs/fo/php/checkForm.php on line10

報錯緣由:

mysqli_query查詢失敗時返回FALSE;若是查詢成功,那麼,對於SELECT/SHOW/DESCRIBE/EXPLAIN查詢,會返回一個mysqli_result對象。而對於其它正確的查詢,會返回TRUE。

解決辦法:

對mysqli_query的返回值進行檢查,確保不是布爾值FALSE才能做爲mysqli_num_rows的參數

if($a && mysqli_num_row($a) == 1)

或者

if($result = mysqli_query($dbc,$query))

{

    $n = mysqli_num_rows($result);

}

參考連接:

php手冊 http://cn.php.net/manual/en/mysqli.query.php

 

PHP與表單

一. 表單變量的HTML書寫格式

複選框的name設置比較特殊,爲了方便使用PHP獲取複選框的值

 

[html] view plain copy
 
 
print?
  1. <input type="checkbox" id="loveFruits-apple" name="loveFruits[]" value="apple" />  
  2. <label for="loveFruits-apple">蘋果</label>  
<input type="checkbox" id="loveFruits-apple" name="loveFruits[]" value="apple" />
<label for="loveFruits-apple">蘋果</label>

<input type="checkbox" id="loveFruits-pear" name="loveFruits[]" value="pear" />

<label for="loveFruits-pear">梨</label>

 

二. 獲取表單變量值

提交表單以後,若是須要獲取checkbox的值,務必先用isset檢測,這和別的表單元素不同

假如用戶沒有勾選checkbox中的任一項,那麼若是不檢測而直接訪問$_POST['loveFruits']則PHP報錯

      Notice: Undefined index loveFruits

[php] view plain copy
 
 
print?
  1. <?php  
  2.    if(isset($_POST['loveFruits'))  
  3.    {  
  4.         $aLoveFruits = $_POST['loveFruits'];  
  5.         for($i=0,$iLen=count($aLoveFruits); $i<$iLen;$i++)  
  6.         {  
  7.             echo $aLoveFruits[$i];  
  8.         }  
  9.    }  
  10. }  
  11. ?>  
<?php
   if(isset($_POST['loveFruits'))
   {
        $aLoveFruits = $_POST['loveFruits'];
        for($i=0,$iLen=count($aLoveFruits); $i<$iLen;$i++)
        {
            echo $aLoveFruits[$i];
        }
   }
}
?>



編碼

一. PHP的header()函數與HTML<meta>標籤

HTTP響應格式

HTTP 響應包含四部分,一是Status Line,二是Header部分,三是Body部分,其中,二三部分由空行隔開。

Body部分是完整的文檔,例如:

<!DOCTYPE html PUBLIC ...>

<html xmlns=""    xml:lang="en">

<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" ></head>

<body>for test</body>

</html>

Status Line指出協議版本、響應編碼和狀態,例如:

HTTP/1.1    200    ok

Header部分提供關於緩存、編碼、服務器信息等各類信息,例如:

Cache-Control:public

Content-Type:text/html;charset=gb2312

Expires:

Last-Modified:

 

注意到Header部分和Body部分均可能存在Content-Type,其中指定的編碼指出該使用什麼樣的解碼方式來解讀發送給瀏覽器的文檔。不過,瀏覽器會優先採用Header部分指定的Content-Type。

設置HTTP響應的Header部分的Content-Type,有多種方式。按優先級由高到低,一是在PHP文檔(例如index.php)中使用header()函數;二是在php配置文件中指定default_mimetype和default_charset;三是在APACHE的配置文件httpd.conf中使用指令AddDefaultCharset 。這幾種方式都會致使經過<meta>標籤指定的字符編碼被忽略,header()指出的編碼優先級比httpd.conf中配置的編碼高。儘可能不要使用AddDefaultCharset,不然<meta>標籤指定編碼的方法就失效了;對於PHP程序,使用header()函數指出編碼是好習慣,有比較好的移植性。

 

二. 文件自己的編碼

老工程師傾向於統一字符編碼爲UTF-8,即,文件的編碼爲UTF-8,發送給瀏覽器的文件中,指明編碼爲UTF-8(經過<meta>或php的header()函數等),而後就省卻各類轉換。(經過<meta>和<header>等)

尤爲是,AJAX默認接收的是UTF-8字符,若是在文件中給AJAX傳遞GB2312的參數,那就悲劇了,亂碼沒法避免。

爲了使得在UBUNTU下建立的文件默認都是UTF-8編碼的,我設置了LC_CTYPE="zh_CN.UTF-8"

方法是在 /etc/environment文件裏添加 LC_CTYPE="zh_CN.UTF-8"。zh表示中文(拼音"zhongwen"),CN表示中國大陸(英語CHINA)。關於字符集,先說說UNICODE,UNICODE這個字符集使用四字節表示一個符號,但存儲效率低;UTF-8和UNICODE相似,針對一些符號,使用比較少的字節進行編碼。

設置以後,則若touch null.php;使用vi null.php並輸入冒號及 set fileencoding能夠查看文件的編碼,比較奇怪的是,使用file --mime-encoding查看一個文件的字符集是無效的。在個人系統中,使用file命令查看一個含有中文字符的文件的字符集,結果將是iso-8859-1(此字符集不支持中文);而vi下使用set fileencoding能正確地顯示UTF-8。

爲了將以往的非UTF-8文件進行轉碼爲UTF-8,我使用ICONV

對於使用其它編碼的文件,可使用iconv來轉化成UTF-8格式。格式是,iconv -f 'gb2312' -t 'utf-8' file -o newfile 。

使secureCRT 和 putty 程序用UTF-8解析文件

secureCRT: 會話選項-->外觀-->字符編碼-->UTF-8

putty : 點左上角圖標出現下拉列表--->點change settings-->點translation-->修改編碼爲UTF-8

使用SCREEN程序,在secureCRT 和putty下沒法顯示UTF-8的問題,修改.screenrc文件

去掉一下三行的註釋

defutf8 on
defencoding utf-8
encoding utf-8 utf-8

可是,若是某個screen使用過程當中斷網,以後使用 -r 選項恢復這個screen,那麼,此時,依舊沒法顯示UTF-8編碼。目前尚未研究解決方法。

 

SESSION 與 COOKIE

一. 各自的特色

1. COOKIE 在瀏覽器端和服務器端都能獲取到;SESSION只能在服務器端訪問。

 

二. 實踐

1. JAVASCRIPT 子COOKIE

《javascript高級程序設計》提到了「子COOKIE」的概念,大體的意思是爲了在一條COOKIE中儘量多保存信息。使用如下形式設置COOKIE:

    name=name1=value1&name2=value2&name3=value3

在JAVASCRIPT中設置子COOKIE的技巧是,對該字符串中的name和value進行URL編碼,而對等號(=)和與號(&)不編碼。獲取子cookie的技巧是,先用&後用=進行字符串分割,而後再解碼。這樣即便name1等或者value1等中包含等號(=)或與號(&)都能不失真地設置和獲取子COOKIE。

 

 

2.  PHP 子COOKIE

 

筆者在實踐過程當中,也曾想用PHP實現這種不失真的子COOKIE。不過在有限的時間內沒有找到好的辦法,因爲使用PHP的setcookie函數設置COOKIE值會自動進行URL編碼,因此這明顯不符合個人需求。因而採用setrawcookie() 函數。而且,默認name1/value1之類的不包含等號(=)和與號(&)。

我用PHP封裝的子COOKIE以下,在我最近作的小網站中派上用場了,挺方便。

[php] view plain copy
 
 
print?
  1. class CookieUtil  
  2. {  
  3.     //name value expire path domain secure httponly  
  4.     //把名值對都存入數組中,做爲參數傳入  
  5.      public static function setSubCookie($sName,$aPairs,$iExpire=0,$sPath='/',$sDomain="",$bSecure=false,$bHttpOnly=false)  
  6.     {  
  7.         $sCookieText = "";  
  8.         $bFirst = true;  
  9.         if($aPairs)  
  10.         {  
  11.             //遍歷數組進行編碼,等號和&符號不編碼  
  12.             foreach($aPairs as $key=>$value)  
  13.             {  
  14. //              echo $key.$value;  
  15.                 if(strlen($key) > 0)  
  16.                 {  
  17.                     if(!$bFirst)  
  18.                     {  
  19.                         $sCookieText .= "&";  
  20.                     }  
  21.                     $sCookieText .= urlencode($key)."=".urlencode($value);  
  22.   
  23.                     $bFirst = false;  
  24.                 }  
  25.             }  
  26. //          echo $sCookieText;  
  27.         }  
  28.         return setrawcookie(urlencode($sName),$sCookieText,$iExpire,$sPath,$sDomain,$bSecure,$bHttpOnly);  
  29.     }  
  30.     public static function getSubCookie($sName)  
  31.     {  
  32.         $aPairs = array();  
  33.         if(isset($_COOKIE[urlencode($sName)]))  
  34.         {  
  35.             $sCookieText = $_COOKIE[urlencode($sName)];  
  36.             $aKeyVals = explode('&',$sCookieText);  
  37.   
  38.             foreach($aKeyVals as $value)  
  39.             {  
  40.                 $aKeyAndVal = explode('=',$value);  
  41. //              var_dump($aKeyAndVal);  
  42.                 $aPairs[$aKeyAndVal[0]] = $aKeyAndVal[1];  
  43.             }  
  44.         }  
  45. //      var_dump($aPairs);  
  46.         return $aPairs;  
  47.     }  
  48. }  
  49.   
  50.  千言萬語匯成一句話,不解釋~  
class CookieUtil
{
    //name value expire path domain secure httponly
    //把名值對都存入數組中,做爲參數傳入
     public static function setSubCookie($sName,$aPairs,$iExpire=0,$sPath='/',$sDomain="",$bSecure=false,$bHttpOnly=false)
    {
        $sCookieText = "";
        $bFirst = true;
        if($aPairs)
        {
            //遍歷數組進行編碼,等號和&符號不編碼
            foreach($aPairs as $key=>$value)
            {
//              echo $key.$value;
                if(strlen($key) > 0)
                {
                    if(!$bFirst)
                    {
                        $sCookieText .= "&";
                    }
                    $sCookieText .= urlencode($key)."=".urlencode($value);

                    $bFirst = false;
                }
            }
//          echo $sCookieText;
        }
        return setrawcookie(urlencode($sName),$sCookieText,$iExpire,$sPath,$sDomain,$bSecure,$bHttpOnly);
    }
    public static function getSubCookie($sName)
    {
        $aPairs = array();
        if(isset($_COOKIE[urlencode($sName)]))
        {
            $sCookieText = $_COOKIE[urlencode($sName)];
            $aKeyVals = explode('&',$sCookieText);

            foreach($aKeyVals as $value)
            {
                $aKeyAndVal = explode('=',$value);
//              var_dump($aKeyAndVal);
                $aPairs[$aKeyAndVal[0]] = $aKeyAndVal[1];
            }
        }
//      var_dump($aPairs);
        return $aPairs;
    }
}

 千言萬語匯成一句話,不解釋~

使用方法大體是:

[php] view plain copy
 
 
print?
  1. <?php  
  2.     //設置  
  3.     $aInput['uname']="智譯哥";  
  4.     $aInput['umail']="xxxx@qq.com";  
  5.     CookieUtil::setSubCookie('user',$aInput,time()+3600*24*30,"/",$yourSite,false,false);  
  6. ?>  
<?php
    //設置
    $aInput['uname']="智譯哥";
    $aInput['umail']="xxxx@qq.com";
    CookieUtil::setSubCookie('user',$aInput,time()+3600*24*30,"/",$yourSite,false,false);
?>

 

[php] view plain copy
 
 
print?
  1. <?php  
  2.    //獲取  
  3.    $aOutput = CookieUtil::getSubCookie('user');  
  4.    echo $aOutput['uname'];  
  5.    echo $aOutput['umail'];  
  6. ?>  
<?php
   //獲取
   $aOutput = CookieUtil::getSubCookie('user');
   echo $aOutput['uname'];
   echo $aOutput['umail'];
?>

 

3. 意外

苦於差勁的網絡情況,不得不使用XAMPP來本地建站調試,期間使用我心愛的CookieUtil::setSubCookie時,發如今FF和Chrome下沒法設置COOKIE,其它如FF和OPERA沒問題。在諸多調試以後,KB的我才意識到也許是LOCALHOST的問題,我調用setSubCookie時傳入的域名參數是localhost,這不是一個有效的域名,IE和OPERA都不支持,放到線上就OK了。

這個折騰讓時間已很少的我心痛不已。

 

HTML/CSS

 

一. IE6 BUG

1. IE6 重複字符BUG

在《精通CSS 高級WEB標準解決方案》第二版第9章,做者提到了這個BUG,此BUG能夠描述爲,當多個浮動元素之間包含註釋時,最後一個浮動元素的內容的最後幾個字符可能會重複出現。今天(20120416)我也遇到這個問題了,很慶幸書上講到過這個BUG。不過,我遇到的這個具體的重複字符BUG不是由註釋引發,而是由設置爲display:none;的元素引發。

注意到兩個input之間夾着一個label。我把 label 設置爲 display:block;float:left; 把 input 設置爲 display:none; 因而在IE6下發生了字符重複("名登錄")。

<label for="way-umail">郵箱登錄</label>

<input id="way-umail" name="way" class="umail" type="radio" checked="checked" />

<label for="way-uname" class="label-uname">用戶名登錄</label>

<input id="way-uname" name="way" class="uname" type="radio" />

 

最後,我把夾在兩個Input之間的label取出放到別處,問題解決。

 

2. 浮動元素的父元素影響浮動效果

一個常見的問題是,若是子元素絕對定位,父元素須要指定爲相對定位,不然容易出問題;今天(20120416)我碰到個問題,子元素浮動,在其它瀏覽器下效果良好,但到了IE6下會莫名其妙地多出來空間,並且通過IE DEVELOPER TOOLS 檢查多出來的空間不屬於任何元素。我沒能提取出最少的代碼展示這個問題,此處記下,之後出問題時嘗試設置父元素高度便可,不繼續追究了。通過設置父元素高度,解決了問題。
IE6 下效果:

其它瀏覽器效果:

 

3. checkbox的小正方形周圍多出來空白區域

注意到下圖checkbox小正方形,旁邊多出來一些空白區域。這些空白區域很像設置了padding,可是經過IE developer tools查看,並無padding。
其它瀏覽器效果:

解決方法是把 小方框的寬度設置爲14px,多了不行少了也不行。

 

 

JAVASCRIPT

一. 操做DOM

1. 對DOM元素的類型進行增、刪、查操做

因爲仍是初學階段,不很喜歡用JQUERY,因此仍是把這幾個簡單的功能本身實現一下。其中,使用className能夠得到跨瀏覽器兼容性。注意到在className中搜索某個類名時,須要保證匹配的字符串先後的字符不能是除了空格以外的字符。例如要匹配的類名是"a-b",那麼,假如className等於" a-b-c 0-a-b",那麼就會失配。

這段代碼處理能力有限,當sClass包含括號、中括號、花括號等正則式元字符時,可能會出問題,不過,沒幾我的會用這些符號作類名吧,因此不考慮。

代碼以下:

[javascript] view plain copy
 
 
print?
  1. ClassManager = {  
  2.     isClass:function(oElement,sClass)  
  3.     {  
  4.         var oRe = new RegExp("(^| +)"+sClass+"( +|$)","");  
  5.         if(oRe.test(oElement.className)){  
  6.             return true;  
  7.         }else{  
  8.             return false;  
  9.         }  
  10.     },  
  11.     addClass:function(oElement,sClass)  
  12.     {  
  13.         if(!this.isClass(oElement,sClass)){  
  14.             oElement.className += " "+sClass;  
  15.         }  
  16.         //alert("after add" + oElement.className);  
  17.      },  
  18.     delClass:function(oElement,sClass)  
  19.     {  
  20.         var oRe = new RegExp("(^| +)"+sClass+"( +|$)","");  
  21.         if(this.isClass(oElement,sClass)){  
  22.             oElement.className = oElement.className.replace(oRe," ");  
  23.         }  
  24.         //alert("after del" + oElement.className);  
  25.     }  
  26. };  
ClassManager = {
    isClass:function(oElement,sClass)
    {
        var oRe = new RegExp("(^| +)"+sClass+"( +|$)","");
        if(oRe.test(oElement.className)){
            return true;
        }else{
            return false;
        }
    },
    addClass:function(oElement,sClass)
    {
        if(!this.isClass(oElement,sClass)){
            oElement.className += " "+sClass;
        }
        //alert("after add" + oElement.className);
     },
    delClass:function(oElement,sClass)
    {
        var oRe = new RegExp("(^| +)"+sClass+"( +|$)","");
        if(this.isClass(oElement,sClass)){
            oElement.className = oElement.className.replace(oRe," ");
        }
        //alert("after del" + oElement.className);
    }
};



二. 事件

1. 瀏覽器兼容性

1)IE 只支持事件冒泡流,事件從源元素開始向元素的父元素傳播,直至HTML元素,最後是document節點;FF等還支持事件捕獲流,與冒泡流傳播順序相反。
2)DOM事件流包括三個階段,事件捕獲階段、處於目標階段、事件冒泡階段。根據《javascipt高級程序設計》的講解,個人理解是,從當事件傳播到源元素的瞬間,到事件處理程序開始執行的瞬間,這個階段是處於目標階段。而整個事件處理程序執行的過程歸屬於事件冒泡階段。
3)IE不支持DOM事件流,其它OK。
4)onblur 和 onfocus不支持事件冒泡
 
轉自:https://blog.csdn.net/yaozhiyi/article/details/7437925
相關文章
相關標籤/搜索