speedphp mysql_SpeedPHP的入门学习

一、下载最新版的框架文件,在下载栏目中下载最新稳定版本的SpeedPHP框架;请将下载后的压缩包解压到您的服务器的目录中(例如:C:\wamp\www)

下载压缩后这样:(只要包含protected,.htaccess,index.php就足够了,其他东西可有可无)

其中:.htaccess的作用=>当页面不存在时,就将页面跳转到index.php

二、访问服务器网址(http://localhost):这里域名为localhost

三、运行原理:

1)、在index.php引入了protected下的lib库的speed.php

2)、在speed.php引入连接数据的cofig.php

我们可以在protected/config.php文件中对程序进行数据库的配置:

这里必须注意几点:

1、$domain下面是域名,必须跟当前web站点的域名相同,比如说本机学习测试时,一般会用localhost;如果是发布到网上,如果你的域名是Client Validation ,那么就必须设置成"php.test.com"。否则会出现500错误。(例子中的域名为sp.example.com)

2、数据库的配置资料,一般网上购买的主机空间都会提供,请联系主机提供商。

四、显示页面:

和访问者交互的是控制层(Controller层),控制器(controller)是同类交互的集合,每一个交互的操作,都对应了一个动作(action)。在sp框架中,全部的控制器类都必须继承于Controller。由于需要比较方便的进行全局控制操作,所以sp加入BaseController的级别,从继承关系来看是普通的Controller(例如MainController、ViewController、OtherController等等)继承于BaseController,而BaseController继承于Controller。以下是层级关系图。加入BaseController后,很多公共的全局操作可以放到BaseController里面来进行,如权限控制,全局提示信息封装等。

1)、接下来,我们打开protected/controller/MainController.php文件,把原来的

function actionIndex(){

echo "Hello World";

}

改成

function actionIndex(){

$this->display("guestbook.html");

}

2)、打开浏览器看看http://localhost :则显示view文件夹下的guestbook.html页面

五、功能的实现

1、上传数据

1)、在 protected/controller/MainController.php,我们加入新的方法actionWrite(); actionWrite()方法还是以action开头,代表了这是一个页面,里面现在只是通过 dump(arg())函数把提交的数据输出一下,方便我们验证表单提交是否正确。

如: actionIndex()一般用于显示主页

class MainController extends BaseController {

function actionIndex(){

$this->display("guestbook.html");

}

function actionWrite(){

dump(arg());

}

}

2)、打开protected/view/guestbook.html模板,将

;把它的action,也就是指向地址,改为我们的提交地址。">

3)、保存文件后打开浏览器刷新一下localhost,右键查看源代码,会发现这个地址已经变成了:

在form 点击提交按钮则会跳转到http://localhost/main/write这个页面;main和write都是不存在的文件,可是会默认跳转到index.php

4)、在actionWrite()方法内实例化一个model模型(实例一个model类)

$guestbook = new Model("guestbook");//Model的参数是上传到的数据表表名

5)、通过实例,使用Model的create方法把前面的数据插入到数据表中

$result = $guestbook->create($newrow);//$newrow是提交的数组内容

如:

// 构造新建留言的数据

$newrow = array(

"title" => arg("title"), // 字段一一对应

"contents" => arg("contents"),

"username" => arg("username"),

"createtime" => time(), // time()函数可以产生当前时间戳

);

$newrow是一个字段(key)和数据表guestbook字段对应的php数组,如title,contents等字段。

time()函数会产生一个11位的时间戳,我们经常用其来存储php的时间,这里将time()的结果存到createtime字段上面去。

注意:arg()对应的参数为对应input标签的name属性值

create()方法返回的结果是“影响行数”,比如说新增了一行数据,那么返回就是1。这里可以把返回1当作新增记录成功的表现即可。 6)、$this->tips()方法是BaseController类自带的方法,只是弹出一个JS提示。如果需要更漂亮的提示,可以自行修改该方法的实现。

$this->tips("插入数据成功!", url("main", "index"));

2、显示数据列表

1)、protected/controller/MainController.php的actionIndex()方法

由于页面显示在actionIndex()方法,所有在显示页面前去数据库查询数据

2)、

a、跟actionWrite()方法一样,我们先实例化一个guestbook表的模型类。

$guestbook = new Model("guestbook");

b、然后调用模型类的findAll()方法,得到结果是$this->records。

$this->records = $guestbook->findAll();

c、输出$this->records看看

dump($this->records);

注意:$this->records这样的变量是控制器的成员变量,而这个写法跟普遍变量(比如说$records)不一样的地方是,$this->records可以在模板内直接使用。也就是说,在控制器内,通过$this->赋值的变量,都可以在模板内使用;而普通的变量并没有这样的功能。个人觉得,换一种说法,->就相当于javascript中的(.)字符串,指向类的属性和方法

数据已经出现在$this->records变量中了,那么我们在模板里面来使用这些数据吧。

3、把$this->records变量的内容循环显示出来。

请注意在模板内,$this->records变量对应的内容变量是$records

//里面是需要循环的HTML代码

//如:

1)、首先是一个大的,这里代表了整个区域的HTML代码会被“循环”输出,循环的次数根据$records的记录条数而定。

2)、foreach的语法跟php本身的foreach是差不多的,指的是将$records循环,然后每次循环出来的值都赋值给$r。那么每次循环里面,$r实际上是代表了一个一维数据,字段(key)名对应数据表的字段名,值是数据表的记录内容。而通过点号(.)可以把值取出来显示在页面上,如就能取到title字段的值了。

3)、然后标题,内容,用户名的位置,分别被,,所替换,分别输出对应的值。

4)、是显示时间,使用了php函数date来格式化我们的createtime存储的时间戳。

5)、MainController里面的dump()输出去掉,恢复display显示模板。

注意:只要一个模板就可以,因为foreach会遍历,自动创建相同的,根据记录条数创建

4、加入查看详细的弹窗

1)、showmsg.html文件,它只是页面的HTML片段,主要提供显示一个查看详细信息的对话框,并不是完整的页面。

将showmsg.html放到protected/view目录下面。

我们现在需要把这个页面插入到需要显示弹框的主页guestbook.html中。打开guestbook.html,我们加入一行代码:

inlucde语法的好处是可以把模板内通用的HTML片段抽离出来独立成文件,方便其他模板文件引用进去,达到一次修改就可以改变所有引用的内容。

2)、我们在protected/controller目录下面,新建个php文件,名称是:ViewController.php,里面内容是:这里是ViewController类,跟MainController一样,它继承于BaseController类,而且类的名字跟文件名是一样的。

ViewController类里面的方法叫actionShow(),action开头的方法是可以被浏览器访问到的。actionShow()是执行这块操作的主体代码块。

actionShow()方法开始我们把提交上来的参数upid,作为值构造成了一个查询条件的数组,数组名称是$condition。

arg("upid")代表获取浏览器提交上来upid的参数。

继续实例化guestbook表,然后调用find()方法,用$condition这个条件数组作为参数输入。

取得find()方法的结果$result,并且用dump()进行调试输出观察。findAll()比find()的结果多了个0,也就是多了一个维度。也就是说,find()实际上是findAll()的第一条记录,不过find()相对方便的是它是一维数组,可以直接通过类似$result["title"]的方式来取得值,而不是findAll()结果的$result[0]["title"]

header()函数的作用是输出后让浏览器识别这是一个json流。

json_encode()函数是php自带函数,可以将php数组转换成json格式,这里转换好了之后,就echo输出了。

跟json_encode()对应的还有json_decode()函数,作用相反,将json格式转回php数组。 echo是输出的意思,比如我们最早的 echo "hello world";,当然我们这个页面是没有用到模板的(没有display),是直接输出的。

arg("upid")是客户端传过来的数据=>

jQuery.getJSON(url, [data], [callback])

通过 HTTP GET 请求载入 JSON 数据。您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据,如

"myurl?callback=?"。jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。 注意:此行以后的代码将在这个回调函数执行前执行。

其中:的意思是:

c=>controller [ controller控制器的控制器类ViewController];

a=>action [ action方法类的actionShow()方法]

其中sp会调用controller文件夹下的ViewController控制类的actionShow()方法在每个需要显示内容的HTML元素上,我们加入了id的属性,也就是分别给它们取个名字,方便通过JS来进行赋值。

加入了一个JS函数showmsg(),这个js函数的作用首先是调用jQuery库的getJSON()方法,把传入的id发到这个地址上面去。

Bootstrap 模态框(Modal)插件;模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。

注意:如果您想要单独引用该插件的功能,那么您需要引用 modal.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。

(1)、通过 data 属性:在控制器元素(比如按钮或者链接)上设置属性 data-toggle="modal",同时设置 data-target="#identifier" 或 href="#identifier" 来指定要切换的特定的模态框(带有 id="identifier")。

( 2)、通过 JavaScript:使用这种技术,您可以通过简单的一行 JavaScript 来调用带有 id="identifier" 的模态框:

3)、我们还需要给每个留言增加个启动showmsg()函数的链接。在主页guestbook.html里面,我们把循环里面的标题增加一个链接。

onclick是HTML的一个事件,意思是点击后发生点什么,这里的代码指的是“当点击这个链接时,指向地址是空的,但是会启动JS函数showmsg()”

showmsg()函数传入了当前留言的id值。

5、点击修改数据且更新页面

这里得用到Model实例的update()方法=>

1)、获取当前的数据信息,

2)、再通过算法进行变量更改,

3)、接着调用model实例的update方法进行数据库的更新;update()方法输入两个参数,前面参数是条件数组,后面参数是需要更新的字段+值。

4)、接着输出更新后的数据(传给数据库的变量$dig);

6、数据库的删除

删除操作相对简单,跟其他操作一样,先是确定数组条件,然后直接调用delete()方法。

delete()方法只有一个参数,代表了删除记录的条件。

7、数据分页显示

当我们留言内容变多的时候,页面会变得很长,这时候我们需要对内容进行分页显示。

findAll()方法有四个参数,依次是$conditions,$sort,$fields,$limit;$conditions是条件数组,默认情况下是字段对应值的查询条件。

$sort是排序方式,比如说接下来我们会用到“createtime DESC”就是根据createtime创建时间倒序查询。

$fields是查询出来的字段,一般是“*”即可。

$limit是限定查询的数量,也是我们分页的基础。默认情况是“第几条,要几条”,比如说“10, 20”指的是从第10条记录开始,查出20条数据。

1)、页码接收页码$page,我们用了arg("p", 1);这个如果客户端没有传数据,则默认取==========后面参数1是代表如果p不存在,则返回1.

(int)arg("p", 1)的意思是强制将p参数转换成数字,保证数据库安全。

2)、findAll

$guestbook->findAll(null, "createtime DESC", "*", array($page, 3));

这里用了findAll的四个参数:null指的是没有条件,查询全部内容。

"createtime DESC"指的是按createtime倒序查询,如果是正序那么应该是"createtime ASC"。

"*"是全部字段,默认这个就好。

array($page, 3),这里指的是:当前是第$page页,每页3条留言。

综上我们可以知道,现在$this->records查询出来的结果是第$page的3条留言。

3)、page页码数据

$this->pager = $guestbook->page;//=====$guestbook的属性page包含的信息=====

这句代码紧跟着上面的findAll查询,意思是从$guestbook里面取出上一次findAll给出来的页码数据。这句代码必须紧跟着findAll,如果$guestbook再来一次findAll,那么可能$guestbook->page就不是第一次findAll的页码数据了。

$this->pager输出看看:

4)、取得页码数据后,我们就可以开始修改页面上的页面显示了。首先我们判断是否有分页数据,这里标签的作用就是如果$pager为空,则不会显示整个分页。$pager为空的意思是数据表记录没有能填满一页(根据分多少页的参数)。

填充上一页和下一页,注意是通过url函数传递p参数的

循环all_pages的页码数据,显示各个页码。

循环过程中,会通过做一下判断,判断显示的页码是否当前页,如果是的话,会在li上面加入一个 class="active"的属性,加亮显示。

最终分页上面会生成各个分页的链接。

之所以未满一页不显示分页,这也是对页面浏览者友好的表现,如果只有一两个留言,那么显示个点击不了的页码,甚不美观。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值