PHP,MYSQL常见问题与解答

===> register_globals[全局变量]的相关说明
很多入门的朋友被全局变量搞的很糊涂,可以参考以下的说明:

CODE
决定是否将 EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。例如,如果 register_globals = on,那么 URL http://www.example.com/test.php?id=3 将产生 $id。或者从 $_SERVER['DOCUMENT_ROOT'] 得来 $DOCUMENT_ROOT。如果不想用户数据把全局域弄乱的话可以将此选项关闭。自 PHP 4.2.0 开始,本指令默认为 off。推荐使用 PHP 的预定义变量来替代,例如超全局变量:$_ENV,$_GET,$_POST,$_COOKIE 和 $_SERVER。

===> Client does not support authentication protocol
好多朋友升级了mysql为4.10以上会发生此错误,php4.x下phpmyadmin之类的程序连接不上数据库,是因为mysql4.10以上改变了用户密码验证协议,php的连接模块也需要更换新的,php5默认就是这种新的连接模块...

不想更换可以这样:
CODE
# SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
# FLUSH PRIVILEGES;

===> 如果在数字前面强制加0
格式化数字的位数,未满位的加前导0
CODE
<?php
$num = 12;
$var = sprintf("%09d", $num);
echo $var;
?>


===> 取得当前脚本的路径
请不要用 $_SERVER['PHP_SELF']取路径,$_SERVER['PHP_SELF']取出来的在某些情况下是错误的.也不要用$_SERVER['SERVER_NAME'],$_SERVER['SERVER_NAME']取得的主机名不包含端口号,而且有时候取得的是服务器名,非你的虚拟主机名.
脚本路径:
CODE
<?php
$url = 'http://'.dirname($_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']).'/';
?>

地址栏信息:
CODE
<?php
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>


===> url传递参数需要这样编码
与 HTML 实体相匹配的变量。像 &amp、&copy 和 &pound 都将被浏览器解析,并使用实际实体替代所期待的变量名。解决办法是使用 &amp; 代替 & 作为分隔符。使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。
CODE
<?php
echo "<a href='filename.php?par=" . htmlentities(urlencode($parameter)) . "'>";
?>

接受页面直接使用,不需要解码.

===> 数据存入MySQL需要注意
入库:
CODE
<?php
$str = addslashes($str);
?>

出库:
CODE
<?php
$str = stripslashes($str);
?>


===> 返回MySQL数据库上一步 INSERT 操作产生的 ID
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。
CODE
<?php
$last_id = mysql_insert_id();
?>


===> 如何解决表单出错返回从填的时候以前填写的东西全部消失
因为使用了session,可以用session_cache_limiter强制数据流从新生效.
CODE
<?php
// session start
session_cache_limiter("private, must-revalidate");
session_start();
...
?>


===> 如何一劳永逸的解决Cannot send session cache limiter - headers already sent 这种错误
当用header()转向或者session_start()之前有输出,会有Cannot send session cache limiter - headers already sent的错误,可以用ob_start(),这样会在页面全部执行完毕才输出.
CODE
<?php
session_start();
ob_start();
...
?>


===> 如何表单填写错误时返回后以前填写的内容消失?
当使用session后会出现这种情况,我们可以使用session_cache_limiter();强制生效.
CODE
<?php
session_cache_limiter("private, must-revalidate");
session_start();
...
?>


===> 判断邮件地址是否合法!
判断邮件地址是否合法!
CODE
<?php
if(!preg_match("/^[a-z0-9-_/.]+@([a-z0-9][a-z0-9-]+/.)+[a-z]{2,4}$/i",$email)){
   echo "<script language='JavaScript'>";
   echo "alert('E-mail Error!'); location.replace('javascript:history.back(1)');";
   echo "</script>";
   exit;
}
?>


===> 数组存储到MySQL数据库
数组存储到mysql中要用serialize() 产生一个可存储的值
CODE
<?php
$array_in = serialize($data);
...
?>

出库时
CODE
<?php
...
$array_out = unserialize($data);
?>


===> 取来源页面地址
如果是通过<script language="javascript" src="filename.php"></script>调用,取到的只是filename.php,而非来源页面.这时候可以用js来取.
CODE
<?php
echo $_SERVER['HTTP_REFERER'];
?>


===> 实现任意文件的下载
用header可以实现任意文件的下载,而不是打开,比如txt和图片等.自己找一下Content-type,根据相应的类型替换就可以了.
CODE
<?php
// We'll be outputting a gif
header('Content-type: image/gif');

// It will be called pic.gif
header('Content-Disposition: attachment; filename="pic.gif"');

// The gif source is in pic.gif
readfile('pic.gif');
?>


===> 为什么 $foo[bar] 错了?[摘自php手册]
应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?你可能在老的脚本中见过如下语法:
CODE
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
注: 这并不意味着总是给键名加上引号。用不着给键名为常量 或 变量 的加上引号,否则会使 PHP 不能解析它们。
===> 如何截取文件扩展名
如上传文件的扩展名等,此扩展名可能是伪造的.想判断文件类型请用mime_content_type()...
CODE
<?php
// 第一种
$extendname = array_pop(explode ( ".",$filename));

// 第二种
$extendname = end(explode(".", $filename));

// 第三种
$file_part  = pathinfo($filename);
$extendname = $file_part["extension"];
?>

===> 一个缓冲输出显示的例子
1.有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
2.甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换
行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
CODE
<?php
set_time_limit(0);
ob_start();

// 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,
// 所以必须发送一些额外的空格来让这些浏览器显示页面内容。
echo str_pad('Loading... ',4096)."<br>/n";

for ($i = 0; $i < 30; $i++) {
  echo "=";
  flush();
  ob_flush();
  sleep(1);
}
ob_end_flush();
?>
===> 读取配置文件的几个例子
对配置文件的读取,就像一些应用程序的.INI配置文件一样,具体内容查看手册中的函数:

1.
CODE
<?php
define ('BIRD', 'Dodo bird');

// Parse without sections
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);

// Parse with sections
$ini_array = parse_ini_file("sample.ini", TRUE);
print_r($ini_array);

// sample.ini
/*
; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = /usr/local/bin
URL = "http://www.example.com/~username"
*/
?>


2.
CODE

<?php
$handle = fopen ("users.txt","r");
while ($userinfo = fscanf ($handle, "%s/t%s/t%s/n")) {
  list ($name, $profession, $countrycode) = $userinfo;
  //... do something with the values
}
fclose($handle);

// users.txt
/*
javier  argonaut        pe
hiroshi sculptor        jp
robert  slacker us
luigi   florist it
*/
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值