|
 
|
1#
发表于 2007-8-8 01:47
| 只看该作者
[最适合菜鸟]刚学PHP,做的最粗糙最简单的留言本[全程思考过程][更新版本V2.0]
第一次写的程序在这里
http://www.phpchina.com/bbs/thread-32190-1-2.html
如果没有看第一篇的新手请看第一篇,再看这一贴子,
因为这里不是从头开始了,而是接着上次的来修改,完善...
我准备把他写成连载,记录自己学习PHP的点点滴滴
老鸟就不用看了,因为都是比较基础的东西,
如果要看,就看最后我提的问题吧:)
这一次主要是增加了几个字段,增加了删除,修改功能
呵呵,这一次我把表的字段增加了 sex hompage email 这3个字段, 看看SQL语句吧ALTER TABLE `my_liuyan` ADD `sex` VARCHAR( 2 ) NOT NULL AFTER `name` ;
#这个是增加sex的语句, AFTER `name` 的意思是在name 字段后面 ,同样
ALTER TABLE `my_liuyan` ADD `homepage` VARCHAR( 2 ) NOT NULL ;
ALTER TABLE `my_liuyan` ADD `email` VARCHAR( 2 ) NOT NULL ;
#在后面增加了两个字段,至于这个 ` 符号,我查了资料,是mysql特有的,不加也没有关系的 ,SQL里面不用这个符号的
复制代码 好了,现在我就修改了数据表
然后,因为增加了用户要填写的数据,所以主页也加了几个表单,现在我把 body 标签里面的代码贴出来<body>
<form action="jieshou.php" method="POST">
姓名:<input type="text" name="user_name"/><br/>
<input type="radio" name="sex" value="1" checked="check" />
男
<input type="radio" name="sex" value="2" />
女
<br/>
主页:<input type="text" name="user_home"/><br/>
EMAIL:<input type="text" name="user_email"/><br/>
信息内容:<br/>
<textarea name="user_content" cols="40" rows="8"></textarea>
<br/>
<input type="submit" name="btn_ok" value="提交"/>
</form>
复制代码 汗......... 刚刚提交的时候出现了问题.,...害得好多注释没有了...我疯调了
好了,现在按照流程,因为 ,所以,我们要改一下 jieshou.php 这个页面了 这次这个页面加了比较多的东西,看代码:)
<?php
/////////////////////////////////////////////////////////////////链接数据库
include_once('config.inc'); //引入数据库参数
$con = mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME,$con);////// 上面这一段是链接数据库和选择数据库,大家都应该很熟练了吧
/////// 其中,我发现一个问题,就是 config.inc 这个文件的后缀名, 不能为 .inc ,因为我试过了, 这个后缀名的文件可以在浏览器
/////// 直接打开,能看到里面的变量数据, 如果改成 config.inc.php ,就没有问题,也就安全多了,呵呵,这里我就不改了
$query = "INSERT INTO my_liuyan (name,sex,content,ltime,homepage,email)";
$query.= "VALUES('$user_name','$user_sex','$user_content','$creat_time','$user_home','$user_email')";
////// 然后,上面这一句是建立查询语句,还没有查询哦 , INSER INTO 就是插入数据的语法,大家也可以查一下,
////// 在这里我建议大家,如果有碰到看不懂的语句,千万不要PASS,而是要查资料,利用搜索引擎,或者百度,或者google都可以
////// 这样我感觉就进步得快!
////echo $query; /// 这一句是我测试SQL 语法是否 赋给了 变量,调试程序中用的,测试通过我就把他注释掉了
//echo mysql_errno(); //同样,这一句是返回 mysql错误的代号,No嘛,如果没有错误就是0.如果有错,就会出现不为0的数字
$reslt = mysql_query($query); //向数据库中执行SQL语句,具体的就是插入语句
if($reslt) echo '数据库插入成功'; //如果成功,就写成功,测试通过也可以屏蔽
$close = mysql_close($con);
///最后当然是关闭链接,不过我看资料,说是这一页如果关了,那也会自动关闭和数据库的链接的
/// 但是前提是用了 mysql_connect 这个函数,而不是用永久链接那个函数(函数名字我忘了)
/// 查了一下 是这个: mysql_pconnect ,多了一个P ,那样的话,就不会自动断开链接了
?>
复制代码 呵呵,插入的终于说完了现在,要来修改 现实留言的 页面 了 ,就是 chaxun.php 这个页面废话不说,代码贴出,思路在注解里面
<?php
//测试查询数据库
include_once('config.inc');
$con = mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME,$con);
$query = "select * from my_liuyan ORDER BY lid DESC ";
$reslt = mysql_query($query);
if($reslt) echo '查询成功<br/>';
//下面这个改得挺多的,就是增加了表格,让显示页面更加整齐一点
while ($row = mysql_fetch_row($reslt))
//这是 mysql_fetch_row 这个函数的作用了
// 也就是他的指针会自动往下移动的
// 听别人说用 foreach 效率更好,但是我还是有点不懂,所以就先用这个了
//大家注意看,我在html里面 把 " 用 \" 代替,就是不让"在php中起作用
{
echo "<table width=\"100%\" border=\"1\">
<tr>
<td width=\"24%\">(ID:$row[0]) 姓名:$row[1]</td> //ID:$row[0] ,因为lid的字段是表中的第一个,所以$row[0]就是 lid 里面的值
<td width=\"50%\">主页:$row[5]</td> // 这几行都是这个道理
<td width=\"7%\">性别:$row[2]</td>
<td width=\"19%\">时间:$row[4]</td>
</tr>
<tr>
<td colspan=\"4\">$row[3] //这是内容,大家就可以看出来在表中,这是第四个字段了
<br/>
////下面是我新增的内容了哦
<a href=\"chang.php?id=$row[0]\">修改</a> <a href=\"del.php?id=$row[0]\">删除</a>
// 首先, 这个 <a href=\"chang.php?id=$row[0]\">修改</a> 是一个修改的链接 , 点击了会转到
//chang.php?id=$row[0] 这个页面 ,这里 $row[0] ,在编译时,会自动转成 要修改留言的 id
//呵呵,到这个时候,我终于明白了用 id 的好处了 . 这个 ?id=$row[0] 就是传输参数的意思
//在 PHP4.3 之后,就可以用 $_GET['id'] 来获得
// 然后, <a href=\"del.php?id=$row[0]\">删除</a> ,也是这个道理
///////
</td>
</tr>
</table>";
}
mysql_close($con);
?>
复制代码 好了,按照流程 这时候应该 要 建立 连个文件了
因为主页里面多了 chang.php 和 del.php
所以,我们要新建一个 chang.php , del.php 这里,我就先新建一个 del.php
好了看代码,同样,思路我也全写在注释里
刚刚提交了一下,发现有敏感字符,回到页面,编辑器变成可见的了,里面全乱了,疯了,注释能找多少就算多少了
:')
这里,我说一下简单的流程. 如果点击了修改这个链接,那么就会显示出原来的留言内容
然后,用户修改了内容,再点击提交,这时候,我们就要用修改数据库的内容了,
而修改数据库的内容,应该交给另一个页面来完成现在,
先把 chang.php 的代码贴出来
<?php
include_once('config.inc');
$con = mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME,$con);
$id = $_GET['id']; //得到页面传输的id参数
//echo $id; //测试用
$query = "select * from my_liuyan where lid='$id' ";
$reslt = mysql_query($query);
//if($query) echo '查询成功<br/>';
$row = mysql_fetch_row($reslt); //得到查询结果,这里不用while了 ,因为只查询一条留言,所以也就不用循环了
/////////// 下面现实的内容跟 index.htm 中的差不多,就是有一点不同 : 表单里面的默认值是有的,而且是原来留言的内容
///// 一般是在 value 里面
echo "
<form action=\"changed.php?id=$id\" method=\"POST\">
// 注意看,这里 action=\"changed.php?id=$id\ 修改的任务交给了 changed.php 这个页面去执行,然后也传递 id
姓名:<input type=\"text\" name=\"user_name\" value=\"$row[1]\"/><br/>";
//////// 注意了没有 value=\"$row[1]\" 这里的 $row[1] 就是名字这个字段的内容,这里放在 value 后面
//// 就表示页面一开始,里面就默认有的文字
////////////////////////////////////////////////// 这个方框里面的代码是为了显示默认的男女现实框而做的逻辑判断
/////////// 因为 radio 没有预设值,只能有 checked 这东西,所以不能象 value 那样用参数要动态变化
if ($row[2] == 1){
echo "<input type=\"radio\" name=\"sex\" value=\"1\" checked=\"check\" />
男
<input type=\"radio\" name=\"sex\" value=\"2\" />
女";
}else {
echo "<input type=\"radio\" name=\"sex\" value=\"1\" />
男
<input type=\"radio\" name=\"sex\" value=\"2\" checked=\"check\"/>
女";
}
///////////////////////////////////////////////////////////////////////////////////////
//////// 下面的这段就跟主页一样了 ,
echo "<br/>
主页:<input type=\"text\" name=\"user_home\" value=\"$row[5]\"/><br/>
EMAIL:<input type=\"text\" name=\"user_email\" value=\"$row[6]\"/><br/>
信息内容:<br/>
<textarea name=\"user_content\" cols=\"40\" rows=\"8\">$row[3]
</textarea>
<br/>
<input type=\"submit\" name=\"btn_ok\" value=\"提交\"/>
</form>"
;
?>
复制代码 接下来,就是最后一步了哦就是 changed.php 这个页面了,实现修改的页面代码贴上
<?php
//检查页面请求是否合法
$check = $_POST['btn_ok'];
if ($check != '提交')
{
echo "请求不合法!";
exit();
}
/////////////////////////////
////接受传递数据
$id = $_GET['id'];
$user_name = $_POST['user_name']; //得到用户名
$user_content = $_POST['user_content']; //得到留言内容
$creat_time = date(y.'年'.m.'月'.d.'日'.h.':'.i.':'.s); //得到提交留言日期
$user_home = $_POST['user_home'];
$user_email = $_POST['user_email'];
$user_sex = $_POST['sex']==1 ? '男' : '女';
//echo $id.$user_content.$user_sex; //测试用的
//测试查询数据库
include_once('config.inc');
$con = mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME,$con);
$query = " UPDATE my_liuyan SET name='$user_name',sex='$user_sex',
content='$user_content',homepage='$user_home',email='$user_email'
WHERE lid='$id' ";
/////// 这个 UPDATE my_liuyan SET 就是更新的语法了,后面就是加上字段的赋值
//////// 最后 WHERE lid='$id' 限定了只能在指定的 一行中修改
$reslt = mysql_query($query);
if($reslt) echo '修改成功!<br/>';
mysql_close($con);
?>
复制代码 呵呵.终于好了,好累啊,
不过我有一个问题,希望高手给出解决方案
这里的 del.php ,我想高手已经看到了严重的要求漏洞了吧
因为他只以来与 用浏览器来传输 数值 ,所以如果用户直接在 浏览器改变一下id 的值,
那就可以任意删除留言啦
目前我想出一种方法,就是用POST 的 SUBMIT 来 实现检验
可是,还没有没有别的方法,请高手给出思路
我知道程序还有很多不完善的地方,呵呵,希望大家提出来,共同进步,毕竟,这才是我第二次写的程序.
呵呵,打得好辛苦啊,继续学习ing :)
[ 本帖最后由 njuptsoz 于 2007-8-8 02:21 编辑 ] |
|