目錄結構
最近開始接觸PHP編程語言,遇到各種小問題,不斷總結,不斷進步。由於一開始就用上了ThinkPHP框架,所以不知道和一般的PHP項目有什么區別。有待研究。
1.函數調用
可能是因為我比較菜鳥,剛開始學習編寫PHP頁面,還沒有寫控制器,在頁面中調試的時候調用了dump()函數,我是這么寫的:$dump($pageCount);結果報錯了,錯誤是:php function name must be a string.
大神們別噴,實在是太菜了有木有。然后我改成了dump($pageCount);,錯誤解決了,原來是調用函數的時候不加'$'符號,看來不能盲目使用編程語言的特殊符號啊。
2.綁定select下拉框的數據
之前想了好久該怎么綁定,想着應該和C#差不多,可就是找不到好的辦法,都差點用js寫了,后來發現了更加簡便的方法。
代碼是這樣的:
1 <select name="select1" id="select1"> 2 <volist name="selectitems" id="row"> 3 <option value="{$row.id}">{$row.title}</option> 4 </volist> 5 </select>
其中volist標簽中的selectitems是控制器中從數據庫取出的數據列表,在控制器中賦值給selectitems,然后直接循環綁定到option,很簡單有木有。
3.PHP查詢功能
終於能成功查詢了,費了不少勁兒。發現其實比較簡單,只是剛開始接觸,不懂很多語法規則之類的,光寫一個sql語句解析都寫了半天。具體功能很簡單,就是在首頁做一個查詢功能,一個下拉列表選擇模塊,一個文本框輸入關鍵字,一個按鈕進行查詢:

<form id="form1" method="POST" action="{:U('Search/index')}" name="form1"> <span class="sbfont">搜索欄目:</span> <select name="select1" id="select1" onchange=setSelectedID()> <option value="-1">=請選擇=</option> <volist name="selectitems" id="row"> <option value="{$row.id}">{$row.title}</option> </volist> </select> <span>關鍵字:</span><input name="search" type="text" size="30"/> <input name="submit" type="submit" value=""/> <input type="hidden" id="selectedID" name="selectedID"/> </form> <script type="text/javascript"> function setSelectedID(){ var selector=document.getElementById("select1"); var selectedID=document.getElementById("selectedID"); for(var i=0;i<selector.options.length;i++) { if(selector.options[i].selected) { selectedID.value=selector.options[i].value; break; } } } </script>
這塊就不用再詳細分析了,上面都說了,接下來就是寫一個控制器,控制器中的代碼如下:
public function index() { $searchs=$_POST['search'];//接收post傳來的參數 $selectedID=$_POST['selectedID'];//同傳參數 $condition['category_id']=array('eq',$selectedID);//定義查詢規則 $condition['title']=array('like','%'.$searchs.'%'); $resultList=$this->dao->where($condition)->select();//查詢數據集 $this->assign('searchResultList',$resultList);//賦值 $this->display(); }
控制器查詢出數據並且已經保存好了,接下來就是視圖顯示了,視圖只需要將保存好的查詢結果數據集顯示出來就好了:
<volist name="searchResultList" id="row"> <li> <span>{$row.create_time|date="Y-m-d",###}</span> <a href="{$row.link_url}" target="_blank">{$row.title}</a> </li> </volist>
好了,糾結了一整天的查詢功能就分分鍾做好了。
4.格式化時間和價錢
價錢格式化:{$p.sale|number_format=###, 2, '.', ''} 兩位有效數字
時間格式化:{$p.time|date='Y-m-d H:i:s',###} 年月日時分秒
5.IF標簽比較兩個變量
<if condition="$row.name eq $col['name']"> ==需要的操作== </if>
6.eq標簽比較兩個變量
<eq name=”item.group_id” value=”$one.group_id”> 這里注意name不帶$,value帶$.
7.新增信息或者修改信息的自動驗證和自動填充
自動驗證部分是框架自帶的驗證,需要在項目的lib目錄下Model文件夾里創建一個和需要驗證的數據所在數據表同名的類文件,說簡單了就是這個類的名字需要和我們添加或者修改數據的表的名字一致,比如,表的名字是think_user,類的名字就是UserModel.class.php。這里需要說一句題外話,如果表的名字和Model類名字不一致,需要在類里面聲明表名:
protected $tableName = 'think_user'; //這里的think_user就是數據表的名稱
這個類里面寫驗證信息,當Action類當中調用了create()方法的時候就會進行自動驗證了,具體驗證的寫法如下:
<?php class UserModel extends Model {
//自動驗證 protected $_validate = array( array('username','require','請輸入用戶名'), //用戶名必須輸入 array('username', '', '用戶已存在', 0,'unique',1), //用戶名唯一性驗證 array('password', 'require', '登錄密碼必填', 1), //密碼必須 array('PID','^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$','請填入正確的身份證號',1), //身份證號驗證 array('address','require','地址必須填',1), //地址必須 array('cellphone','number','手機號為11位數字',1), //手機號 array('email','email','Email格式不符合',1), //Email格式 array('telephone','\d{3}-\d{8}|\d{4}-\{7,8}','電話格式不正確',1), //國內電話號 array('repassword','password','確認密碼不正確',0,'confirm'), //確認密碼是否正確 );
//自動填充
protected $_auto=array(
array('create_time','time','doRegist','function'), //在增加時自動將時間擢填入表中
); } ?>
這里有一點需要注意,官方文檔中有這么一句話:如果定義了字段映射的話,這里的驗證字段名稱應該是實際的數據表字段而不是表單字段。
Action中要這樣寫:
$user=D('User'); //實例化Model類 $daoCreate=$user->create(); //創建新增數據的model 驗證在這時候就起作用了 if($daoCreate) { $daoAdd = $user->add(); if(false != $daoAdd){ .... //成功 } else{ .... //失敗 } }else{ exit($user->getError()); //輸出驗證結果 }
View當中就寫需要添加的數據就行了,這樣:
<form method="post" action="{:U('Public/doRegist')}"> <table> <tr> <td><label>用戶名:</label></td> <td><input type="text" name="username" id="username"/></td> </tr> <tr> <td><label>密 碼:</label></td> <td><input type="password" name="password" id="password"/></td> </tr> <tr> <td><label>確認密碼:</label></td> <td><input type="password" name="repassword" id="repassword"/></td> </tr> <tr> <td><label>身份證號:</label></td> <td><input type="text" name="PID" id="PID" maxlength="18"/></td> </tr> <tr> <td><label>地址:</label></td> <td><input type="text" name="address" id="address"/></td> </tr> <tr> <td><label>手機號:</label></td> <td><input type="text" name="cellphone" id="cellphone" maxlength="11"/></td> </tr> <tr> <td><label>Email:</label></td> <td><input type="text" name="email" id="email"/></td> </tr> <tr> <td><label>電話:</label></td> <td><input type="text" name="telephone" id="telephone"/></td> </tr> <tr> <td></td> <td> <input type="submit" id="submit" value="注冊"/> </td> </tr> </table> </form>
8.驗證碼
我現在用的是3.1.3版本的TP,框架不是完整版,所以我又從完整版里面拷貝了一個Extend文件夾替換了現在這個,因為所有擴展包都在完整版里面有。
要實現驗證碼功能,只需要在控制器內添加一個生成驗證碼的方法即可:
public function verify() { import('ORG.Util.Image'); ob_end_clean(); //很關鍵,如果Image.class.php文件里的output方法中沒有調用ob_clean();方法,那么這里需要寫,可以防止出現“載入指定URL失敗”的錯誤 Image::buildImageVerify(); }
import 方法是 ThinkPHP 內置的類庫和文件導入方法,上例導入的文件為 ThinkPHP 系統目錄下 Lib/ORG/Util/Image.class.php 文件。所以要保證這個目錄下的文件存在,如果沒有這個目錄,創建一個,並且將完整版里面的Image.class.php文件拷貝到該目錄下就可以使用了。
視圖文件中只需要調用方法就能正常顯示驗證碼了:
<img src="{:U('Public/verify')}" align="absmiddle" title="如果您無法識別驗證碼,請點圖片更換" id="verifyImage" onclick=resetVerifyCode() /> <input type="text" name="verifyCode" id="verifyCode" size="8" maxlength="4" />
同時要寫一個js腳本來實現點擊圖片刷新驗證碼的功能:
<script type="text/javascript" > function resetVerifyCode(){ $("#verifyImage").attr('src', "{:U('Public/verify/',0,0,0)}/__"+ Math.random()); } </script>
這里注意一個細節:路徑里面在“{:U('Public/verify/',0,0,0)}/__”里,verify后面必須有一個“/”,或者寫在"__"前面,這樣"/__",而我這里為什么兩個地方都寫了呢,因為這里只在verify后面添加"/"出現一個問題,就是F5刷新界面的時候可以顯示驗證碼無誤,可是點擊的時候刷新不出驗證碼,使用了頁面調試發現錯誤是“加載指定URL失敗”,問題就出在解析后的驗證碼路徑中verify后面沒有“/”,於是我就在“__”前面添加,這樣問題就解決了。
9.ThinkPHP "NotFound"錯誤
剛部署PHP項目的時候不太了解URL生成和重寫之類的知識,總是會出現如下錯誤:
Not Found
The requested URL /Public/login was not found on this server.
后來發現是URL_MODEL設置問題,一般設置成1就不會有問題,設置為其他會出現問題,這個不知道是為什么,有待解決,先記錄在這。
10.字符串處理的一些常用函數
<1>.trim():將字符串末尾的逗號去掉
trim($string,',');
<2>.strstr():返回字符串中,逗號出現的位移量,如果沒有出現逗號則返回false
$index=strstr($string,',');
<3>.explode():將字符串用‘-’分開返回一個數組,類似於split()
explode("-",$string);
<4>.array_intersect($array1,$array2):返回兩個數組中相同的部分,求交集
$sameitems=array_intersect($array1,$array2);
<5>.array_diff():返回兩個數組的差集
$different=array_diff($array1,$array2);
<6>.str_replace('a','b',$str):將字符串$str中的a換成b
$str=str_replace('a','b',$str);
11.單引號和雙引號
在PHP中,單引號和雙引號的處理是不相同的,雙引號中的內容可以被解釋和替換,而單引號中的內容總被認為是普通字符。
比如:
$str = 7;
echo "str is $str"; // 打印結果: str is 7
echo 'str is $str'; // 打印結果: str is $str
echo "str is $str\n"; // 打印結果: str is 7 (同時換行)
echo 'str is $str\n'; // 打印結果: str is $str\n
所以在某些函數,比如str_replace()中需要使用雙引號,這樣才能正確替換字符串。