【2010/2/4】
1:
放了6个文件在c盘下(php.ini,php5ts.dll,libmysql.dll ,php_gd2.dll,php_mysql.dll,php_mbstring.dll ),一个在windows下,另五个在windows/system32下
2:
配置了path,c:/php和c:/php/ext,(不过好象没什么作用)
3:
命令:httpd.exe -w -n "Apache2" -k start 来查看是哪一行的错误信息.
总结:到现在为止,整了一天,装了三次系统的麻烦终于亲身证明了,
这个罪魁祸首产生的原因就是:
httpd.exe: Syntax error on line 67 of C:/Program Files/Apache Software Foundation/Apache2.2/conf/httpd.conf: Cannot load C:/php/php5apache2.dll into server: /xd5/xd2/xb2/xbb/xb5/xbd/xd6/xb8/xb6/xa8/xb
5/xc4/xc4/xa3/xbf/xe9/xa1/xa3
php版本和apache版本不一致,还是官网上的话apache2.2.x的必须和php5.2.0及以后版本联合使用.
但是公司服务器竟然要求是apache2.2.x + php5.1.x!
(第二天补充上的,上网搜索了一些资料,这个组合版本确实有问题,不过也是可以通过打补丁来解决的,解决的方法是:
下载 这个文件 并解压.共有三个文件.
vcredist_x86.exe
php5apache2.dll
httpd.exe.manifest
好,开始
1.将 php5apache2.dll 覆盖掉你原来PHP目录下的 php5apache2.dll 文件.
2.将 httpd.exe.manifest 文件复制到你的apache安装目录下的bin文件夹下.
3.双击运行vcredist_x86.exe安装.(如果您的系统里已安装了 .NET framework 2.就可以省掉这一步)
做完这三步以后,记得把php5.1.x的那6个文件替换掉以前的php5.2.x的文件,不然会出现httpd.exe内部错误,什么内存不能读的问题。
)
4:
让php给客户返回错误信息:
在php.ini中修改:
display-errors=on
5:
a:HTTP 500 服务器内部错误
b:Fatal error: Call to undefined function mysql_connect() in C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/DatabaseTool.php on line 13
解决方案:
在php.ini中:
extension=php_mysql.dll,去掉该行前面的分号,然后重启apache.
6:
不让客户端显示notice信息
a:error_reporting = E_ALL & ~E_NOTICE,去掉前面的;
b:error_reporting = E_ALL,在这一行前面加上;保存,重启apache
7:
Fatal error: Call to undefined function socket_create()
将php.ini里的;extension=php_sockets.dll前面的;号去掉
8:
zend optimizer对php进行优化:
这个我用的是ZendOptimizer3.3.3Windowsi386,傻瓜式安装,就是让找到php.ini和http.conf的位置,安装完以后在php.ini里
添加了两句话:
[Zend]
zend_extension_manager.optimizer_ts="C:/Program Files/Zend/ZendOptimizer-3.3.0/lib/Optimizer-3.3.0"
zend_extension_ts="C:/Program Files/Zend/ZendOptimizer-3.3.0/lib/ZendExtensionManager.dll"
结果以测试,围棋游戏的速度果然快了很多,最少快了一倍
【2010/2/5】
9:
log4php:
这个下载的文件有bug,多了一个“)”号,
a:在项目底下新建一个log4php.properties文件,内容是:
log4php.rootLogger=DEBUG, A1
log4php.appender.A1=LoggerAppenderRollingFile
log4php.appender.A1.file=webdisk.log
log4php.appender.A1.layout=LoggerLayoutTTCC
log4php.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %C{1}:%M %p %m%n
log4php.appender.A1.MaxFileSize=1024
log4php.appender.A1.MaxBackupIndex=3
然后在文件里这样使用:
require_once ('log4php/LoggerManager.php');
$str = "here is test string!";
echo "这里是PHP的输出, 与log4php无关哟!<br>";
$logger = LoggerManager::getLogger('test');
if ("" != $str) {
$logger->debug("str的值不为空! 它的值为: " . $str . "<br>");
}
if (strlen($str) > 4) {
$logger->debug("str的长度大于4!" . "<br>");
}
10:zend debugger安装:
下载zend debugger,这个还挺难下载的。好不容易下载下来了,最后也没配置好。
11:乱码问题:
这个问题处理了两天,刚才一瞬间遇到个提示,才终于发现了。
异常现象是:客户端从android发过来一个中文名称,我写的php服务器得到这个值以后再向数据库插入的时候
插到数据库中的就是乱码;然而当我在我机器上的浏览器地址栏里输入中文,日语等时候,向数据库插入的都是
正常的;甚至当从局域网的其他一台机器的浏览器上访问,插入数据库也是正常的。
只有当中文是从android客户端发过来的时候插入数据库才是乱码,这两天有很大一部分都是在想在这个中文传来之后
,插入数据库库之前给debug看一下,但是上网搜索了很多php debug的资料,也没看配置好。甚至我们都想这个乱码
问题解决不好的话,就只能用另一种解决方案了。
可是最终还是解决了,
原来我在php连接数据库的时候有如下几行代码:
public function __construct() {
$this->conn = mysql_connect ( "localhost", "root", "root" );
//sleepsleepsleepselect the 'ft3' database
mysql_select_db ( "weiqi_data", $this->conn );
mysql_query ( "SET NAMES 'gbk'" );
}
不经意间看见将name set为gbk了,改成 set name utf8,一试成功过了!!!
看来出错还是有原因的啊,这行代码是刚做项目就写的,做了这么长时间一直没问题,到项目快结束了,
原来发现错误躺在这里啊!
结论与经验:
要想防止乱码,就让所有(只要数据出先编码设置的地方都改成utf8),在排除这个乱码异常的时候我们也是
这么想的,我想数据库,表,字段,php.ini,apache 的http.conf都改成utf8了,怎么还是乱码,没想到还漏了
一出,就是php在和数据库连接的时候,通过gbk连接,不过现在也没有彻底的理解,为什么通过自己和他人机器
浏览器访问的时候都不乱码呢?还不懂,反正过了一道坎吧!
12:
set names utf8
这里的names不是指的数据库里的某一字段(我还以为是字段呢),是php写入mysql的编码方式。
13:
update deskinfo set player01='我告诉' where rid=3;
执行这句话的时候出错,上数据库里一查,发现player01这个字段的编码格式为latin1,改成utf8就好了。
14:
很灵异的,突然间向数据库中插入中文又不行了,仔细想想,从android手机客户端能用中文登陆以后,我只做了一个小改动
就是发现deskinfo表中的player01字段是latin1的,我给改成utf8了,明天看看是不是这个错误。
【2010/2/6】
1:
字符集:字母组合和编码组合
校对规则:如何通过字符的编码来比较字母
字符集和校对规则有4个级别的默认设置:服务器级,数据库级,表级和连接级
2:
用mysqlfront向数据库中插入中文可以正常显示,但是用mysql一查看显示的确是乱码;并且在mysqlfront下用insert
插入中文好用,但是在mysql下插入中文就报Incorrect string value for column的错。
3:
查看表创建语句
show create table test(表名);
更改表的charset:
alter table test convert to character set utf8;
4:
【a】:
表为utf8格式的:
要向mysql插入中文:
set names gbk,然后再插入中文,正确,插入日文也正确。
set names utf8,然后再插入中文,错误,插入日文也错误。
【b】:
表为gbk格式的:
要向mysql插入中文:
set names gbk,然后再插入中文,正确,插入日文也正确。
set names utf8,然后再插入中文,错误;插入日文错误。
【c】:
当表中还没有中文的时候,你可以使用【alter table test convert to character set latin1;】命令将该表转换为任意的
编码方式,比如greek,big5等;但是一旦表里有中文数据(或日文数据)的时候,你就只能在utf8和gbk之间转换编码。
当表为utf8的时候:
set names utf8:再select 一下,得到的将会是乱码;
set names gbk:再select 一下,得到的是正确的显示。
当表为gbk的时候:
set names utf8:再select 一下,得到的将会是乱码;
set names gbk:再select 一下,得到的是正确的显示。
【d】:
查看当前数据库连接状态
status;
查看mysql支持的编码:
show character set;
【e】:
还有一个疑问:
public function __construct() {
$this->conn = mysql_connect ( "localhost", "root", "root" );
//sleepsleepsleepselect the 'ft3' database
mysql_select_db ( "weiqi_data", $this->conn );
mysql_query ( "SET NAMES 'utf8'" );
}
a:当从android 客户端发过来的中文数据,就可以正常插入数据库。
b:而我从 php页面调用插入中文的函数,就根本插不进数据库,也不报任何错误。
function insertNewUser($player01, $country) {
$Query = "insert into test(player01,country) values('$player01','$country'); ";
mysql_query ( $Query, $this->conn );
}
<?php
header("content=text/html; charset=utf8");
include 'dao.php';
$dao = new Dao();
$dao -> insertNewUser('大威和小威', 'usa');
?>
c:在mysql命令行里,和在php当中(zend studio中)当使用set names utf8以后,再插入中文不是报错,就是插不进去,而
使用set names gbk,再插入中文就好使;
android客户端则正好相反,同样使用set names utf8,从android发过来的值缺可以插入到数据库中,而
使用set names gbk,再插入中文就插入部进去;。
5:
UTF8字符集的思想是不同Unicode字符采用变长字节序列编码:
· 基本拉丁字母、数字和标点符号使用一个字节。
· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。
· 韩语、中文和日本象形文字使用三个字节序列。
6:
总结:
a:
URL中的PathInfo和QueryString字符串的编码和解码是由浏览器和应用服务器的配置决定的,
我们的程序不能设置,不要期望用request.setCharacterEncoding()方法能设置URL中参数值解码时的字符集。
所以我们建议URL中不要使用中文等非ASCII字符,如果含有非ASCII字符的话要使用URLEncode编码一下,比如:
http://localhost:8080/example1/example/中国
正确的写法:
http://localhost:8080/example1/example/%E4%B8%AD%E5%9B%BD
并且我们建议URL中不要在PathInfo和QueryString同时使用非ASCII字符,比如
http://localhost:8080/example1/example/中国?name=中国
原因很简单:不同浏览器对URL中PathInfo和QueryString编码时采用的字符集不同,但应用服务器对URL通常会采用相同的字符集来解码。
b:
我们建议URL中的URL Encode编码的字符集和网页的contentType的字符集采用相同的字符集,这样程序的实现就很简单,不用做复杂的编码转换。
http://www.cnblogs.com/yencain/articles/1321386.html
7:
得到客户端IP:
$ip = $_SERVER["REMOTE_ADDR"];
8:
smarty模板:
php文件:php文件是被执行,被访问的文件,但是在php文件里只做赋值操作,然后php调用要显示的模板文件,浏览器显示
的是模板文件内容(固定的内容+php运行时才赋给的变量的值)。
模板文件:一般是.tpl,也可以是任意扩展名的(只要php调用的时候输入正确的参数即可),但是要放在templates目录下,
【2010/2/7】
1:
PHP 5.3.0中,将split()函数废弃,使用explode();
2:
今天看了php经典100例的一些,
发现php简单操作分为几大块:
a:操纵文件
b:操纵数组
c:操纵字符串
d:还有就是一些php自定义的保留关键字,可以输出一些很有用的信息,很强大,如PHP_OS,__FILE__等。
【2010/2/8】
1:
window下连接linux主机,使用putty,输入主机名称,端口号:22
2:
linux上启动ftp服务
/etc/init.d/vsftpd restart
3:
进入www目录
cd /var/www
4:
linux下启动mysql
/usr/local/mysql/bin/mysqld_safe --user=root &
连接mysql服务器
mysql -u root -p123456
在linux主机上导入mysql数据库:
a:将本地.sql文件上传到linux主机相关目录,如/var/www
b:进入/var/www目录
c:导入mysql文件:mysql -u root -p123456 < weiqi_data.sql
pwd:Linux中查看当前所在的目录
vim:编辑工具
whereis php:查找php出现的地方
重启apache
/usr/local/httpd/bin/apachectl restart
vim中查找:输入"/"
【2010/2/20】
1:
session_name()函数的用法:
$username="guest3";
if(isset($username)) {
session_name($username);
}
session_name('sss');//设置当前session的名字为sss
session_name('ddd');//设置当前session的名字为ddd
session_name('aaa');//设置当前session的名字为aaa
session_name('bbb');//设置当前session的名字为bbb
echo "您的名字为:".session_name('kkaf')."/n";//session_name()函数一旦和字符串连接起来以后,就是读取当前session_name()的值,
此时不管参数是什么,运行的结果都是bbb(即最近一次调用session_name()设置的值)
?>
2:
unsort函数的用法:
调用:
usort($e->employees, array($e, "byName")); //回调函数
$e = new EmployeeTracker(array(
array("Mckillop, Jeff", "Executive", 50),
array("Porter, Carl", "Manager", 45),
array("Marazzani, Rick", "Manager", 35),
array("Dibetta, Bob", "Programmer", 65),
array("Atkinson, Leon", "President", 100)));
function byName($left, $right)
{
return(strcmp($left[0],$right[0] ));
}
其中,unsort接受两个参数,第一个参数是要排序的数组(如$e,),第二个参数是要调用的排序的函数,如byName(这里byName函数的定义需要
两个参数,分别是left,right,但是在调用的时候并没有传递,则默认的left和right为数组$e中的两个元素,依据什么排序是由排序函数
中的关键字来决定的,关键字就是排序算法中返回正负所依据的字段,如byName函数中是通过name来判断正负的,则name就是关键字,这里
若left中的name(或关键字)大时返回正数,则数组按name(或关键字)值进行升序排列;
反之若left中的name(或关键字)小时返回正数,则数组按name(或关键字)值进行降序排列;)
【2010/2/21】
1:
firebug安上去以后,默认是禁用的,启用的方法是:控制台/启用
2:
jquery实现表单验证:
$(document).ready(function()
{
$('#msg').hide();
var options =
{
target: '#msg',
url: '<?php echo site_url("join/sendmail")?>',
beforeSubmit: function()
{
if($('#username').val()=='')
{
$('#msg').html("<span class=/"about_content_title/">[用户名字]不能为空!</span>");
$('#msg').show(1000);
$('#msg').hide(2000);
return false;
}
$('#msg').html("<img src='../images/loading.gif' /><span class=/"about_content_title/">正在保存资料,请稍候!</span>");
$('#msg').show(1000);
},
success: function()
{
$('#msg').html("<span class=/"about_content_title/">资料保存成功!</span>");
$('#msg').show(1000);
$('#myForm').resetForm();
$('#msg').hide(1000);
},
error: function()
{
alert(arguments[0] + " " + arguments[1]+" " +arguments[2]+" " +arguments[3] +arguments[4]);
}
};
$('#myForm').ajaxForm(options);
}
);
3:
php中的单例模式也是只在单独的一个页面上是单例的;一旦重新载入该页面的时候还是会重新实例化一个新的实例。
4:
<a href="<?php echo site_url("about") ?>">//实际地址是http://localhost/gps/index.php/about
【2010/2/22】
1:
php文件执行的两种方式:
a:通过ie浏览器执行,输入相应的地址
b:在path中配置好php.exe命令所在的位置,然后再cmd窗口里php socketServer.php即可.
2:
扫描所有端口:netstat -a(TIME_WAIT说明连接已经不存在,等一段时间以后,该行就会自动消失; FIN_WAIT2 连接已关闭,套接字等待远程方中止;ESTABLISHED表明连接正在建立)
扫描固定端口:netstat -a | find "63333".
3:
windows下关闭端口的方法:
a:重启电脑,这是本人22号之前一直用的方法。
b:今天看一同事给那整linux下关闭端口,先找出进程,kill掉,然后就oK了;自已也举一反三了一把,打开资源管理器,找到php.exe,kill掉,也好使。
看来windows和linux还真有些相同的地方啊。
【2010/2/23】
1:
socket_select函数,不知道是不是真正的多线程,在我 自己机器上一个人测试可以连26个,两个人一起连10个都连不了。
【2010/2/24】
1:
windows查看某个端口的使用情况
netstat -a | find "8869"
2:
linux下查看某个端口的使用情况
netstat -a | grep 8869
3:
linux下mysql驱动放在*/ext下
【2010/2/25】
1:
继承
父类中有的属性和方法(private除外),子类中都有,如父类中有一个protected的name属性,并且在父类的构造函数中有name="animal",
那么子类在实例化以后,每一个对象中都有一个name属性,且默认值为animal(因为子类在实例化的时候会调用父类的构造函数),但是可以
在子类的构造函数中修改name的值,如name="cat"。
假如父类中有一个函数
public void show()
{
System.out.println(Animal.this.name);
}
那么所有的子类实例中都有该函数,但是不同的子类在调用这个函数的时候,打印出来的值可能是不一样的,如cat.show()可能打印出来的是
cat,而dog.show()可能打印出来的是dog(因为不同子类实例中的name的属性值是不一样的)
【2010/2/26】
1:
php文件放在linux上以后,要想访问这些php文件,必须将这些php文件的权限最少设置为655
2:
css中控制页面显示(id,class,标签)
id:
#logo
{
}
class:
.logo{
}
标签:
td{
}
3:
任何时候都可以启动一个线程,只要你想;启动一个线程可以做你想做的事情,这个线程可以做的事情由这个线程可以访问的变量来决定。
【2010/3/1】
1:实现鼠标滑过连接时更改背景的效果
#navigation a:hover {
background: #7FCBFE;
color:#000000;
border:#0075BF solid:1
}
2:php在作图的时候遇到一个错误:
Warning: Cannot modify header information - headers already sent by
(output started at C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/weiqiadmin/testimage.php:9)
in C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/weiqiadmin/testimage.php on line 55
接着下面是一大堆乱码,
后来上网搜索了一下,说把php.ini里的
output_buffering 设置为on
然后重启apache,重启后发现,Warning是没有了,但也没有正常显示图片,而是出现了很多乱码。就是当php画图代码和html代码
混合在一起的时候,就会出现一大堆的乱七八糟代码,如果只有php画图代码,就可以正常画图。
要是想让php代码和html代码混合在一起运行,该怎么实现呢?
上网找了一会,看来有经验就是牛!如下:
12 楼hahawen(变态的大龄青年)回复于 2004-10-31 20:15:28 得分 70画图的程序要单独在一个页面里面,不能和其他的程序混在一起的
-------------aaaa.php----------
<?PHP
header("Content-type: image/gif");
$image=imagecreate(200,200);
$maroon=imagecolorallocate($image,100,0,0);
$white=imagecolorallocate($image,255,255,255);
imagefilledrectangle($image,0,0,200,200,$white);
imagerectangle($image,10,10,190,190,$maroon);
imagefilledrectangle($image,50,50,150,150,$maroon);
imagejpeg($image);
imagedestroy($image); ?>
--------------index.html----------------------------
下面是图片
<image src=aaaa.php>
上面是图片
<hr>
你运行index.html是不是看到图片了
Top
13 楼blackmouse2002(binbin)回复于 2004-10-31 20:22:02 得分 0 =====
Top
14 楼blackmouse2002(binbin)回复于 2004-10-31 20:26:53 得分 0 to hahawen(变态的大龄青年)
有经验就是有经验一语道破,入木三分呀!
3:
php作图的时候,如果出现的图片是一个叉号显示,就把文件的<?php>顶到最头就可以了。
4:
php在向图片里写文字的时候,需要加载字体库文件,在window下字体库文件是在c:/windows/fonts目录下;而在linux中字库是在
/usr/share/fonts/default/Type1目录下
5:
在<table>元素里的<tr></tr>上可以直接添加超链接,这个以前没遇到过,虽然实现起来很简单,但是也挺有用的!
如下:
<tr align="center">
<a href="testimage.html">
<td width="64" height="15" valign="top">1</td>
<td width="123" valign="top">AAA </td>
<td>2010</td>
<td>256</td>
</a>
</tr>
【2010/3/2】
1:
php中两个字符串函数:
字符与ascII码之间的转换,如下:
chr(65)输出A
ord("A")输出65
2:
scp
linux中有一条这个命令,cp是在自己的电脑上来回拷贝,scp可以实现网络拷贝,在不同的机器之间进行拷贝。
3:
超链接中传递的参数,接受页面用$_GET来获取。
php传递参数的方式:
<a href="nextstep.php?stepid=1"></a> 注意:?stepid=1 不是$stepid=1;
获取的时候:
$info = $_GET['info'];
4:
a:
在文件里写js代码:
<script type="text/javascript">
function toUrl()
{
alert("this is toUrl functiion;");
}
</script>
页面引用:<img src="images/xn3.png" οnclick="javascript:toUrl()"/>
b:
将js文件单独的写入一个页面:
新建一个文件:myown.js
在文件里直接写函数:
function toUrl()
{
alert("this is toUrl functiion;");
}
在其他页面引用这个js文件:
<script src="js/myown.js"></script>
5:
php页面转向
//页面转向,转到db/testdb.php
header("Location:db/testdb.php?info='$info'");
6:
页面布局设计中,如果用到多个frame,则指定超链接的时候,可以通过target属性来确定请求的页面在哪个frame上进行显示,
当frame有重名的时候,可能会覆盖,导致请求的页面没有在期望的frame上显示。
【2010/3/3】
1:
在做socket服务器的时候,需要判断客户端是否已经退出(因为网络断线等原因),因为客户端一般设计的时候都会在断网一段时间以后进行重新连接,
当重新连接的时候服务器端要能够判断出来这个客户端是第一次连接的,还是断网后连接的。如果是第一次连接的话,比较好处理;但如果是断网后再
连接的话,服务器要把第一次连接的数据再赋值给这次的重新连接,以便客户端可以继续断网之前的操作。
这个实现的方案如下:
a:在服务器端声明一个集合变量,保存每个客户端连接的信息。
b:让客户端发送心跳包,服务器端用//socket.setSoTimeout(5000),这句代码表示如果服务器端在5秒之内没有
//从客户端接受任何数据的话,就会抛出一个异常,然后接着在异常处理中
//服务器端再对相应的数据进行处理,这句话就要求客户端程序一直向服务
//器端发送心跳包.
2:
php中做权限验证,验证客户是否登录,php中不向java中有过滤器的东西,但可以这么实现
先写一个permission.php页面:
<?php
session_start();
//$_SESSION['username']只有在登陆页面完成以后,也即是在judgePermission.php里才会设置,
//所以当网站其他的页面包含本页面以后,如果谁再向绕过login.php直接访问网站其他的页面,
//肯定就会让其重新登陆。
if($_SESSION['username'] == "")
{
echo "<script>alert('对不起,您还没有登录,请先登录');window.location.replace('login.php')</script>";
}
?>
给$_SESSION['username']赋值的代码:
session_start();
//从登录页面得到username的值
$username = $_GET['username'];
//将登录输入的用户名保存到session里边去,键是$_SESSION['username']
$_SESSION['username'] = $username;
然后再需要有权限才能访问的php页面中加入这句话:
<?php
require_once('permission.php');
?>
即可。
3:
页面定时转向:
echo " <SCRIPT>setTimeout(/"location.href='login.php'/",'5000')</SCRIPT> 您已经安全退出</A>";
4:
php中处理cookie是全自动的。
客户端在访问php页面的时候,会把自己的cookie信息放在http协议中传送给服务器端保存在$_COOKIE变量中。
服务器端通过代码可以查看客户端的cookie中都存放了哪些信息:print_r($_COOKIE); echo $_COOKIE['cookie1']//其中cookie1
是服务器端存放在客户端信息的逐渐,如果该键还没设置的话,就打印出空值。
服务器向客户端存放cookie用setcookie函数来实现。
5:
sql注入:输入用户名和密码的时候可以随便输入一个用户名字,输密码的时候输入' or '1'='1,这样就可以进入那些没有防止sql注入的网站了。
防止sql注入可以用php中的这个函数mysql_real_escape_string(),
如下:
a: 查询语句是:$Query = "select * from admin where username = ' $username' and password='$password';";
当$password = '/' or /'1/' = /'1 ';时查询语句变成了下面:
select count(*) as ctr from users where username='foo' and password='' or '1'='1' limit 1",即可以对网站进行sql注入攻击
b:
查询语句是:$Query = "select * from admin where username = ' mysql_real_escape_string($username)'
and password='mysql_real_escape_string($password)';";
当$password = '/' or /'1/' = /'1 ';时查询语句变成了下面:
select count(*) as ctr from users where username='foo' and password='/' or /'1/'=/'1' limit 1",就不能对网站进行sql注入攻击了
不过在我用的php版本中,好像自带了就有这个防止sql注入的功能,因为在password文本框里输入' or '1'='1的时候,在再判断页面去password的值的
时候,就已经改成/' or /'1/' = /'1了。
php 中true 和 1是相等的,因为要用到数据库,所以一般在php项目中新建一个DatabaseTool.php,会有很多页面都需要将DatabaseTool.php
文件给引入进来,所以要对这个进行一些处理。
6:
php中通过md5函数来加密,这个函数是不可逆的,但相同的字符串经过md5加密以后,得到的值都是一样的,所以用户下次登录的时候如果密码对了就可以
正常登录。
【2010/3/4】
1:
页面定时刷新:<meta http-equiv="Refresh" content="10">每隔10秒页面刷新一次。
php定时查询数据库,判断ip访问地,围棋session存储
2:
a:
javac *.java
v:
新建一个manifest.mf文件
格式
Main-Class: ServerMain(指定包含main的class文件名)
c:
jar cvfm server.jar manifest.mf *
d:
运行:java -jar sever.jar
3:
今天在往公司服务器上导入数据库的时候,运行socket服务器的时候出现了一个非常诡异的错误:
>aa
Last packet sent to the server was 29 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2586)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
at btd.game.scl.server.DatabaseTools.getRoomInfo(DatabaseTools.java:652)
at btd.game.scl.server.Server$Client.operatorMessage(Server.java:266)
at btd.game.scl.server.Server$Client.run(Server.java:198)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
** END NESTED EXCEPTION **
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
at com.mysql.jdbc.Connection.checkClosed(Connection.java:1931)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4705)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4671)
at btd.game.scl.server.DatabaseTools.getRoomInfo(DatabaseTools.java:651)
at btd.game.scl.server.Server$Client.operatorMessage(Server.java:266)
at btd.game.scl.server.Server$Client.run(Server.java:198)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
STACKTRACE:
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
at btd.game.scl.server.DatabaseTools.getRoomInfo(DatabaseTools.java:652)
at btd.game.scl.server.Server$Client.operatorMessage(Server.java:266)
at btd.game.scl.server.Server$Client.run(Server.java:198)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
** END NESTED EXCEPTION **
后来发现问题是在服务器上建weiqi_data数据库的时候是用nicky用户名建立的;而socket服务器程序在连接的时候用的是root用户,所以出现了这个错误。
【2010/3/5】
1:
linux上新建一个批处理文件:
新建一个文件,名称任意取,如取名叫做bat (touch bat)
编辑该文件 vi bat
在该文件档中输入以下内容:
javac *.java
jar cvfm weiqiserver.jar manifest.mf *
java -jar weiqiserver.jar ninki 13366065774
保存退出(:wq)
更改权限:
chmod 744 bat
执行该文件 ./bat 即可。
3:
Broken pipe异常,这个异常是因为对于围棋socket服务器来说,当客户端失去连接的时候,服务器是不知道的;当客户端再次连接的时候
4:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
STACKTRACE:
这个错误上网搜索了一下,说法什么都有,但本质的意思就是mysql连接已经断开了,而自己的程序又用到了
mysql连接,所以就报错了,写这些文章的大多都是什么c3p什么玩意的,说什么默认8小时等等,修改配置文件;
我的程序根本就没有配置文件,上哪改去,我的程序只是linux下的一个socket服务器,用到了mysql而已,于是
再网上又搜索了一下,看到这个命令可以查看 mysql默认的连接超时时间time_out,我刚开始还想,默认的都是
8个小时,我这正测试手机程序呢就不好使了,肯定不是和他们一样的原因,结果在linux我用这个命令一查:
show global variables;
天啊,人家的mysql默认的都是28800秒(也就是8小时),我的竟然是60秒,怪不得正测试程序呢就报上面这个
错了,赶紧改吧。
首先找到my.cnf,(我的在/etc/my.cnf)
把里面的wait_timeout 改为 固定的值,保存退出
重启mysql服务器
1.启动:/etc/init.d/mysqld start
2.停止:/etc/init.d/mysqld stop
3. 重启:/etc/init.d/mysqld restart
进入mysql再查看一下mysql -uroot -psamsung
然后再测试一下围棋游戏程序,错误销声匿迹了!