心得體會:多理解編程思想、多查閱api文檔、項目架構、如何設計php
想一想以前的學習方法簡直太死板了,眼見不開闊,跟牛人接觸的太少了,本身悶葫蘆寫的亂七八糟!!重要的是眼見思想,有了總體的思路之後其餘東西均可以查閱!html
zend studio的安裝,直接在官網上下載,破解註冊碼方法見網盤安裝包mysql
1.使用框架sql
在http://www.thinkphp.cn/下載須要框架。thinkphp
在zend studio下建立localphpproject 文件-》保存地址爲AppServ\www\project2(這樣能夠用localhost訪問)-》刪除index.php文件-》將下載的框架文件複製到項目裏面(這裏會string.class會報錯,直接把string 改革名字就行)數據庫
導入項目:import->general->existing projects into workspaceapache
瀏覽器訪問:http://localhost:8080/project2/demo1_thinkphp_3.2.1/編程
報錯: overlaps the location of another project: 'xxxx'api
建立工做路徑的時候要和建立localphp project文件保存的文件路徑一致數組
2.模塊化配置前臺和後臺
先在index.php下定義應用目錄做爲應用程序入口(前臺嗎?)-》打開網頁刷新-》點擊編輯器刷新
// 定義應用目錄 define('APP_PATH','./WeiBo/');
在生成的weibo目錄下新建文件夾Admin->直接將Home文件夾複製再更名就能夠了
再將Admin 下IndexController.class.php的命名空間改成
Admin\Controller
<?php // 本類由系統自動生成,僅供測試用途 namespace Admin\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ echo "houtai "; } }
admin做爲後臺?home做爲前臺?
這樣就實現了先後臺模塊化,公共使用核心配置文件
3.導入亂碼
properties->resource->other->Utf-8
4.url用戶密碼傳遞實例
如何調用操做:pathinfo:localhost/demo39/index.php/模塊/控制器/操做
eg.
UserController.class
public function user($user,$pass){ echo 'user'; }
url傳遞值
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php/Home/User/user/user/admin/pass/123
或者
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php?m=Home&c=User&a=user&user=leo&pass=123
5.URL重寫(參看手冊:部署-》URL重寫)
能夠經過URL重寫隱藏應用的入口文件index.php,下面是相關服務器的配置參考:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
6.沒法啓動服務器界面???
services.msc中apache stop->start
7.沒法鏈接數據庫??
這裏真是血與淚的教訓啊!
'DB_HOST'=>'localhost', 這裏不能寫端口啊!!!
8.加入調試分析
Common/Conf/config.php
//頁面TRACE
'SHOW_PAGE_TRACE'=>true,
9.數據庫的鏈接配置
數據庫及數據庫裏面的表都要實現創建好,而後纔在zend裏面配置鏈接
url:localhost/phpMyadmin
(1)數據庫的全局化定義
Common/Conf/config.php
兩種不一樣方式
//mysql全局定義 'DB_TYPE'=>'mysql', 'DB_HOST'=>'localhost', 'DB_USER'=>'root', 'DB_PWD'=>'123456789', 'DB_PORT'=>'3306', 'DB_NAME'=>'thinkphp', 'DB_PREFIX'=>'think_', //PDO專用定義 'DB_TYPE'=>'pdo', 'DB_USER'=>'root', 'DB_PWD'=>'123456789', 'DB_PREFIX'=>'think_', //表前綴,在數據庫中代表是這樣的 : think_user 'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',
//配置的時候就已經選擇了鏈接的數據庫名稱和創建的表前綴,固然這都須要在數據庫裏面建立好
(2)鏈接
Home/Controller/UserController.class
對應四種方法
public function model(){ //建立model基類,傳遞user表,think_user //Model能夠傳遞三個參數:表名、表前綴、數據庫信息 (1) //$user=new Model('User'); //鏈接數據庫 (2)// $user=M('User'); //推薦 (3) //$user=new UserModel(); (4)// $user=D('User'); //支持跨模塊實例化:Admin/User
第三種方法在Home/Model建立UserModel.class.php
<?php namespace Home\Model; use Think\Model; class UserModel extends Model{ /* //更改表前綴 protected $tablePrefix='tp_'; //不包含前綴的數據表名稱 protected $tableName='abc'; //更改前綴加表名 protected $trueTableName='tp_abc'; */ public function __construct(){ parent::__construct(); echo '\home'; } }
10.sql
(1)查詢
字符串
M爲沒有前綴的數據表名
$user=M('User'); //字符串查詢 //var_dump($user->where('id =1 and user="蠟筆小新"')->select());
索引數組做爲條件查詢
/* $condition['id']=1; $condition['user']='蠟筆小新'; $condition['_logic']='or'; var_dump($user->where($condition)->select()); */
對象查詢,在PHP根目錄下尋找內置類
$condition=new \stdClass(); $condition->id=1; $condition->user='蠟筆小新'; var_dump($user->where($condition)->select());
(2)表達式查詢
eg.
(3)快捷查詢
(4)區間查詢
(5)組合查詢
(6)統計查詢
(7)動態查詢
數據表的導入導出
12.SQL連貫操做(大概就是php語句下的sql語句查詢)
這些語句都要在配置好數據庫以後入口文件的Home/User/model方法下寫
能夠在開發手冊 模型-》連貫操做下查到
13.CURD操做
(1)用到靜態html文件,安裝aptana插件?
http://mrthink.net/zend-studio-aptana-tips/
(2)數據建立
在工程文件下新建index.html文件
<meta charset="UTF-8"> <form method="post" action="http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/User/create"> <p>標誌:<input type="text" name="name"/></p> <p>標題:<input type="text" name="title"/></p> <input type="submit" value="提交"/> </form>
注意默認提交方法爲post,若爲get則接收方式有差別,action指向接受數據建立數據的方法中
Home/User/create方法:
/** * 數據建立,數據提交的結果就是提交的POST的鍵值對 */ public function create(){ $user=M('category'); //除去前綴外的名字 //爲何須要User來進行create?並非數據庫裏面的數據啊 var_dump($user->create()); //經過表單提交的時候默認已經構造好了一個$data對象,也能夠本身手動建立 $user->add(); }
create()爲建立數據源,這裏是直接接受post提交過來的數據,是一個數組,可是尚未添加到數據庫,這裏還有其餘幾種建立數據源的方式,在api文檔中能夠查到。
add()是將數據保存到數據庫。
tips:
接受post提交的數據對象
$data['user']=$_POST['user'];
按必定規則獲取日期數據
$data->date=data('Y-m-d H:i:s');
若index.html文件改成get方式提交數據,由於默認是post方式,因此在接收時須要作以下改變
var_dump($user->create($_GET));
支持一系列連貫操做
(3)數據寫入
使用add方法
若是在add以前已經建立數據對象的話(例如使用了create或者data方法),add方法就不須要再傳入數據了。
支持一系列的連貫操做,來對所寫數據加入限制條件
(4)數據讀取
讀取中find()和select()方法有何不一樣?
find 方法:查詢符合條件的第一條數據。
select 方法:查詢符合條件的全部數據。
配合查詢時候一系列連貫操做實現
讀取字段值(相似於限制讀取字段)
// 獲取ID爲3的用戶的暱稱
$nickname = $User->where('id=3')->getField('nickname');
(5)數據更新
個人媽,竟然被一個狗屁問題困擾一半天,在寫路徑的時候因爲事先沒有隱藏入口文件,在打url的時候就一直忽略了打Index.php,我在沒有更愛前綴的狀況下一直在改
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php/Home/User
14.視圖
這個視圖好像就至關於mvc裏面的v,參看 開發手冊上面的視圖
好比在Home目錄下的控制器User中
<?php // 本類由系統自動生成,僅供測試用途 namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index(){ $this->assign('name','labixiaoxin'); $this->display(); } }
display就是渲染出相應的view中的內容,因此須要在View->新建User文件夾-》新建對應的Index.html文件。。這裏就對應上面controller裏面的渲染輸出的內容。
路徑相關後綴均可以調整的哈
15.模板
就是視圖裏裏面輔助輸出的數據
變量輸出
16.控制器
url訪問
http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/User
項目名稱/模塊(Home)/User(控制器名稱)--》這個直接就是默認訪問該名字的控制器(一級)
若是是二級控制器,則爲
http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/Member/User
項目名稱/模塊(Home)/Member(控制器二級文件夾名稱)/User(控制器名稱)--》這個直接就是默認訪問該名字的控制器(一級)
分層控制器:是與Controller控制器同級別的其餘控制器
訪問時
Home\Event\UserEvent
分級控制器:是在Controller控制器下面的控制器子文件
彷佛多級控制器就是沒有效果
(1)控制器的名稱採用駝峯命名法
ome/Controller/IndexController.class.php
這種首字母大寫 而且在名稱後面加上Controller的命名方法,能夠在url引用的時候直接引用controller前面的名字便可
http://serverName/index.php/Home/Index/
Index其實就是指明瞭IndexController這個控制器
(2)設置操做方法後綴
'ACTION_SUFFIX' => 'Action', // 操做方法後綴
(3)多級控制器
'CONTROLLER_LEVEL' => 2,
(4)實例化控制器
提供跨模塊訪問方法
// 實例化Home模塊的User控制器
$User = new \Home\Controller\UserController();
或採用快捷調用方法A
$User = A('User');
$Blog = A('Admin/Blog');
(5) 前置和後置操做
是在執行某個操做方法以前和以後會自動調用的方法
public function _before_index()
public function _after_index()
(6)輸入變量
// 採用htmlspecialchars方法對$_GET['name'] 進行過濾,若是不存在則返回空字符串 echo I('get.name','','htmlspecialchars');
param變量類型是框架特有的支持自動判斷當前請求類型的變量獲取方式,例如:
echo I('param.id');
I方法的第三個參數若是傳入函數名,則表示調用該函數對變量進行過濾並返回 (在變量是數組的狀況下自動使用array_map
進行過濾處理),不然會調用PHP內置的filter_var
方法進行過濾處理,..
filter_var() 函數經過指定的過濾器過濾變量。
filter_var(variable, filter, options)
path類型變量能夠用於獲取URL參數
變量過濾
用法以下: I('變量類型.變量名/修飾符');
(7)請求類型: 須要判斷當前操做的請求類型是GET 、POST 、PUT或 DELETE
(8)空操做: 指系統在找不到請求的操做方法的時候,會定位到空操做(_empty
)方法來執行,利用這個機制
在url傳遞參數的時候,能夠不輸入須要的操做方法,直接就定位到_empty()方法內
(9)空控制器
指當系統找不到請求的控制器名稱的時候,系統會嘗試定位空控制器(EmptyController),利用這個機制咱們能夠用來定製錯誤頁面和進行URL的優化。
url:http://serverName/index.php/Home/shanghai/
根據當前控制器名字大概就是把ShangHai這個本來應該是控制器名稱的地方由參數這個東西僞裝取代。
<?php namespace Home\Controller; use Think\Controller; class EmptyController extends Controller{ public function index(){ //根據當前控制器名來判斷要執行那個城市的操做 $cityName = CONTROLLER_NAME; $this->city($cityName); } //注意 city方法 自己是 protected 方法 protected function city($name){ //和$name這個城市相關的處理 echo '當前城市' . $name; } }
(10)插件控制器
經過在url中加入插件控制器變量的方法,會自動定位到插件控制器中的操做方法。
VAR_ADDON' => 'plugin'
插件控制器的變量由參數 VAR_ADDON 進行設置,默認爲addon,例如咱們在URL中傳入: http://serverName/Home/info/index/addon/SystemInfo
則實際定位到的是
Home/Addon/SystemInfo/Controller/InfoController.class.php