从数据库读取数据
配置ThinkPHP连接数据库。首先你需要有数据库以及所必需的表和字段。新建一个数据库mynews,然后建立如下表:
CREATE TABLE IF NOT EXISTS `tnews` (
`fID` int(11) NOT NULL auto_increment COMMENT '主键',
`fTitle` varchar(20) NOT NULL COMMENT '标题',
`fTime` varchar(20) NOT NULL COMMENT '时间',
`fAuthor` varchar(20) NOT NULL COMMENT '作者',
`fContent` text NOT NULL COMMENT '内容',
PRIMARY KEY (`fID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
接着向数据表tnews中添加四条记录。搞定数据库后,进入项目目录下的Conf文件夹,打开config.php文件,进行数据库配置。
<?php
return array( //'配置项'=-->'配置值'
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'mynews', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 't', // 数据库表前缀
);
数据库表前缀是什么?
数据库前缀就是你的数据库表名前相同的部分。在ThinkPHP中一定要配置数据库表前缀(DB_PREFIX),如果没有表前缀就为空!不然ThinkPHP会自动给加上think_前缀,造成无法正常使用数据库表。
搞定数据库连接后,我们来读取数据。打开项目目录下Lib/Act
public function index() {
$DBnews = M('news');
$res=$DBnews->select();
}
M()函数是实例化数据库表对象,比如M('news')就是实例化news对象,通过ThinkPHP操作tnews表(表前缀t+M()中的news就是表名)。实例化对象后赋值给变量$DBnews,什么时候要操作就调用该变量。然后看看$res里的值是什么。用dump()函数可以格式化输出数组到页面中:
public function index() {
$DBnews = M('news');
$res=$DBnews->select();
dump($res);
}
然后打开http://localhost/,就可以看到页面显示出了4条示例新闻。直接输出数据页面太粗糙,可以考虑制作一个新闻列表输出该数据。
ThinkPHP中原生sql语句查询
例如:查询按ID逆向排序的5条记录
select * from twealth order by ID desc limit 5
语句如下:
$Dataa = M(user); // 实例化Da
$list = $Dataa->query("select * from tuser order by wli desc limit 5");
$this->assign('list',$list);
$this->display(); // 输出模板
变量和数组输出
在项目目录的Tpl/Index文件夹下,我们制作一个简单新闻列表页index.html:
<!DOCTYPE html>
<html>
<head>
<title>新闻站</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1 align="center">新闻站</h1>
<hr/>
<table align="center" style="width: 50%;text-align: center;" border="1">
<tr>
<th>标题</th>
<th>时间</th>
<th>作者</th>
</tr>
<tr>
<td>第一条新闻</td>
<td>2013-05-10</td>
<td>ThinkPHP</td>
</tr>
</table>
</body>
</html>
<title>标签和<h1>标签都是一样的内容“新闻站”,我们可以使用变量输出的方式在控制器里定义,这样如果以后要改动这个名字的话,也会非常方便
public function index() {
$DBnews = M("news");
$res=$DBnews->select();
$this->assign('title','新闻站');
$this->display();
}
$this->display()是显示页面模板,上面的$this->assign('title','新闻站'),意思是将assign的第二个参数"新闻站"赋值给模板变量"title"。这样,我们就可以在index.html里的<title>标签和<h1>标签中写{$title}来显示我们定义的内容。也就是说,在控制器中用assign方法定义的第一个参数叫什么名字,那么在其显示的页面模板中就可以用{$}方式来显示。那么可不可以显示数组呢?我们来试试
public function index() {
$DBnews = M("news");
$res=$DBnews->select();
$this->assign('title','新闻站');
$this->assign('array',$res);
$this->display();
}
然后在页面模板中使用{$array},但页面上不会显示出这个数组,而是显示了"Array"。这说明显示数组不能简单的使用{$array},而且这样也不方便我们自定义要显示的方式。正确的方法是在页面模板中使用<volist>标签来显示
<!DOCTYPE html>
<html>
<head>
<title>{$title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1 align="center">{$title}</h1>
<hr/>
<table align="center" style="width: 50%;text-align: center;" border="1">
<tr>
<th>标题</th>
<th>时间</th>
<th>作者</th>
</tr>
<volist name="array" id="mynews">
<tr>
<td>{$mynews.fTitle}</td>
<td>{$mynews.fTime}</td>
<td>{$mynews.fAuthor}</td>
</tr>
</volist>
</table>
</body>
</html>
<volist>标签里"name"属性是在控制器里我们定义的模板变量,"id"则是在<volist>标签里循环时所用的循环变量。这两个属性是必须属性,除此以外还有一些可选属性。在<volist>循环中,{$mynews.fTitle}意思就是$mynews[$i]['fTitle'],其中$i是循环变量。由于我们没有对从数据库中取出来的数据做任何处理,所以循环中写上表名即可。