您好,欢迎来到年旅网。
搜索
您的当前位置:首页最简单的php新闻发布系统

最简单的php新闻发布系统

来源:年旅网
最简单的php新闻发布系统

2008年09月08日 星期一 17:02

芽雨原创PHP新闻系统教程(第一版)第一讲:用 phpmyadmin 建立数据库

首先建立一个数据库,名为 yayu 。在这个数据库下建立一个数据表,名为 news 。下面进入一个重点,那就是在表 news 下建立各个字段。

那么,什么叫字段呢?通俗点,就是一类事物的总称。比如说,所有的新闻发表时间用一个名词来代表(从偶的经验来看,用 phpmyadmin 建立字段可以用中文,但从习惯来说还是用英文,没办法,计算机美国最牛嘛)。偶们用“ time ”来表示。在字段 time 下可以有很多“发表时间”,那么如何来区分这些时间呢,这个可以查询其它字段下的内容,比如偶们建立新闻的标题的字段为

“ title ”, title 字段下的内容按照常理说来是没有一样的。所以可以通过一个标题来查询这个发表时间。其实我们可以让每个 title 或 time 下的内容都对应一个编号,那就是字段——

“ id ”:字段“ id ”是一个人们默认的首选字段,其它字段下的内容可以重复出现,但这个字段却是从 1 开始增大的阿拉伯数字。在设置这个字段时,要设置主键、索引、唯一以及 auto-increment 。这个 auto-increment 就是自动增加的意思。当任一字段增加内容时,这个字段就自动增加 1 ,也就是说,任一字段都对应一个唯一的 id ,比如 1 、 2 、 7 „„

下面谈谈新闻部分字段的建立。 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 ”都是 phpmyadmin 默认下的主机名和用户名,并且密码为空。

同功能的函数还有 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 部分的内容必须要和 phpmyadmin 中定义的字段顺序一样。

下面请看例子:

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,author,source,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 属性一致就可。之所以选择用与字段名相同的字符,是因为这样偶们就不必再费力去多记一个变量名而已。

偶们再来看 标签中的内容:

中的内容是用来得到 content 字段内容的,因为此字段中的内容太多,所以只能用这个标签了。

当偶们填好这些内容后,只要提交就可以了,那么这一过程又是如何实现的呢? 下面偶们再来看以下的程序:

这里的 type=\"submit\"/ type=\"reset\" 分别代表提交和重写新闻。 value 属性的内容在此按钮上显示出来。 name=\" reset\"/ name=\"submit\" 中的含义和上面所说的是一样的。

HTML 中的表单( form )元素是专门负责也用户进行交互式操作的。当点击类型为 submit 的按钮时,表单中所有的元素都将以变量的形式提交给 action 所指的文件来处理。变量名由该元素的 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,date,author,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 .= \"\";

$echopage .= \"

\";

$echopage .= \"

\";

$echopage .= \"

\"; $echopage .= \"
\".$pages.\" 页 第一页 href=\".$_SERVER[\"HP_SELF\"].\"?page=\".$pages.\"> 最后一页 前一页 后一页 到第
\";

对这段程序偶就不做详细的讲解了。因为很麻烦,再说这和新闻程序的算法不是一回事,呵呵。在用的时候,偶们在输出的新闻标题后面这样写就可以了:

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 \"src='../sucai/biaozhi.JPG' width='15' height='15'>target=_blank>\".$rows[\"title\"].\"[\".$rows[\"date\"].\"]\";

echo \"\"; }

while($rows) 便是按 id 的由大到小的顺序输出新闻的。 $rows[\"title\"] , $rows[\"author\"] 就是数组形式的内容了。

下面来谈谈如何查看每一条新闻的内容。

偶们来看看上面第 4 个程序中的:

target=_blank>\".$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 \"

\"; echo \"
\"; echo \"\";

echo \"

\"; echo \"\"; echo \"\";

echo \"

\"; echo \"\"; echo \"\";

echo \"

\"; echo \"\";

echo \"

\".$rows[\"title\"].\"
\".$rows[\"date\"].\" \".$rows[\"department\"].\" \".$rows[\"author\"].\"

\".$rows[\"content\"].\"
\"; }

相信通过前面的讲解,您一定可以看懂上面的程序了。

芽雨原创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 .= \"\";

$edit .= \"

第 $id 条新闻

标题 :
作者

期 :
\".$row[\"date\"].\"

\";

$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新闻系统教程(第一版) 第六讲:用户管理

在这一部分,偶们来看看如何管理新闻程序只让管理员来操作。这包括让管理员注册(这个操作最好用 phpmyadmin 进行,毕竟不能随便让人当管理员嘛)、登陆、保存管理员的信息以便让系统识别他并让他对新闻进行操作、注销。

在这一讲中偶用给程序做注解来介绍相关的知识。

下面请看注册的程序 :

这个程序分为两部分,前面是 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\ mysql_select_db(\"yayu\

$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{ ?>

注册

// 值传递的方式为 POST

代号 :



密码 :

重新输入密码:



再来看登陆和注销的程序 if(@$_POST[\"submit\"]) {

if(empty ($_POST[\"username\"])) die (\" 请填写用户名 \");

// 这里用了 die() 函数,作用是名字为空时向用户提出提示信息。 else

$username = $_POST[\"username\"]; // 记录用户名。

if(empty ($_POST[\"password\"])) die (\" 请填写密码 \"); else

$password = $_POST[\"password\"];

$link=mysql_connect(\"localhost\ $selectdb = mysql_select_db(\"yayu\

$sql=\"select id,password,name from users where name='$username'\"; $result=mysql_query($sql)or die (mysql_error ()); while($pa = mysql_fetch_assoc($result))

{ // mysql_fetch_assoc() 函数是把返回的数据以数组的方式保存,数组的下标与字段名 // 相对应 $pwd = $pa[password]; $userid = $pa[id];

// 检测用户名是否正确 if(!$result) {

echo \" 错误的用户名 \";

echo \"
重新登陆 \"; mysql_close($link); exit; }

// 检测密码是否正确 if($pwd != $password ) {

echo \" 亲爱的 \".$username.\"
\"; echo \" 您输入了错误的密码 \";

echo \"
请您 重新登陆 \"; mysql_close($link); exit; }

// 如果一切正常,则设置 Cookie

setcookie(\"username\ header(\"Location:admin.php\"); }

if(@$_GET[\"action\"]==\"logout\") {

setcookie(\"username\

header(\"Location:index.php\"); } } ?>

在上面的程序中,有一个很重要的东西,那就是 Cookie 。

Cookie 是 Web 服务器存储在客户端的小型数据包,当用户再次连接放置 Cookie 的 Web 服务器时, Web 服务器可以再次读出它防止在 Cookie 的数据,再通过 Cookie ,服务器可以将特定的信息放在访问者的机器上。

偶们从程序中可以看见一个 Cookie 函数 setcookie() ,它用来存储用户的名字,语法为: setcookie(\" 自定义的用户名 \用户的名字 \");

在偶写的程序中“自定义的用户名”用的是“ username ”,当“用户的名字”为空时,

就相当于注销了。

当偶们的一些客户端操作需要管理员执行时,偶们就要用到 Cookie 了。偶们使

用 if(@$_COOKIE[\"username\"]) (这个得到数据的方式是不是和 POST 的很像呀)

来做判断。如果 username 有值,那它就做为逻辑量中的 1 了。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务