php常见问题总结
来源:互联网 发布:软件科研项目考核指标 编辑:程序博客网 时间:2024/05/01 12:35
转自:www.phpe.net
-------------------------------------------------------------------------------------------------
===> 取得当前脚本的路径
请不要用 $_SERVER['PHP_SELF']取路径,$_SERVER['PHP_SELF']取出来的在某些情况下是错误的.也不要用$_SERVER['SERVER_NAME'],$_SERVER['SERVER_NAME']取得的主机名不包含端口号,而且有时候取得的是服务器名,非你的虚拟主机名.
脚本路径:
CODE
1. <?php
2. $url = 'http://'.dirname($_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']).'/';
3. ?>
地址栏信息:
CODE
1. <?php
2. $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
3. ?>
===> url传递参数需要这样编码
与 HTML 实体相匹配的变量。像 &、© 和 £ 都将被浏览器解析,并使用实际实体替代所期待的变量名。解决办法是使用 & 代替 & 作为分隔符。使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。
CODE
1. <?php
2. echo "<a href='filename.php?par=" . htmlentities(urlencode($parameter)) . "'>";
3. ?>
接受页面直接使用,不需要解码.
===> 数据存入MySQL需要注意
入库:
CODE
1. <?php
2. $str = addslashes($str);
3. ?>
出库:
CODE
1. <?php
2. $str = stripslashes($str);
3. ?>
===> 返回MySQL数据库上一步 INSERT 操作产生的 ID
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。
CODE
1. <?php
2. $last_id = mysql_insert_id();
3. ?>
===> 如何解决表单出错返回从填的时候以前填写的东西全部消失
因为使用了session,可以用session_cache_limiter强制数据流从新生效.
CODE
1. <?php
2. // session start
3. session_cache_limiter("private, must-revalidate");
4. session_start();
5. ...
6. ?>
===> 如何一劳永逸的解决Cannot send session cache limiter - headers already sent 这种错误
当用header()转向或者session_start()之前有输出,会有Cannot send session cache limiter - headers already sent的错误,可以用ob_start(),这样会在页面全部执行完毕才输出.
CODE
1. <?php
2. session_start();
3. ob_start();
4. ...
5. ?>
===> 如何表单填写错误时返回后以前填写的内容消失?
当使用session后会出现这种情况,我们可以使用session_cache_limiter();强制生效.
CODE
1. <?php
2. session_cache_limiter("private, must-revalidate");
3. session_start();
4. ...
5. ?>
===> 判断邮件地址是否合法!
判断邮件地址是否合法!
CODE
1. <?php
2. if(!preg_match("/^[a-z0-9-_/.]+@([a-z0-9][a-z0-9-]+/.)+[a-z]{2,4}$/i",$email)){
3. echo "<script language='JavaScript'>";
4. echo "alert('E-mail Error!'); location.replace('javascript:history.back(1)');";
5. echo "</script>";
6. exit;
7. }
8. ?>
===> 数组存储到MySQL数据库
数组存储到mysql中要用serialize() 产生一个可存储的值
CODE
1. <?php
2. $array_in = serialize($data);
3. ...
4. ?>
出库时
CODE
1. <?php
2. ...
3. $array_out =
4. This site is prohibited by proxy.
===> 取来源页面地址
如果是通过<script language="javascript" src="filename.php"></script>调用,取到的只是filename.php,而非来源页面.这时候可以用js来取.
CODE
1. <?php
2. echo $_SERVER['HTTP_REFERER'];
3. ?>
===> 实现任意文件的下载
用header可以实现任意文件的下载,而不是打开,比如txt和图片等.自己找一下Content-type,根据相应的类型替换就可以了.
CODE
1. <?php
2. // We'll be outputting a gif
3. header('Content-type: image/gif');
4.
5. // It will be called pic.gif
6. header('Content-Disposition: attachment; filename="pic.gif"');
7.
8. // The gif source is in pic.gif
9. readfile('pic.gif');
10. ?>
===> 为什么 $foo[bar] 错了?[摘自php手册]
应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?你可能在老的脚本中见过如下语法:
CODE
1. <?php
2. $foo[bar] = 'enemy';
3. echo $foo[bar];
4. // etc
5. ?>
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
注: 这并不意味着总是给键名加上引号。用不着给键名为常量 或 变量 的加上引号,否则会使 PHP 不能解析它们。
===> 刚写了一个用MySQL保存图片和取出图片的例子
方法并不可取,因为保存图片的数据量是很大的,对宝贵的数据库资源太浪费,可以将图片存储到目录中,用数据库存储路径和文件名.
Database table:
CODE
1. CREATE TABLE `image_table` (
2. `id` int(4) NOT NULL auto_increment,
3. `image` blob NOT NULL,
4. PRIMARY KEY (`id`)
5. ) TYPE=MyISAM;
上传图片存储到MySQL:
CODE
1. <?php
2. // pic_database_upload.php By Bleakwind
3. $Host = "localhost";
4. $User = "bleakwind";
5. $Password = "bleakwind";
6. $Database = "test";
7.
8. mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());
9. mysql_select_db($Database) or die("Could not select database!");
10.
11. if(!empty($_FILES['image']['name'])){
12. $image_data = addslashes(fread(fopen($_FILES['image']['tmp_name'], "rb"), filesize($_FILES['image']['tmp_name'])));
13. $sql = "INSERT INTO `image_table` (`image`) VALUES ('".$image_data."')";
14. if(mysql_query($sql)){ echo "成功!"; }else{ echo "失败!"; }
15. }
16. ?>
17.
18. <form action="" method="post" name="form" enctype="multipart/form-data">
19. <input type="file" name="image" size="30">
20. <input type="submit" value="Upload">
21. </form>
从数据库中取出图片.
注意:
1.可能具体应用你还要分配一个字段来存储图片类型,这样下面的header( "content-type: image/gif");这句的gif用相应的类型替换掉.
2.如果想取出多个图片可以将下面的文件存成一个文件,在另外的文件遍历ID后调用此文件输出.
CODE
1. <?php
2. // pic_database_output.php By Bleakwind
3. header( "content-type: image/gif");
4. $Host = "localhost";
5. $User = "bleakwind";
6. $Password = "bleakwind";
7. $Database = "test";
8. $id = 1;
9.
10. mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());
11. mysql_select_db($Database) or die("Could not select database!");
12.
13. $sql = "SELECT * FROM `image_table` WHERE `id`=" . $id;
14. $result = mysql_query($sql) or die("Could not perform query!");
15. $row = mysql_fetch_array($result);
16. echo $row['image'];
17. ?>
===> 一个生成随机字符串的函数
可以控制字符串内容是什么,$len参数为生成的随即字符串长度,$array数组里面改成自己需要的内容就可以.可以使用汉字...
这只是一个方法,随即字串产生的方法多种多样,比如可以md5当前microtime(),然后截取你想要的长度...
CODE
1. <?php
2. // By Bleakwind
3. function str_rand($len)
4. {
5. $str = "";
6. $array = array("a","b","c","d","e","f","g","h","i","j","k","l","m",
7. "n","o","p","q","r","s","t","u","v","w","x","y","z",
8. "0","1","2","3","4","5","6","7","8","9");
9. $key = array_rand($array,$len);
10. for($i=0;$i<$len;$i++){
11. $str .= $array[$key[$i]];
12. }
13. return $str;
14. }
15.
16. // Use it
17. echo str_rand(6);
18. ?>
===> 如何截取文件扩展名
如上传文件的扩展名等,此扩展名可能是伪造的.想判断文件类型请用mime_content_type()...
CODE
1. <?php
2. // 第一种
3. $extendname = array_pop(explode ( ".",$filename));
4.
5. // 第二种
6. $extendname = end(explode(".", $filename));
7.
8. // 第三种
9. $file_part = pathinfo($filename);
10. $extendname = $file_part["extension"];
11. ?>
===> 一个缓冲输出显示的例子
1.有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
2.甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换
行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
CODE
1. <?php
2. set_time_limit(0);
3. ob_start();
4.
5. // 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,
6. // 所以必须发送一些额外的空格来让这些浏览器显示页面内容。
7. echo str_pad('Loading... ',4096)."<br>/n";
8.
9. for ($i = 0; $i < 30; $i++) {
10. echo "=";
11. flush();
12. ob_flush();
13. sleep(1);
14. }
15. ob_end_flush();
16. ?>
17.
===> 读取配置文件的几个例子
对配置文件的读取,就像一些应用程序的.INI配置文件一样,具体内容查看手册中的函数:
1.
CODE
1. <?php
2. define ('BIRD', 'Dodo bird');
3.
4. // Parse without sections
5. $ini_array = parse_ini_file("sample.ini");
6. print_r($ini_array);
7.
8. // Parse with sections
9. $ini_array = parse_ini_file("sample.ini", TRUE);
10. print_r($ini_array);
11.
12. // sample.ini
13. /*
14. ; This is a sample configuration file
15. ; Comments start with ';', as in php.ini
16.
17. [first_section]
18. one = 1
19. five = 5
20. animal = BIRD
21.
22. [second_section]
23. path = /usr/local/bin
24. URL = "http://www.example.com/~username"
25. */
26. ?>
2.
CODE
1.
2. <?php
3. $handle = fopen ("users.txt","r");
4. while ($userinfo = fscanf ($handle, "%s/t%s/t%s/n")) {
5. list ($name, $profession, $countrycode) = $userinfo;
6. //... do something with the values
7. }
8. fclose($handle);
9.
10. // users.txt
11. /*
12. javier argonaut pe
13. hiroshi sculptor jp
14. robert slacker us
15. luigi florist it
16. */
17. ?>
18.
- Php部分常见问题总结
- Php部分常见问题总结
- Php部分常见问题总结
- Php部分常见问题总结
- php常见问题总结
- Php部分常见问题总结
- PHP常见问题总结
- PHP初学者常见问题总结
- Php常见问题总结
- php 常见问题总结
- PHP常见问题总结
- Php部分常见问题总结(强烈推荐)
- [转帖]Php部分常见问题总结
- 69. Php部分常见问题总结
- PHP函数之CURL: 常见问题总结
- PHP函数之CURL: 常见问题总结
- PHP常见问题总结与最佳实践
- php常见问题
- 线程间通讯
- MyEclipse开发Struts中的form的property的第一个字母只能上小写。。
- 几句话搞定RMI
- SQL: 找出数据表中的空隙值
- 数据库设计技巧14则
- php常见问题总结
- C/C++编程新手错误语录
- vc入门知识点滴
- 奇怪的英文标点规则
- Struts通过数据源连接数据库
- 停止更新
- 模拟圆的碰撞
- Repeat分页
- 女孩子怎样能赚到月薪一万