Skip navigation.

flying in the way of my own...

Posts tagged with "php"

php+mysql中文乱码的解决<br/>

, ,

学会了怎么用php+mysql来创建到态页面,今天才真正的用了一下。不过在用的时候却又来的新的问题,在php中提交的数据,在mysql中显示的全都是乱码。于是就google了一下,在PHP与MySQL开发中页面乱码的产生与解决这篇文章中看到要在连接数据库以后,再加一句
mysql_query("SET NAMES UTF8"); 
来设定php与mysql间数据传输的编码,不过这样设置了以后还是不行,乱码变成了一个个的小“?”,直接用phpMyAdmin创建了一个包含中文的项,发现也是乱码,于是知道了问题不是出在了php中。经过了一段检查发现,我创建的表的字符集是latin1,不过我也不知道怎么把它改成utf8的,就直接在phpMyAdmin里面创建了一个,phpMyAdmin显示所使用的query是
CREATE DATABASE $dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
这种格式的,所以明白了是在创建数据库的时候要把数据库的碥码也设置好,而之后在创建表,项的时候就不用指定了,因为它们会从上一级继承。

用php生成验证码

, ,

现在网上的垃圾信息越来越多,验证码也就显得越来越重要了。下面介绍一下怎么用php生成验证码。
验证码一般会做成图片,这样那些垃圾发送者才不容易识别,并且,由于版权的原因,现在php会生成png格式的图片而非gif格式。所以,要发送一个代表png图片的http头。
Header("Content-type: image/PNG");

然后,要生成图片的第一件事就是先创建一个图片,这要用imagecreate()函数。
resource imagecreate ( int x_size, int y_size )

其中,x_size是图片的长度,y_size是宽度。
比如
$im = imagecreate(58,28);


生成的图片是一张空的图片,这当然不是我们想要的。颜色是构成图片的一个重要的原素,ImageColorAllocate()函数可以用来定义自己所需要的颜色。
int imagecolorallocate ( resource image, int red, int green, int blue )

其中image是所定义的颜色要用在哪个图片上,red,green,blue则是用来指定颜色的rgb值。

有了颜色以后,下一步就是要把颜色涂在图片上了。这可能用imagefill()函数。
bool imagefill ( resource image, int x, int y, int color )

image是要涂色的图片,x,y是起始坐标,color则是颜色(这里的颜色就是用ImageColorAllocate()函数定义的颜色)。

这样,准备工作就做完了。下面要进行的就是最重要的一步了。怎么把验证码放在图片上。这可以借助imagestring()函数。它的作用就是把一个字符串水平地画在图片上。
bool imagestring ( resource image, int font, int x, int y, string s, int col )

image是要画字符串的图片,font是字体(如果font的值是1, 2, 3, 4 或 5,就会用内置的字体),x,y是起始坐标,s就是要画的字符串,col是字符串的颜色。
如果要做一个4位的只有数字的验证码,那么只要生成一个[1000,10000)区间内的随机数,然后把它画在图片上就可以了。

这样,验证码就基本完成了。不过要想让我们的验证码再牛一些,可以在背景上再画上一些乱点,这样那些机器人识别起来就更困难了。
imagesetpixel()函数可以完成这一操作。
bool imagesetpixel ( resource image, int x, int y, int color )

它可以在image上的x,y坐标上画一个颜色为color的点。这样,在随机的坐标画一个随机颜色的小点。

这样,我们所要的图片就作好了。最后一步,就是把它画出来了。这只要一个函数
ImagePNG(resource img)

它会把img图片画在浏览器上面。
然后,用
imagedestroy(resource img)
把图片的identifier所占用的内存释放掉就可以了。

假如我们用来生成图片的php文件叫img.php,那么在别的网页中,img.php就可以像普通的图片一样来使用了。如果要实现验证码功能,可以把img.php中生成的验证码存在session中,这样就可以在所要验证的页面中来比较了。

另,需要注意,要生成动态图片php需要加载gd库,方法为去掉在/etc/php.ini中extension=gd.so前面的叹号就行了。(然后重启httpd服务)

本文参考了:
用PHP实现验证码功能
PHP Manual

在php中使用session

, ,

在上一篇post中,介绍了在php中怎么使用cookie,而在这一篇中要介绍的是一种用途和cookie差不多的东西,session。它也是用来记录短时间内浏览者的信息的。最先看完了一篇关于session的介绍,感觉它和cookie是一样的,于是就产生了一个疑问,有了cookie为什么还要有session,它们之间肯定有所不同。通过google,终于了解了。下面仔细说说它们的不同之处。
1.cookie保存在客户端,而session的内容保存在服务器端,只是把一个session id保存在客户端。打个比方,比如一个我把一些钱存在了银行里(这个银行比较简陋,而且比较愚蠢:-),如果是cookie的话,它会给我一张记录着我的信息(比如名字,借了多少钱等)的纸,我来取钱的时候把这张纸给它它就会给我钱(而我如果改了那张纸上的内容,比如我存了一块钱,而改成存了1000000元,它也会给我──说了它比较愚蠢);而如果是session,它只是给我一张纸,上面告诉我我有一个id,是xxxxx,而我的信息都存在它那里,我去取钱的时候只要告诉它我的id它就会把相应的钱给我。(这时我存了多少钱,在它那里保存着,我自己也就没法改了。)也就是说,session比cookie更安全,同时也可以说明session(大部分时候)是基于cookie的(用cookie来保存session id)。
2.由于session是保存在服务器端的,因些会占用服务器的空间,所以一般在不活动时过一段时间会过期的(22分钟?),而且在浏览器关闭后也会作废,而不像cookie那样可以设定一个比较长的过期时间。
3.每个浏览器在只能保存同一个域名下的至多20个cookie,而且每个cookie的大小不能超过4KB,而session就没有这些限制(因为保存在服务器)
4. 有些人会禁止浏览器接受cookie,而些时session还是可以用的(注意session也可以不通过cookie来实现)

由此可以看出,session和cookie各自有各自的用处,而不是谁能取代谁的。所以很有必要了解一下在php中怎么来使用session.

起动一个session
php通过函数session_start()来启动一个session

使用session变量
php通过函数session_register()来注册session变量,如果之前没有调用过session_start()函数,session_register()会先去调用session_start()。需要注意的是,这个函数注册的是变量本身,而不是变量的值,也就是说,在注册了变量var之后,每当它的值改变时,都会将新的值写入文件,而不用显式地再次调用session_register来记当变更。
如果php的配置没有开启register_globals,则只可以用_SESSION数组来引用session变量,比如var只能这样引用$_SESSION["var"],而如果开启了register_globals选项,则可以直接用$var。
通过函数session_unregister()可以取消session变量,要注意的是,它只是取消了变量在之后文件中的定义,而它可以在当前文件中持续到文件结尾都有效。
session变量也可以是object,不过当使用object类型的session变量时要注意的是,在每次开启session之前,都要包含该对象的定义,不管这个脚本中使用不使用这个对象。

关闭session
php通过函数session_destroy()来关闭一个session,此时这个session必须是已经开启的,可能通过检查PHPSESSID是否已经设定(它会在http request中设定)来确定是否已经启动了session。

本文参考了
Session Handling Functions
PHP Session Management With Cookies
Session Management Over the Web
PHP 中 session 全面教程

在php中使用cookie

, ,

在交互性的网站中,cookie基本上是必不可少的东西,它可以记录一些临时的东西,比如用户的身份,比如购物网站中的购物车。下面就来看一下具体在php中应该怎么使用。
其实这是非常简单的,要设置一个cookie,只是简单地调用一个函数就行了。这个函数是这样的:
setcookie("varname",value,expiretime,path,domain);

其中前两个参数是必须的,后面的是可选的。
varname是要设置的变量的名称,value就是要给变量的值,expiretime是到期的时间,后面的不是很常用,我在找的资料上面也没有太看明白,有兴趣的朋友可以自己去查一下(学会了顺便给我讲讲,呵呵)。
如果不指定expiretime,则cookie在浏览器关闭后就会失效,反之则会一直持续到指定的时间。这里的时间一般写成这样子的
time()+value

其中value是以秒为单位的时间长度,这表示cookie一直持续value秒都有效。
这样varname和它的值就存到了浏览者的cookie中了。
在想读取cookie中变量的值时,只需从数组_COOKIE中的以"varname"为下标的无素的值就行了,比如:
echo $_COOKIE["varname"];

这时输出的结果就应该是value了。
不过要注意的一点是,由于cookie是在http头中发送的,所以setcookie应该放在php文件中<header>前面。

本文参考了以下内容:
PHP Cookies
PHP Cookie Example 1
PHP Cookie Example 2

php+mysql简介(三)

, ,

在前两篇简介中以经介绍了怎么用php和mysql数据库交互,不过那些在实际应用中还是不够的,下面就继续介绍一些新的东西。
有时我们在选择数据库中的数据时并不想把所有的都选择出来,比如在我们前面建立的contacts表中,如果只想选出first name为john的联系人,就可以用这个语句:
SELECT * FROM contacts WHERE first='john'

更有趣的是,我们甚至可以用一个变量来代替john,这也就是说我们可以在网站中让用户来选择想要查看的内容来进行选择。
同时,我们还可能对输出的顺序有一定的要求,比如想让我们的联系人按照last name的升序排列,就可以这样:
SELECT * FROM contacts ORDER BY last ASC

其中的ASC是Ascending(升序)的缩写,如果想用降序排列,可以把ASC换成DESC(Descending) 。

有时候,我们需要对数据库中的内容进行一些更新,比如我们的朋友换了电话,在我们的contacts表中就要更新他的电话号码,当然,这可以交给他自己去做,他想改的不一定只是电话号码(可能他已经搬家了也说不定)。这可以做成一个页面,由用户去修改内容并提交:
<form action="updated.php" method="post">
<input type="hidden" name="ud_id" value="<? echo $id; ?>">
First Name: <input type="text" name="ud_first" value="<? echo $first; ?>"><br>
Last Name: <input type="text" name="ud_last" value="<? echo $last; ?>"><br>
Phone Number: <input type="text" name="ud_phone" value="<? echo $phone; ?>"><br>
Mobile Number: <input type="text" name="ud_mobile" value="<? echo $mobile; ?>"><br>
Fax Number: <input type="text" name="ud_fax" value="<? echo $fax; ?>"><br>
E-mail Address: <input type="text" name="ud_email" value="<? echo $email; ?>"><br>
Web Address: <input type="text" name="ud_web" value="<? echo $web; ?>"><br>
<input type="Submit" value="Update">
</form>

当然,这只是网页,真正起做用的还是我们的php,update.php可以写成这样:
$ud_id=$_POST['ud_id'];
$ud_first=$_POST['ud_first'];
$ud_last=$_POST['ud_last'];
$ud_phone=$_POST['ud_phone'];
$ud_mobile=$_POST['ud_mobile'];
$ud_fax=$_POST['ud_fax'];
$ud_email=$_POST['ud_email'];
$ud_web=$_POST['ud_web'];

$username="username";
$password="password";
$database="your_database";
mysql_connect(localhost,$username,$password);


$query="UPDATE contacts SET first='$ud_first', last='$ud_last', phone='$ud_phone', mobile='$ud_mobile', fax='$ud_fax', email='$ud_email', web='$ud_web' WHERE id='$ud_id'";
mysql_query($query);
echo "Record Updated";
mysql_close();

这其中最关键的一句就是这个:
$query = "UPDATE contacts SET first = '$ud_first', last = '$ud_last', phone = '$ud_phone', mobile = '$ud_mobile', fax = '$ud_fax', email = '$ud_email', web = '$ud_web' WHERE id = '$ud_id'";

这是实际修改的语句,从此可以看出更新的语法是这样的:
UPDATE tablename SET ...


还有时候,我们想删除掉数据库的内容,就可以通过下面的语句来实现:
DELETE FROM contacts WHERE id='$id'

这句可以删除id是$id的联系人。

当我们的数据库非常庞大时,搜索是必不可少的功能,这也是可以通过php+mysql来实现。它的语法是这样的:
SELECT * FROM tablename WHERE fieldname LIKE '%$string%'

其中%是通配符,上面的%$string%就是搜索fieldname中包含$string的记录,而$string%则表示以$string开头,%$string以$string结尾。

以上的东西已经把php+mysql来制作动态网页的基本内容都介绍了,相信读过的朋友应该可以开始动手建站了。我也是第一次接触这些内容,所以难免有不正确的地方,所以希望能抽出宝贵时间读这些小文章的朋友发现问题及时指出,我们可以共同进步。我也要开始去动手了。

本文参考了
Part 5 - More Outputs
Part 6 - Single Records & Error Trapping
Part 7 - Updating & Deleting
Part 8 - Finishing The Script
December 2009
S M T W T F S
November 2009January 2010
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31