【PHP ThinkPHP框架】小bug彙總[更新]

目錄結構javascript

1.函數調用php

2.綁定select下拉框數據java

3.PHP查詢功能sql

4.格式化時間和價錢數據庫

5.IF標籤比較兩個變量編程

6.eq標籤比較兩個變量數組

7.新增信息或者修改信息的自動驗證和自動填充框架

8.驗證碼dom

9.NotFound編程語言

10.字符串處理函數

11.單引號和雙引號

 

最近開始接觸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>
View Code

這塊就不用再詳細分析了,上面都說了,接下來就是寫一個控制器,控制器中的代碼以下:

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()中須要使用雙引號,這樣才能正確替換字符串。

相關文章
相關標籤/搜索