<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # 活的系統 我們更愿意去打造有著良好用戶體驗的系統,雖然這樣會提升成本,但沒有比用戶滿意更重要的了。 顯然,每添加一個用戶,我們都需要修改源代碼是很不現實的。鑒于此,FORM這個東西就出現了,它能夠獲取到用戶的輸入,并且能夠將用戶的輸入提交到我們指定的URL中。對于我們來講,相當于用戶把一些數據直接提交到了我們的ACTION中,那么當然我們就可以在ACTION中,對用戶傳入的值進行靈活的操作了。 我們一直說增刪改查,但在上一節中,我們卻更多的用了insert, 而不是add。這顯然與SQL語句有關,因為在SQL語句中使用insert into xxx 來實現增加數,第二點呢,其實這還和FORM表單有關。 我們認為,用戶只有先添加數據到FORM表單中,然后才可能實現將數據添加到數據表中的目的。 所以,我們把用戶在表單中添加數據的動作,叫做add,而把數據增加到數據表中的動作,叫做insert。 即數據增加的過程實際上是:用戶訪問`add` -> `用戶輸入數據` -> `用戶將數據傳給insert` -> `系統將用戶數據存入系統`。 ## add action ~~~ public function add() { return 'hello add'; } ~~~ 測試結果如下圖所示: ![](https://box.kancloud.cn/2016-06-14_575f894a80b7d.png) ## 引入V層 基本上可以這樣說,如果你用到HTML,那么就會有V層的出現。 ~~~ public function add() { $htmls = $this->fetch(); return $htmls; } ~~~ 對應的add.html文件如下圖所示: ![](https://box.kancloud.cn/bc9b2ea42b4cb94a96217bc82b9724f2_468x188.png) 如果對V層文件的位置還不是很清楚的話,你需要現在回去再看一遍3.2.5小節的內容。 測試結果如下圖所示: ![](https://box.kancloud.cn/2016-06-14_575f894ab4457.png) ## 定制表單 add.html文件的代碼如下: ~~~ <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>新增數據</title> </head> <body class="container"> <div class="row"> <div class="col-md-12"> <form action="insert" method="post"> <label>姓名:</label> <input type="text" name="name" /> <label>用戶名:</label> <input type="text" name="username" /> <label>性別:</label> <select name="sex"> <option value="0">男</option> <option value="1">女</option> </select> <label>郵箱:</label> <input type="email" name="email" /> <button type="submit">保存</button> </form> </div> </div> </body> </html> ~~~ 此時,form表單的action指向了insert,即用戶將數據傳給了insert action。 下面我們將改寫insert的內容,以查看數據是否以正確的方式傳入并且insert已經正確接收了。 ~~~ public function insert() { var_dump($_POST); return ; // 提前返回 // 實例化Teacher空對象 $Teacher = new Teacher(); $Teacher->name = '王五'; $Teacher->username = 'wangwu'; $Teacher->sex = '1'; $Teacher->email = 'wangwu@yunzhi.club'; // 執行對象的插入數據操作 $Teacher->save(); // 反饋結果 return '新增成功。新增ID為:' . $Teacher->id; } ~~~ `return`表示:本函數執行到此結束。 測試結果如下: ![](https://box.kancloud.cn/3c24f49675bb450b60b6ae49e5cdc390_732x79.png) 點擊保存后,跳轉至insert 。 ![](https://box.kancloud.cn/1f665e51d0e85f983c2ad5b1d28e7ad2_593x174.png) ~~~ git checkout -f step3.3.2.1 ~~~ 執行上述命令后,上述示例代碼信息如下: C層: ![](https://box.kancloud.cn/e36fd6cd3187bc05ee1528bc9051ea08_1056x609.png) V層: ![](https://box.kancloud.cn/f8e7a5d70a00be697ec1d2c27fa14ef6_826x610.png) 我們看到,數據以POST方式傳入了,并且insert也可以正確接收。 > 如果還不太清楚$_POST,你需要GOOGLE一下,最好也一并GOOGLE一下$_GET。 ## 使用內置類獲取變量 在thinkphp中,為了防止sql注入(一種非常常見的攻擊手法),我們在取一些系統變量信息時,使用thinkphp提供給我們的Request來獲取用戶輸入的變量。 > 變量獲取 http://www.hmoore.net/manual/thinkphp5/118044 我們簡單來看一下,使用內置Request類并正確設置后,與直接輸出的區別。 將insert代碼改寫為: ~~~ ... use think\Request; // 引用Request ... public function insert() { var_dump($_POST); // Request::instance()返回了一個對象,調用這個對象的post()方法,得到post數據 $postData = Request::instance()->post(); var_dump($postData); return ; // 提前返回 // 實例化Teacher空對象 $Teacher = new Teacher(); $Teacher->name = '王五'; $Teacher->username = 'wangwu'; $Teacher->sex = '1'; $Teacher->email = 'wangwu@yunzhi.club'; // 執行對象的插入數據操作 $Teacher->save(); // 反饋結果 return '新增成功。新增ID為:' . $Teacher->id; } ~~~ 測試結果如下圖所示: ![](https://box.kancloud.cn/b3bbd6de366f0b3b5ceabb863af48a20_736x89.png) 默認點擊上圖中的【保存】按鈕后,跳轉至如下頁面: ![](https://box.kancloud.cn/3905e07ec2292e5d10c15a1d85314b6b_581x273.png) 我們發現使用`Request::instance()->post();`同樣獲取到了post過來的數據。我們在分析這行語句前首先回顧下前面的內容。 * * * * * 在前面的3.2.3中,我們使用`Db::name('teacher')->select();`來獲取了數據表中的數據。對比我們在這里使用的`Request::instance()->post();`不難發現`::`這個符號。在這里,我們可以把`Db::name('teacher')`理解為調用`Db`類中的`name`方法;把`Request::instance()->post();`理解為調用`Request`類中的`instance()`方法。 前面我們在提到面向對象的思想時,講過面向對象的步驟是:先實例化一個對象,然后調用這個對象上的方法。 那么為什么這里,我們沒有實例化`Db`類,卻直接使用了`::`調用`name()`方法呢? 這是由于在類中有一種方法叫做**靜態方法**,**靜態方法**可以不進行實例化而直接使用`::`來調用。而上面的`name()`和`instance()`都是`ThinkPHP`為我們準備好的靜態方法。后面的章節中,我們還會專門的對靜態方法進行講解。 * * * * * 通過測試不難看出,使用上述兩種方法獲取到的post數據是一致的,那么怎么防止sql注入呢?下面,我們在config.php中設置一下過濾方法: ~~~ // 默認全局過濾方法 用逗號分隔多個 'default_filter' => 'htmlspecialchars', ~~~ 我們在用戶名處,輸入&<兩個特殊的符號,然后點擊保存進行測試: ![](https://box.kancloud.cn/2016-06-14_575fa8bdc6a3a.png) 我們看到 &< 兩個符號變成了 `&amp;&lt;`。 這是出于安全的角度上考慮的。至于為什么這樣就安全了,什么時候我們需要停用安全過濾,我們爭取在后續進階教程中給大家講解。 在這里,我們只需要知道在config.php文件中,設置過濾方法后,再使用Resquest::instance()->post() 來獲取post數據,就可以了,這樣做的目的是為保證數據更加安全。 ~~~ git checkout -f step3.3.2.2 ~~~ 執行上述命令后,上述示例代碼信息如下: ![](https://box.kancloud.cn/f07a561e8f80549778b653d65e9ad350_1103x571.png) 在配置文件config.php中設置過濾方法如下所示: ![](https://box.kancloud.cn/955f0594f032514f6cb39a9cdc63d480_826x386.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看