PHP项目经验总结一

学习、编写PHP一个月的时间,在项目中使用PHP,结合JS实现了一些功能。下面我将一一讲述在项目中遇到的一些比较棘手的问题和我的解决方法:

案例一:动态实现机房设备定位效果。

详细描述:首先我有一张3D的机房效果图,然后我从数据库里读取机房设备,然后加载在页面中(比如:未定义坐标的列表中,既3D效果图之外)。用户可以用鼠标对这些设备进行拖动,拖进3D效果图之内的设备,记录其坐标位置,然后点击保存按钮,保存进数据库。

我在实现这个功能的时候,需要设计两个PHP页面,一个页面A用来进行编辑保存拖动的设备坐标,另外一个页面B用来进行展示已保存的左边的设备。

先说页面A:

1.首先要实现拖动效果,于是我在网上找到一个如何实现拖动效果的JS,并对其进行了修改(下面红色部分为我修改的部分)。JS部分代码如下:

Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

var iMouseDown = false;

var dragObject = null;

var curTarget = null;

function makeDraggable(item,item2,item3){

} if(!item) return; item.onmouseup = function(ev){ } item.onmousedown = function(ev){ } dragObject = this; mouseOffset = getMouseOffset(this, ev); return false; dragObject = this; item2.value=dragObject.style.top; item3.value=dragObject.style.left;

function getMouseOffset(target, ev){

ev = ev || window.event;

var docPos = getPosition(target);

var mousePos = mouseCoords(ev);

return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};

}

function getPosition(e){

var left = 0; var top = 0;

while (e.offsetParent){ }

left += e.offsetLeft +

top += e.offsetTop +

//alert(left+","+top);

return {x:left, y:top}; left += e.offsetLeft + top += e.offsetTop + e = e.offsetParent; (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0); (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

} (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0); (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

function mouseCoords(ev){

} if(ev.pageX || ev.pageY){ } return { }; x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, y:ev.clientY + document.body.scrollTop - document.body.clientTop return {x:ev.pageX, y:ev.pageY};

function mouseDown(ev){

ev = ev || window.event; var target = ev.target || ev.srcElement;

if(target.onmousedown || target.getAttribute('DragObj')){

} return false;

}

function mouseUp(ev){

dragObject = null;

iMouseDown = false;

}

function mouseMove(ev){

ev = ev || window.event;

/*

We are setting target to whatever item the mouse is currently on

Firefox uses event.target here, MSIE uses event.srcElement

*/

var target = ev.target || ev.srcElement;

var mousePos = mouseCoords(ev);

if(dragObject){

}

// track the current mouse state so we can compare against it next time

lMouseState = iMouseDown;

// this prevents items on the page from being highlighted while dragging

if(curTarget || dragObject) return false; dragObject.style.position = 'absolute'; dragObject.style.top = mousePos.y - mouseOffset.y; dragObject.style.left = mousePos.x - mouseOffset.x;

}

document.onmousemove = mouseMove;

document.onmousedown = mouseDown;

document.onmouseup = mouseUp;

function DragImage(data) {

}

下面是页面调用代码:

<body onload=DragImage('".$sDevId."');> var ss = data; var arr = new Array(); arr = ss.split("#"); var len = arr.length; for(var i = 0 ; i < len ; i++ ) { var ImgId = "DragImage" + arr[i]; var MousePosiX = "MouseXPosition" + arr[i]; var MousePosiY = "MouseYPosition" + arr[i]; makeDraggable(document.getElementById(ImgId),document.getElementById(MousePos} iX),document.getElementById(MousePosiY));

$sDevId是我用来传递页面上加载的设备ID,而且是用“#”符号拼接而成的,比如1#2#3#4#5...

为什么要拼接这些设备的ID呢?

因为我需要在JS脚本中获得页面中名称一样id的对象。

比如JS代码中的:

var ImgId = "DragImage" + arr[i];

在页面代码中也有一样的id与其对应:

$DragImageId = "DragImage".$i;

<div id=".$DragImageId." >

下面我需要将JS中获取到的坐标值返回到PHP中,作为变量,方便我来进行下一步的保存。于是我在JS代码中添加了如下代码:原理同上,也是为了id一一对应

var MousePosiX = "MouseXPosition" + arr[i];

var MousePosiY = "MouseYPosition" + arr[i];

页面代码:

$MouseX = "MouseXPosition".$i;

$MouseY = "MouseYPosition".$i;

<input style='display:none;' type='text' name='".$DeviceId."' value='".$i."' /> <input style='display:none;' id='".$MouseX."' style='width:60px' name='".$MouseX."'> <input style='display:none;' id='".$MouseY."' style='width:60px' name='".$MouseY."'>

所以这样就实现了页面上设备的拖动效果,并且将设备的坐标显示在隐藏的文本框内。下面就只用点击保存按钮,将id,坐标X,坐标Y保存进数据库即可。

下面讲讲在页面B中,如何加载这些有坐标的设备:

读取数据库中保存了的设备id,坐标X,坐标Y,然后在页面中赋值即可

页面代码:

<div style='position:absolute; top:$坐标X;left:$坐标Y;'>

这样便实现了动态拖动,动态加载的功能。

之前为PHP与JS之间数据传递的问题弄得很头疼,PHP的变量值传进JS简单,但从JS传回PHP很麻烦。查了些资料,居然要用刷新页面的方法来获取JS传递回来的数据。。。蛋疼~~ 通过这个案例,也发现了JS与PHP互相传递数据的方法。也实现了动态拖动定位的功能,能让用户自由的拖拽,没事拖着玩哈~~~

 

第二篇:PHP开发大型项目经验总结

PHP开发大型项目的一点经验

文章摘自我赢职场php在线教育

一、变量

最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候。变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆。变量的命名尽量规范化,不要与PHP中的关键字相冲突。

二、函数

PHP自带了很多函数,这给我们程序的编写带来了很多的方便。当然,在大型程序中我们往往自己要定义许多个函数,几十甚至上百个。当然在使用了类的程序中就不叫函数了,就应该叫方法,这里暂且不谈类的使用方法。函数多了,难免就会搞混了。有什么方法可以解决这个问题呢?可以参照上面变量的使用方法一样,同样的,我们也可以把自己定义的函数名全都放在一个数组中。这样我们在使用的过程中可以直接在数组随时检查函数是否有无重复的定义。如果发现重复的现象,马上变可以改过来。提高了程序编写的速度。函数的使用还有一点要注意的是全局变量,虽然这是一个小问题,但却不容忽视,要不然当某个变量千呼万呼出不来的时候,呵呵。这时看看该变量是否在该函数中已经申明成了全局变量。

三、程序的注释

程序的注释是很重要的,不管是C还是JAVA,程序的注释往往可以体现出程序员的良好编程风格。无论是对于它人还是自己对大有好处,当然我们这里说的是大型项目的开发,团体合作精神是很重要的。当你的程序写出来别人都很难看懂那还怎么谈团体合作精神啊。当然如果这个大型项目是你一个人开发的那就另当别论了,或者是你时间紧迫,来不及写注释。不过一般来说这种情况是很少的。除非真的是非常时刻。一个优秀的程序员绝对会为他写的每个程序加注释,哪怕是给自己看的。

四、采用何种文本编辑软件写源程序

这其实也没一定的规定,只要自己喜欢就行了。我比较喜欢PHPEDIT,也许是用惯了,现在感觉一离开PHPEDIT写PHP就没感觉,初学PHP的时候用NOTEPAD写,因为程序比较简单。所以用NOTEPAD应付下就行了,对于有几百行的程序来讲,用NOTEPAD显然是不合适的。用PHPEDIT工作效率会提高几倍,哪怕你从来没用过。

五、数据库的设计

数据库的设计在开发大型项目中是很重要的一点,关系到整个项目开发的成败。具体也就不多说了。大家可以在自己的实践中积累经验,慢慢去体会。总之在数据库的设计中最好应该一开始就应该确定下来。虽然可以在开发的过程中去改变已经设计好的数据库结构,但这对于整个项目的开发效率来讲将大打折扣,有谁会愿意时不时的去改数据库的结构呢?

六、类的使用

类的使用主要是实现了代码的重复使用,以降低项目开发的时间,程序员的工作量也会减少许多。只要可以使用类的地方应当尽量使用类,使用类应该养成一个良好的习惯,这样才可以在真正使用类的地方得心应手。可以说一个大型PHP项目就是由类组成的。个中的滋味还是自己慢慢体会吧。

总之,PHP在线学习平台我赢职场提醒大家在开发大型PHP项目的时候,要预算好时间。

特别要小心客户在半途来个回马枪,那就功亏一篑了。

 

第三篇:稿件管理系统测试项目经验总结

稿件管理发布系统测试项目经验总结

经过近两周时间,稿件管理发布系统测试工作基本完成了,收获很多,但还有很多不足,希望在之后的学习中以此为借鉴,完善测试过程。 收获:

(一)了解了做一个项目的大概步骤;要想做一个好的项目,测试要贯穿整个开发过程,在做项目之前要做好充分的准备,如环境配置、文档准备、资料收集等。在一个项目中至少要有以下几个文档:需求分析报告、测试设计报告、测试用例设计报告、bug报告及测试报告。对一个测试人员来说,测试设计报告是一个前提,首先要保证测试设计合理,并且内容齐全。这样才能更直接、准确地进入下一项目步骤。测试用例是整个项目的重点,在一个项目中测试用例必须经过三方面的评审,评审通过才能执行。一是自我检查,二是测试人员互相评审,三是项目经理评审。一个好的测试用例要覆盖全测试需求,测试用例的设计要合理、正规。测试用例不在于多,要在于覆盖全,测试用例的多少在一定程度上并不代表质量的高低,所以说,测试人员对于测试用例的设计一定要细心且全面。接下来是bug记录,在bug记录中一定要详细给出测试的重现步骤。一个bug报告中所包含的标题有:缺陷ID、缺陷标题、缺陷描述、缺陷的重现步骤、缺陷的严重级或者优先级、测试模块、缺陷提交人、缺陷的版本及证明是缺陷的视频或者截图等。最后是测试报告,在测试报告中最突出的问题就是测试缺陷的分析,测试用例中缺陷有多少,通过率是多少,有哪些建设性的意见,及最终得测试结果,是通过还是没通过。

(二)了解了如何写测试计划、测试用例、bug报告、测试报告等;

1、测试计划的内容包括引言、测试背景、测试组织结构、测试策略、测试计划、测试环境及测试总结。在整个测试计划中最重要是测试的详细计划,当然在测试之前,要评估好测试的工作量分配及进度安排,人员规划等,测试计划的书写要有一定得逻辑,要能够真实反应测试项目。测试进度的安排要合理。

2、测试用例报告是一个项目中的重点,描写一个测试用例包括测试需求ID、测试需求标题、用例ID、用例步骤、期望结果、测试结果、测试人员、所属模块、严重级、备注等。在测试用例报告中重点在于测试步骤

要尽可能地详细,测试需求、标题等要描述清楚。

3、Bug报告也是测试项目中的重点,也是最让人有成就感的报告,bug报告中缺陷要描述清楚、正确评估缺陷的严重级别。

4、测试报告是一个项目的总结性报告,测试报告主要包括引言、测试设计简介、测试结果分析、测试结论及建议。

(三)了解了如何有条理地书写测试用例;首先测试用例要覆盖需求,根据项目的需求分析或者软件,设计测试用例。其次,写复杂的测试用例要掌握一些方法。例如决策表法,要先把影响因素和测试用例的个数做成表格形式,以便于详细分析设置用例的多少。在设计测试用例的过程中最常用的是等价类划分法,基本上每个测试用例的设计都要考虑正反两个方面。在这划分过程中遵守着尽量覆盖尚未覆盖的有效等价类,仅覆盖一个尚未覆盖的无效等价类原则。

不足:

1) 需求分解不彻底;在本次项目执行过程中,我们发现在需求手册中很多地方描述很模糊或者很简单,不能很好地向设计者呈现要设计软件的细节操作步骤,从而,对于软件测试人员来说就很难辨别测试结果是否符合要求,换句话来说,如果一个测试人员想把需求描写的很模糊的地方测试清楚就必须和客户不停的交流、沟通,在一定程度上影响项目的进度。以上是从客户需求角度来说的。对于客户只提供软件而没有需求的情况下,项目组人员就要人怎分析测试需求,详细分解。

2) 测试用例覆盖不了测试需求;一开始感觉设计的测试用例可以覆盖需求了,但是执行后才发现很多细节部分没有写全,例如稿件管理发布系统用谷歌浏览器打开就会出现很多错误,稿件管理系统在浏览器的应用上存在一定得兼容性问题,等等。针对这种情况,我们需要在执行之前,详细地了解用户需求及真实软件的运用效果。两者相结合,设计更全面的用例。

3) 对bug的辨识度还有待提高;在测试用例执行时,会发现很多细节性的问题,不容易判断它是不是一个bug。例如稿件管理发布系统中高级查询里的版本查询,虽然说它支持的是模糊查询,但是输入很多"."时查询的结果仍然是正确的,如果把它归类为非法版本号,非法版本号输入后查询结果应该是查不到,而不是查询到正确的结果。在一开始我将其定义为bug,但是和其他人讨论之后,觉得可以不是bug,

第二天又去考虑觉得还是bug。虽然说各人的判断标准不同,但是总该有一个统一的标准。想这类问题还要在以后的项目实行过程中不断总结经验。

4) 测试执行方法及步骤还存在很大的改善空间;在测试用例设计中不只

是功能测试,它还包括性能测试、界面测试、安全测试等,对于这些测试,测试用例设计时步骤不是很详细,操作时就存在一定得困难。例如:性能测试中系统支持20人并发访问系统,这就要求我们要尽量组织20人去集体测试,怎么去组织,要做哪些事情,诸如此类准备工作一定要详细准备。

5) 很多业务知识还不了解;这个问题在本次项目中体现不明显。这是做

软件测试学长给的意见。要做好一个项目,必须地相应项目的业务流程有一定的了解。

6) 项目中组员间的交流不够;虽然很多时候大家都提出互相检查用例及

bug记录等,但在实际过程中并没有切实实行。交流是测试人员必备的沟通技巧,在项目进行过程中遇到问题要互相沟通,以便更好地解决问题。

7) 对部分基础知识的理解不够透彻;在写测试用例时,我们采取的步骤

是先把可能考虑到得测试写全,但在写测试用例时,就发现对一些测试的概念记得不清楚甚至混淆。这就说明我们对基础问题的认识还不够深。因此,在之后的学习过程中我们要不端去记忆一些概念,或者在做项目过程中不断地发现相应的问题然后去解决。反复记忆,出现问题才能铭记于心。

8) 报告书写技能有待提高;测试人员做项目时,很多问题的结果都是以

报告形式,我们要不断练习自己的公文写作能力,熟悉应用office办公软件。

9) 数据库、服务器等其他知识了解太少;在测试执行中,遇到一些bug,

不清楚其出现的原因,知识面太狭隘。在之后的过程中要多了解与测试相关的知识。

总之,这两个星期来,收获颇多,问题多多,革命尚未成功,同志仍需努力!我们要通过各种渠道主动去获取知识,多交流,多沟通,共同收获!

相关推荐