【PHP ThinkPHP框架】小bug汇总[更新]
目錄結(jié)構(gòu)
1.函數(shù)調(diào)用
2.綁定select下拉框數(shù)據(jù)
3.PHP查詢功能
4.格式化時(shí)間和價(jià)錢
5.IF標(biāo)簽比較兩個(gè)變量
6.eq標(biāo)簽比較兩個(gè)變量
7.新增信息或者修改信息的自動(dòng)驗(yàn)證和自動(dòng)填充
8.驗(yàn)證碼
9.NotFound
10.字符串處理函數(shù)
11.單引號(hào)和雙引號(hào)
?
最近開始接觸PHP編程語(yǔ)言,遇到各種小問題,不斷總結(jié),不斷進(jìn)步。由于一開始就用上了ThinkPHP框架,所以不知道和一般的PHP項(xiàng)目有什么區(qū)別。有待研究。
1.函數(shù)調(diào)用
可能是因?yàn)槲冶容^菜鳥,剛開始學(xué)習(xí)編寫PHP頁(yè)面,還沒有寫控制器,在頁(yè)面中調(diào)試的時(shí)候調(diào)用了dump()函數(shù),我是這么寫的:$dump($pageCount);結(jié)果報(bào)錯(cuò)了,錯(cuò)誤是:php function name must be a string.
大神們別噴,實(shí)在是太菜了有木有。然后我改成了dump($pageCount);,錯(cuò)誤解決了,原來是調(diào)用函數(shù)的時(shí)候不加'$'符號(hào),看來不能盲目使用編程語(yǔ)言的特殊符號(hào)啊。
2.綁定select下拉框的數(shù)據(jù)
之前想了好久該怎么綁定,想著應(yīng)該和C#差不多,可就是找不到好的辦法,都差點(diǎn)用js寫了,后來發(fā)現(xiàn)了更加簡(jiǎn)便的方法。
代碼是這樣的:
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標(biāo)簽中的selectitems是控制器中從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)列表,在控制器中賦值給selectitems,然后直接循環(huán)綁定到option,很簡(jiǎn)單有木有。
3.PHP查詢功能
終于能成功查詢了,費(fèi)了不少勁兒。發(fā)現(xiàn)其實(shí)比較簡(jiǎn)單,只是剛開始接觸,不懂很多語(yǔ)法規(guī)則之類的,光寫一個(gè)sql語(yǔ)句解析都寫了半天。具體功能很簡(jiǎn)單,就是在首頁(yè)做一個(gè)查詢功能,一個(gè)下拉列表選擇模塊,一個(gè)文本框輸入關(guān)鍵字,一個(gè)按鈕進(jìn)行查詢:
<form id="form1" method="POST" action="{:U('Search/index')}" name="form1"><span class="sbfont">搜索欄目:</span><select name="select1" id="select1" οnchange=setSelectedID()><option value="-1">=請(qǐng)選擇=</option><volist name="selectitems" id="row"><option value="{$row.id}">{$row.title}</option></volist></select><span>關(guān)鍵字:</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> View Code這塊就不用再詳細(xì)分析了,上面都說了,接下來就是寫一個(gè)控制器,控制器中的代碼如下:
public function index(){$searchs=$_POST['search'];//接收post傳來的參數(shù)$selectedID=$_POST['selectedID'];//同傳參數(shù)$condition['category_id']=array('eq',$selectedID);//定義查詢規(guī)則$condition['title']=array('like','%'.$searchs.'%');$resultList=$this->dao->where($condition)->select();//查詢數(shù)據(jù)集$this->assign('searchResultList',$resultList);//賦值$this->display();}控制器查詢出數(shù)據(jù)并且已經(jīng)保存好了,接下來就是視圖顯示了,視圖只需要將保存好的查詢結(jié)果數(shù)據(jù)集顯示出來就好了:
<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>好了,糾結(jié)了一整天的查詢功能就分分鐘做好了。
4.格式化時(shí)間和價(jià)錢
????? 價(jià)錢格式化:{$p.sale|number_format=###, 2, '.', ''} 兩位有效數(shù)字
????? 時(shí)間格式化:{$p.time|date='Y-m-d H:i:s',###} 年月日時(shí)分秒
5.IF標(biāo)簽比較兩個(gè)變量
?
<if condition="$row.name eq $col['name']">==需要的操作== </if>?
6.eq標(biāo)簽比較兩個(gè)變量
<eq name=”item.group_id” value=”$one.group_id”> 這里注意name不帶$,value帶$.?
7.新增信息或者修改信息的自動(dòng)驗(yàn)證和自動(dòng)填充
?自動(dòng)驗(yàn)證部分是框架自帶的驗(yàn)證,需要在項(xiàng)目的lib目錄下Model文件夾里創(chuàng)建一個(gè)和需要驗(yàn)證的數(shù)據(jù)所在數(shù)據(jù)表同名的類文件,說簡(jiǎn)單了就是這個(gè)類的名字需要和我們添加或者修改數(shù)據(jù)的表的名字一致,比如,表的名字是think_user,類的名字就是UserModel.class.php。這里需要說一句題外話,如果表的名字和Model類名字不一致,需要在類里面聲明表名:
protected $tableName = 'think_user'; //這里的think_user就是數(shù)據(jù)表的名稱這個(gè)類里面寫驗(yàn)證信息,當(dāng)Action類當(dāng)中調(diào)用了create()方法的時(shí)候就會(huì)進(jìn)行自動(dòng)驗(yàn)證了,具體驗(yàn)證的寫法如下:
<?php class UserModel extends Model {//自動(dòng)驗(yàn)證protected $_validate = array(array('username','require','請(qǐng)輸入用戶名'), //用戶名必須輸入array('username', '', '用戶已存在', 0,'unique',1), //用戶名唯一性驗(yàn)證array('password', 'require', '登錄密碼必填', 1), //密碼必須array('PID','^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$','請(qǐng)?zhí)钊胝_的身份證號(hào)',1), //身份證號(hào)驗(yàn)證array('address','require','地址必須填',1), //地址必須array('cellphone','number','手機(jī)號(hào)為11位數(shù)字',1), //手機(jī)號(hào)array('email','email','Email格式不符合',1), //Email格式array('telephone','\d{3}-\d{8}|\d{4}-\{7,8}','電話格式不正確',1), //國(guó)內(nèi)電話號(hào)array('repassword','password','確認(rèn)密碼不正確',0,'confirm'), //確認(rèn)密碼是否正確 );
//自動(dòng)填充
protected $_auto=array(
??????? array('create_time','time','doRegist','function'),? //在增加時(shí)自動(dòng)將時(shí)間擢填入表中
??? ); } ?>
這里有一點(diǎn)需要注意,官方文檔中有這么一句話:如果定義了字段映射的話,這里的驗(yàn)證字段名稱應(yīng)該是實(shí)際的數(shù)據(jù)表字段而不是表單字段。
Action中要這樣寫:
$user=D('User'); //實(shí)例化Model類$daoCreate=$user->create(); //創(chuàng)建新增數(shù)據(jù)的model 驗(yàn)證在這時(shí)候就起作用了if($daoCreate){$daoAdd = $user->add();if(false != $daoAdd){.... //成功}else{.... //失敗}}else{exit($user->getError()); //輸出驗(yàn)證結(jié)果}View當(dāng)中就寫需要添加的數(shù)據(jù)就行了,這樣:
<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>確認(rèn)密碼:</label></td><td><input type="password" name="repassword" id="repassword"/></td></tr><tr><td><label>身份證號(hào):</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>手機(jī)號(hào):</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="注冊(cè)"/></td></tr></table></form>?8.驗(yàn)證碼
我現(xiàn)在用的是3.1.3版本的TP,框架不是完整版,所以我又從完整版里面拷貝了一個(gè)Extend文件夾替換了現(xiàn)在這個(gè),因?yàn)樗袛U(kuò)展包都在完整版里面有。
要實(shí)現(xiàn)驗(yàn)證碼功能,只需要在控制器內(nèi)添加一個(gè)生成驗(yàn)證碼的方法即可:
public function verify() {import('ORG.Util.Image');ob_end_clean(); //很關(guān)鍵,如果Image.class.php文件里的output方法中沒有調(diào)用ob_clean();方法,那么這里需要寫,可以防止出現(xiàn)“載入指定URL失敗”的錯(cuò)誤Image::buildImageVerify();}import 方法是 ThinkPHP 內(nèi)置的類庫(kù)和文件導(dǎo)入方法,上例導(dǎo)入的文件為 ThinkPHP 系統(tǒng)目錄下 Lib/ORG/Util/Image.class.php 文件。所以要保證這個(gè)目錄下的文件存在,如果沒有這個(gè)目錄,創(chuàng)建一個(gè),并且將完整版里面的Image.class.php文件拷貝到該目錄下就可以使用了。
視圖文件中只需要調(diào)用方法就能正常顯示驗(yàn)證碼了:
<img src="{:U('Public/verify')}" align="absmiddle" title="如果您無法識(shí)別驗(yàn)證碼,請(qǐng)點(diǎn)圖片更換" id="verifyImage" onclick=resetVerifyCode() /> <input type="text" name="verifyCode" id="verifyCode" size="8" maxlength="4" />同時(shí)要寫一個(gè)js腳本來實(shí)現(xiàn)點(diǎn)擊圖片刷新驗(yàn)證碼的功能:
<script type="text/javascript" >function resetVerifyCode(){$("#verifyImage").attr('src', "{:U('Public/verify/',0,0,0)}/__"+ Math.random());} </script>這里注意一個(gè)細(xì)節(jié):路徑里面在“{:U('Public/verify/',0,0,0)}/__”里,verify后面必須有一個(gè)“/”,或者寫在"__"前面,這樣"/__",而我這里為什么兩個(gè)地方都寫了呢,因?yàn)檫@里只在verify后面添加"/"出現(xiàn)一個(gè)問題,就是F5刷新界面的時(shí)候可以顯示驗(yàn)證碼無誤,可是點(diǎn)擊的時(shí)候刷新不出驗(yàn)證碼,使用了頁(yè)面調(diào)試發(fā)現(xiàn)錯(cuò)誤是“加載指定URL失敗”,問題就出在解析后的驗(yàn)證碼路徑中verify后面沒有“/”,于是我就在“__”前面添加,這樣問題就解決了。
?9.ThinkPHP "NotFound"錯(cuò)誤
剛部署PHP項(xiàng)目的時(shí)候不太了解URL生成和重寫之類的知識(shí),總是會(huì)出現(xiàn)如下錯(cuò)誤:
Not Found
The requested URL /Public/login was not found on this server.
后來發(fā)現(xiàn)是URL_MODEL設(shè)置問題,一般設(shè)置成1就不會(huì)有問題,設(shè)置為其他會(huì)出現(xiàn)問題,這個(gè)不知道是為什么,有待解決,先記錄在這。
?
10.字符串處理的一些常用函數(shù)
<1>.trim():將字符串末尾的逗號(hào)去掉
??? trim($string,',');
<2>.strstr():返回字符串中,逗號(hào)出現(xiàn)的位移量,如果沒有出現(xiàn)逗號(hào)則返回false
??? $index=strstr($string,',');
<3>.explode():將字符串用‘-’分開返回一個(gè)數(shù)組,類似于split()
??? explode("-",$string);
<4>.array_intersect($array1,$array2):返回兩個(gè)數(shù)組中相同的部分,求交集
??? $sameitems=array_intersect($array1,$array2);
<5>.array_diff():返回兩個(gè)數(shù)組的差集
??? $different=array_diff($array1,$array2);
<6>.str_replace('a','b',$str):將字符串$str中的a換成b
??? $str=str_replace('a','b',$str);
11.單引號(hào)和雙引號(hào)
在PHP中,單引號(hào)和雙引號(hào)的處理是不相同的,雙引號(hào)中的內(nèi)容可以被解釋和替換,而單引號(hào)中的內(nèi)容總被認(rèn)為是普通字符。
比如:
$str = 7;
echo "str is $str"; // 打印結(jié)果: str is 7
echo 'str is $str'; // 打印結(jié)果: str is $str
echo "str is $str\n"; // 打印結(jié)果: str is 7 (同時(shí)換行)
echo 'str is $str\n'; // 打印結(jié)果: str is $str\n
所以在某些函數(shù),比如str_replace()中需要使用雙引號(hào),這樣才能正確替換字符串。
轉(zhuǎn)載于:https://www.cnblogs.com/theblueberry/p/3635114.html
總結(jié)
以上是生活随笔為你收集整理的【PHP ThinkPHP框架】小bug汇总[更新]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让FPGA中的SPI与其他模块互动起
- 下一篇: U盘无法拷贝超过4G的大文件