简单的PHP 新闻发布系统教程(第一版)第一讲:用 PHP myadmin 建立数据库 首先建立一个数据库 ,名为 yayu 。在这个数据库 下建立一个数据表,名为 news 。下面进入一个重点,那就是在表 news 下建立各个字段。
那么,什么叫字段呢?通俗点,就是一类事物的总称。比如说,所有的新闻发表时间用一个名词来代表(从偶的经验来看,用 PHP myadmin 建立 字段可以用中文 ,但从习惯来说还是用英文,没办法,计算机美国最牛嘛)。偶们用“ time ”来表示。在字段 time 下可以有很多“发表时间”,那 么如何来区分这些时间呢,这个可以查询 其它字段下的内容 ,比如偶们建立新闻的标题 的字段为“ title ”, title 字段下的内容 按照常理说来是 没有一样的。所以可以通过一个标题 来查询 这个发表时间。其实我们可以让每个 title 或 time 下的内容 都对应一个编号,那就是字段——
“ id ”:字段“ id ”是一个人们默认的首选字段,其它字段下的内容 可以重复出现,但这个字段却是从 1 开始增大的阿拉伯数字。在设置这 个字段时,要设置主键、索引、唯一以及 auto-increment 。这个 auto-increment 就是自动 增加 的意思。当任一字段增加 内容 时,这个字段就自动 增加 1 ,也就是说,任一字段都对应一个唯一的 id ,比如 1 、 2 、 0 27 ……
下面谈谈新闻部分字段的建立。
1. id :意义为每个新闻的编号,它是唯一的,类型为 tingint ,这个 tingint 类型无须指定长度,系统默为 4 ;在“额外”中选择 auto-increment ,并选择主键。
2. author :意义为作者 (新闻发布人),设置类型为 varchar ,设置这个字段长度时,如果考虑作者均为中国人,则 8 个字节为上限( 4 个汉字),但如果考虑到作者 可能为外国人, 8 个字节显然太少了,对其它字段也存在同样的问题,在这里偶们把长度设置为 8 吧。
3. title :意义为新闻标题 ,类型为 varchar ,长度为 60 吧,属性 为 primany key 。
4. content :意义为新闻的内容 ,类型为 text 。这个类型无须设置长度了。
5. source :意义为新闻的来源,类型为 varchar ,长为 60 。
6. date :意义为发表时间,类型为 datetime ,长度无须设置,属性 为 primany key 。
下面补充以下字段类型的相关内容 :
1 . date :时间和日期类型。时间和日期类型还包括 以下:
⊕ datetime : 0000-00-00 00:00:00
⊕ date: 0000-00-00
⊕ timestamp: 00000000000000 ( 14 个 0 ,长度取决于显示 尺寸)
⊕ time: 00:00:00
⊕ year: 0000
2 . conten t 字段代表新闻内容 ,由于其容量可能会很大,因此采用 text 类型(最多支持 65535 字节)
3 . title 字段设置为 primany key ,如果不会有一条以的新闻具有相同的发表时间, date 字段也可以作为? primany key ,这样今后对新闻的排序和检索会更加方便。
4 . text 类型的字段虽然也属于一种字符类型,但其大小不能指定,如果设置长度,则系统会提示 sql 语句出错。
现在, news 数据表就建立好了。
由于新闻不是所有人都能增加 的,只能有管理员 来做,所以现在我们再来建立数据表 users 来存放管理员 们。
1 : id :类型为 tinyint ,额外设置为 auto-increment、主键。
2 : name :意义为管理员 名称 ,类型为 varchar ,长为 8 ,属性 为 primany key 。
3 : password :意义为密码, 类型为 varchar ,长为 32 。
4 : mail :一样为邮件 地址, 类型为 varchar ,长为 30 。
现在,两个数据库 就设置好了,下面偶们进入新闻程序的开发中。
芽雨原创PHP 新闻系统教程(第一版) 第二讲:新闻程序的基础
一.连接数据库 的基础
偶们添加 、取出、修改 、删除 新闻都必须首先做一件事,那就是连接主机,选择数据库 ,向数据库 发出请求。否则一切都是纸上谈兵。下面介绍三个重要的 MysqL 语句,分别是: MysqL _pconnect( ) (连接主机), MysqL _select_db( ) (选择数据 库), MysqL _query() (向数据库 发出请求)。
1 . MysqL _pconnect( )
它的作用是连接主机。
语法为: MysqL _pconnect( “ 要登陆的主机 ”,” 登陆时的用户名 ”,” 密码 ”);
如 MysqL _pconnect( “localhost”,”root”,””);
其中的“ localhost ”、“ root ”都是 PHP myadmin 默认下的主机名和用户名 ,并且密码为空。
同功能 的函数 还有 MysqL _connect( ) 。语法是一样的,区别在于前者开启一个长期连接,且无法使用 MysqL _close() 函数 关闭 ,而后者使用完后要用 MysqL _close() 及时的关闭 。对于一个网站来说,使用前者比后者好。这样可以减轻 MysqL 服务器处理连 接和关闭 连接的负担。
这个函数 成功连接后,会返回一个连接 ID 。因此,这个函数 一般这样写:
$link= MysqL _pconnect( );
说到这,补充一个函数 MysqL _close() ,
语法为: MysqL _close(“ 要关闭 的连接 ID”);
比如: MysqL _close($link);
注:所有 ( ) 内都为字符串,有 $ 符号时就无须 ”” 了。
2 . MysqL _select_db( )
它的作用是选择一个数据库 为当前数据库 。以后的操作就都在这个数据库 中进行了。这个函数 如果执行成功,返回一个 true ,否则返回 false 。
语法为: MysqL _select_db( “ 数据库 名称 ”,” 连接的 ID”);
第二个参数可以省略,它会自动 寻找并连接最后一个使用的连接 ID 。
在本程序中,这个语句偶们写成: MysqL _select_db( “yayu”,$link);
3 . MysqL _query()
它的作用是向服务器发出一个提出请求的字符串。
语法为: MysqL _query(“ 提出问题的字符串 ”,连接 ID);
其中第一个参数是一个完整的 MysqL 语句,第二个参数可以省略,偶一般是把它省略的。
在使用这个函数 前应该先用 MysqL _select_db( ) 指定要使用的数据库 。
当提问的字符串是 update 、 insert 或 delete 时,函数 返回的结果是 true 或 false ,表明查询 是否成功,如果提问字符串是 select 语句则返回一个结果 ID ,如果 select 发生错误 ,则返回 false 。
了解了上面三个重要的函数 后,偶们就可以对数据库 发号施令了。那偶们用什么来发号施令呢?下面偶们再来看四个 MysqL 语句吧!
二.向数据库 发出请求语句基础知识
它们分别是: insert (向数据库 插入数据)、 delete (删除 数据表中的数据)、 select (检索数据)、 update (更新数据)。
1 insert ():向数据库 插入数据 。
语法A: insert into 数据表名(字段1,字段2,……) values(“ 字段1 d 的内容 ”,” 字段的2内容 ” …… )
语法B: insert into 数据表名 set 字段1 =” 字段1的内容 ”,字段 2=” 字段 2 的内容 ”,……
对A中,字段名可以省略,但后面的 values 部分的内容 必须要和 PHP myadmin 中定义的字段顺序一样。
下面请看例子:
A: insert into news(title,date,author,source,content) values($title,$date,$author,$source,$content)
注:上面的“ $ ……“代表了要添加 字段的内容 ,定义时: $ …… = 内容 ;
B: insert into news set title=$title,author=$author
注:如果内容 是数字,则 ”” 可以省略。
2 delete ():删除 数据表中的数据
语法: delete from 数据表名 where 指定地点 limit 数字
如果没有“ where 指定地点”则表中所有数据都没了。“ limit 数字”可以告诉服务器可以删除 的最大行数。
例子: delete from news where id=$id limit 1
3. select () : 检索数据
语法: select 字段名1,字段2,…… from 数据表名 where 地点
如果想列出所有记录中所有列的数据,可以使用“ * “代表字段名。
例子:A: select id,author from news where id=$id
B: select * from news where id=$id
4 update ():更新数据
语法和 insert 几乎是完全一样的。
如: update news set author=$author,title=$title where id=$id
值得注意的是,使用 update 语句时,要注意使用 where 字句,否则可能会导致大量的数据丢失。比如:
update news set author=” 芽雨 ”
这个操作会使表中所有的作者都变成“芽雨”了。
再举一个正面的例子,记录管理员 的表 users 中,如果有一个字段为 age ,用来存储用户 的年龄,一年后,他们要增加 一岁,可以使用以下的语句:
update users set age=age+1
太好了,偶们现在已经掌握程序大部分的基础了,还有小部分偶们以后在例子中掌握吧。
现在偶们面临的问题是如何写出算法了。
芽雨原创PHP 新闻系统教程(第一版) 第三讲:新闻程序的算法(一) ------ 添加 新闻
一。添加 新闻
添加 新闻既是向数据库 添加 新的数据。
整个算法是这样的:管理员 在表单中填写新闻的内容 ,包括 : title,content ,另外两个字段 ( id,time )的内容 有服务器完成,当然也要自己写程序,只是不由自己手动而已。提交表单后,用 MysqL 语句将它们添加 到数据库 中。
下面简单介绍一下表单中 标签 和 标签 。
标签 为单行文本框。偶们常用的属性 有: name,type 。 name 属性 指定了变量的名称 ,既这个名称 代表 了这个 中的内容 。 type 属性 指定了 中内容 的性质。如果 type=text ,则为 一般性的文字 。如果 type=password ,则这个“ ”中的内容 在浏览器一律以黑点显示 ,这样可以在输入内容 时不 会在无意中被他人见到而造成数据安全问题。
标签 为多行文本框,常用属性 为 name 。
在本程序中此段程序如下所示:
在“ name="author" ”中的 "author" 就代表了“ ”中的内容 。同样的,这个 "author" 也可以是 "title" 或者其他,值得注意的是,这个 "author" 和字段 author 是不一样的。偶在这个地方提到 两个非常相似的概念:字段 author 和变量 $author (上面的 ”author” 实际上就是 $ author ,因为它代表了 “ ”中的内容 )。虽然它们几乎是同名的,但可绝对不是一回事。 Author 是数据表 news 里的一个字段名, PHP 用它来有限定的访问 MysqL 中的数据,在程序中是不能用其它的字符替换的;而 $author 是本程序中用户 自己设定的变量符号,其值由 “ ”中对应元素的 name 属性 得到。既然它只是变量符号,偶们就可以使用任意字段,只要保证与表单中对应元素的 name 属性 一致就可。之所以选择用与字段名相同的字符,是因为这样偶们就不必再费力去多记一个变量名而已。
偶们再来看 标签 中的内容 :
在这个地方偶们把处理数据的程序还是放在同一页面 ( action=addnews.PHP ),在 method 属性 中偶们令 method=post ,这里的 post 是值传递的方式。那现在偶们就在 action 指定的页面 来讨论以下的程序:
$author=$_POST["author"];
这里的 $author 是偶们自己定义的变量名, author 是在 标签 中 name 属性 中定义的名字。 POST 为
中 method 定义的值传递方式。通过这种值传递方式得到的数据,偶们一律用 $_POST[" "] 收取。
完整的这类程序如下所示:
if(@$_POST["submit"]) { $author=$_POST["author"]; $department=$_POST["department"]; $title=$_POST["title"]; $content=parsecontent($_POST["content"]); $date=date("y-m-d H:i");MysqL _query("INSERT INTO news(title,department,content) VALUES('$title','$date','$author','$department','$content')"); }
其中的 date( ) 函数 用法 请查看其他书籍。上面一共是 5 个字段,还有一个字段 id 因为偶们在“额外”中选择了 auto-increment ,所以上面的数据插入到数据库 时, id 就自动 加 1 了。
当然在这个程序前,必须先连接好数据库 ,下面的所有与数据库 连接的程序也是一样的,必须先连接还数据库 。
芽雨原创PHP 新闻系统教程(第一版) 第三讲:新闻程序的算法(二) ------- 显示
二.显示 新闻
添加 新闻后,就可以让别人来看新闻了。
这里的算法是这样的:先在新闻首页 上显示 新闻的标题 及其他附加内容 (如发表时间),这可以用循环输出 的办法输出 所有的新闻的标题 。要查看具体新闻的内容 时,点击新闻标题 的超级链接 进入一个新的页面 查看这条新闻。
在开始这程序之前,链接 好数据库 。
当新闻很多时,偶们就要给新闻分页 了,偶们设置好每页显示 10 条新闻。
具体的分页 程序如下:
$respage = MysqL _query("SELECT COUNT(*) FROM news;"); //$num 是数据库 中总纪录数 while($row = MysqL _fetch_row($respage)) { $num = $row[0]; } $recordnum =10; $pages = ceil($num/$recordnum); // $recordnum 是每页显示 多少条记录, $pages 是一共有多少页 if (@$_GET["page"]) // 获取 url 中的参数 page { //$current 是当前页,$pre 是前一页的, $next 是后一页, $pre 和 $next 为后面前一页和后一页的连接参数 page 的值 // 如果 url 中的参数为 1 ,把当前页置为 1 前一页, $pre 也为一, $next 为 2 if($_GET["page"]==1) { $current = 1; $pre = 1; $next = 2; }else{ // 如果 url 中的参数不为一(不是第一页),就把当前页取值为 url 中获得的参数, $pre 为当前页减 1 , $next 为加 1 $current = $_GET["page"]; $pre = $current-1; $next = $current+1; } }else { // 如果 url 中没有参数 page ,当前页置为 1 , $pre=1,$next=2 $current = 1; $pre = '1'; $next = 2; } $now = ($current-1)*$recordnum; $echopage = "
$echopage .= "".$pages." 页 $echopage .= " 第一页 $echopage .= " 前一页 后一页 $echopage .= " 到第 @H_35_301 @n"; for($i=1;$i<=$pages;$i++){ if($i==$current) $echopage .= "$i n"; else $echopage .= "$i n"; } $echopage .= " 页 $echopage .= "
对这段程序偶就不做详细的讲解了。因为很麻烦,再说这和新闻程序的算法不是一回事,呵呵。在用的时候,偶们在输出 的新闻标题 后面这样写就可以了:
echo "
".$echopage."
放在后面是因为 $echopage. 里面包含了选择去第几页的程序。
偶们再来看以下程序:
1 : $sql ="SELECT * FROM news order by id desc LIMIT $now,$recordnum";
这里的“ order by id desc ”意为驱除的记录是按编号由大到小的顺序输出 的,换句话说就是新闻的输出 总是新发表的在前面。 “ LIMIT $now,$recordnum ”限制了新闻输出 的数目, id 的大小在 $now,$recordnum 之间,具体 $now,$recordnum 的数值请看上面的分页 程序的讲解(粗黑体字部分)。
2 : $res=MysqL _query($sql );
这条语句意思是向服务器发送请求,并将返回的结果保存在 $res 中。
3 : $rows=fetch_assoc($res);
这条语句意思是将查询 结果 $res 的内容 拆到一个数组 rows 中。如果 $res 中没有数据,函数 返回 false 值。 fetch_assoc( ) 函数 的作用和 MysqL _fetch_row() 是一样的。
4 : while($rows) { echo "
echo "".$rows["title"]."[".$rows["date"]."] echo " }
while($rows) 便是按 id 的由大到小的顺序输出 新闻的。 $rows["title"] , $rows["author"] 就是数组形式的内容 了。
下面来谈谈如何查看每一条新闻的内容 。
偶们来看看上面第 4 个程序中的:
".$rows["title"]."[".$rows["date"]."]
其中的“ href='index.PHP ?id=".$rows["id"]."' ”就是第 $rows["id"] 条新闻的具体地址了。从上面也可以看出显示 具体新闻的程序也在 index.PHP 中了。当偶们点击这个超级链接 时,此程序将参数传递给 PHP 文件 中的同名变量。需要注意的是,你只能向动态页面 传递参数,而不能传递给 .htm 结尾的静态页面 。
那这里所说的参数是指什么呢?上面的“ index.PHP ?id=".$rows["id"]." ”的“?”就是变量的开始,“ id ”则是变量名,“ ".$rows["id"]." ”就是变量的值了。如果还想向 PHP 文件 传递更多的参数,可以用“ & ”隔开。例如:
index.PHP ?id=".$rows["id"]."& title=".$rows["title"]."
在本程序中,偶们得到的变量名为“ id ”,现在偶们来分析这段程序吧!
1 :首先偶们要保证这个 id 在数据库 是有数据的,所以偶们用以下语句来判断:
if(isset($_GET["id"])){ }
这里的 $_GET["id"] 就是从浏览器地址栏中接受数据的方式。 isset( ) 是判断有无数据的函数 。
2 :如果有数据,偶们就把以下的程序写入上面的“ { } ”中。
$sql = "select * from news where id=".$_GET["id"].""; $res= MysqL _query($sql ); $rows=fetch_assoc($res); while($rows) { echo "
"; echo "echo "".$rows["title"]." echo " "; echo "echo "".$rows["date"]." ".$rows["department"]." ".$rows["author"]." echo " echo " echo " echo " echo "echo " ".$rows["content"]." echo " echo "
}
相信通过前面的讲解,您一定可以看懂上面的程序了。
芽雨原创PHP 新闻系统教程(第一版) 第五讲:新闻程序的算法(一) --- 修改 、删
三.修改 、删除 新闻
和查看新闻的程序一样,偶们要先列出所有的新闻标题 ,然后在选择具体的新闻进行修改 、删除 操作。
在这里列出新闻标题 时,比 index.PHP 的程序多了一条语句,那就是输出 :
修改
通过点击这个超级链接 ,偶们进入具体的修改 、删除 新闻的程序。
具体的程序如下:
if(@$_GET["id"]) { $id = $_GET["id"]; $sql ="SELECT * FROM news WHERE id=$id"; $res = MysqL _query($sql ); $row=fetch_assoc($res); $edit = "
"; $edit .= ""; $edit .= " 第 $id 条新闻 标题 : $edit .= " 作者 日期 : ".$row["date"]." ".$row["content"]." $edit .= " "; $edit .= " "; $edit .= " "; $edit .= ""; echo $edit; }
上面“ if(@$_GET["id"]) ”中的“ @ ”意思是说禁止 函数 返回出错提示 。这样当程序出现异常时,不至于让普通用户 看见那莫名其妙的出错信息。
值得一说的是,偶们把可以修改 的内容 放在属性 value 中,既“ value=".$row["title"]." ”等。
在
标签 中把 action 属性 设为“ action=takeedit.PHP ”,当偶们提交表单后,由 takeedit.PHP 对数据库 进行操作。
这其中的语句都是偶们在前面提到的,偶就不信你看不懂!!!程序如下:
if(@$_POST["edit"]) { $author = $_POST["author"]; $title = $_POST["title"]; $content = $_POST["content"]; $source =$_POST["source "]; $date = date("y-m-d H:i");MysqL _query("UPDATE news SET author='$author',title='$title',content='$content',source =' source',date='$date' WHERE id=$id"); } if(@$_POST["delete"]) {MysqL _query("DELETE FROM news WHERE id=$id LIMIT 1"); }
芽雨原创PHP 新闻系统教程(第一版) 第六讲:用户 管理
在这一部分,偶们来看看如何限制管理新闻程序只让管理员 来操作。这包括 让管理员 注册 (这个操作最好用 PHP myadmin 进行,毕竟不能随便让人当管理员 嘛)、登陆、保存管理员 的信息以便让系统识别他并让他对新闻进行操作、注销。
在这一讲中偶用给程序做注解来介绍相关的知识。
下面请看注册 的程序 :
这个程序分为两部分,前面是 MysqL 部分,后面的是 HTML 部分(提交表单)。两部分连接起来的方式是在提交表单是在 标签 设置 action="register.PHP " 。把 MysqL 放在前面是为了避免有的 PHP 函数 不允许前面有 HTML 输出 的缘故。
if(@$_POST["submit"]) { if (empty ($name) || empty ($password)|| empty ($repassword)) //(empty () 函数 是用来判断里面的字符是否为空的。 { echo " 填写有错误 ,请 重新填写 "; } if($password!=$repassword) { echo " 两次密码输入不同,请 重新填写 "; } // 经上面的判断就可以去数据库 进行操作了,这样做的目的是为了减轻服务器的负担。 $link=MysqL _connect("localhost","root","");MysqL _select_db("yayu",$link); $sql ="SELECT id FROM users WHERE name='$name'"; $result=MysqL _fetch_row(MysqL _query($sql )); // MysqL _fetch_row() 函数 把得到的所有数据存到一个数组中去,这个数组是以数字为 // 引的。在这里,当返回有数据时, $result 相当于逻辑量 1 了。 // 检测用户 提交的用户名 是否被注册 if($result) { echo " 已经有相同的用户名 存在,请 重新填写 "; }else{ // 如果一切正常,将数据加到数据库 中 $sql ="insert into users(name,password) values('$name','$password')"; // 检测用户 注册 是否成功 if(MysqL _query($sql ,$link)) { echo " 注册 成功,请立即 登陆 "; } else { echo " 注册 失败,请 重试 "; } } }else{ ?>
注册 PHP" method="OST">// 值传递的方式为 POST 代号 : 密码 :
重新输入密码: 注册 ">