$mysqli = new mysqli($DBHOST,$DBUSER,$DBPASS,$DBNAME);javascript
if($mysqli->connect_error)//返回字符串則表示有錯誤,不然返回NULLphp
出錯代碼: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
複選框的name設置比較特殊,爲了方便使用PHP獲取複選框的值
<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 if(isset($_POST['loveFruits')) { $aLoveFruits = $_POST['loveFruits']; for($i=0,$iLen=count($aLoveFruits); $i<$iLen;$i++) { echo $aLoveFruits[$i]; } } } ?>
HTTP 響應包含四部分,一是Status Line,二是Header部分,三是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>
HTTP/1.1 200 ok
Cache-Control:public
Content-Type:text/html;charset=gb2312
Expires:
Last-Modified:
設置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的參數,那就悲劇了,亂碼沒法避免。
方法是在 /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。
使secureCRT 和 putty 程序用UTF-8解析文件
secureCRT: 會話選項-->外觀-->字符編碼-->UTF-8
putty : 點左上角圖標出現下拉列表--->點change settings-->點translation-->修改編碼爲UTF-8
去掉一下三行的註釋
defutf8 on
defencoding utf-8
encoding utf-8 utf-8
可是,若是某個screen使用過程當中斷網,以後使用 -r 選項恢復這個screen,那麼,此時,依舊沒法顯示UTF-8編碼。目前尚未研究解決方法。
1. COOKIE 在瀏覽器端和服務器端都能獲取到;SESSION只能在服務器端訪問。
《javascript高級程序設計》提到了「子COOKIE」的概念,大體的意思是爲了在一條COOKIE中儘量多保存信息。使用如下形式設置COOKIE:
name=name1=value1&name2=value2&name3=value3
在JAVASCRIPT中設置子COOKIE的技巧是,對該字符串中的name和value進行URL編碼,而對等號(=)和與號(&)不編碼。獲取子cookie的技巧是,先用&後用=進行字符串分割,而後再解碼。這樣即便name1等或者value1等中包含等號(=)或與號(&)都能不失真地設置和獲取子COOKIE。
筆者在實踐過程當中,也曾想用PHP實現這種不失真的子COOKIE。不過在有限的時間內沒有找到好的辦法,因爲使用PHP的setcookie函數設置COOKIE值會自動進行URL編碼,因此這明顯不符合個人需求。因而採用setrawcookie() 函數。而且,默認name1/value1之類的不包含等號(=)和與號(&)。
我用PHP封裝的子COOKIE以下,在我最近作的小網站中派上用場了,挺方便。
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 //設置 $aInput['uname']="智譯哥"; $aInput['umail']="xxxx@qq.com"; CookieUtil::setSubCookie('user',$aInput,time()+3600*24*30,"/",$yourSite,false,false); ?>
<?php //獲取 $aOutput = CookieUtil::getSubCookie('user'); echo $aOutput['uname']; echo $aOutput['umail']; ?>
苦於差勁的網絡情況,不得不使用XAMPP來本地建站調試,期間使用我心愛的CookieUtil::setSubCookie時,發如今FF和Chrome下沒法設置COOKIE,其它如FF和OPERA沒問題。在諸多調試以後,KB的我才意識到也許是LOCALHOST的問題,我調用setSubCookie時傳入的域名參數是localhost,這不是一個有效的域名,IE和OPERA都不支持,放到線上就OK了。
這個折騰讓時間已很少的我心痛不已。
在《精通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取出放到別處,問題解決。
其它瀏覽器效果:
解決方法是把 小方框的寬度設置爲14px,多了不行少了也不行。
因爲仍是初學階段,不很喜歡用JQUERY,因此仍是把這幾個簡單的功能本身實現一下。其中,使用className能夠得到跨瀏覽器兼容性。注意到在className中搜索某個類名時,須要保證匹配的字符串先後的字符不能是除了空格以外的字符。例如要匹配的類名是"a-b",那麼,假如className等於" a-b-c 0-a-b",那麼就會失配。
這段代碼處理能力有限,當sClass包含括號、中括號、花括號等正則式元字符時,可能會出問題,不過,沒幾我的會用這些符號作類名吧,因此不考慮。
代碼以下:
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); } };