PHP中常见问题总结
【1】页面之间无法传递变量
get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。
【2】Win32下apache2 用get方法传递中文参数会出错
test.php?a=你好&b=你也好
传递参数是会导致一个内部错误
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)
【3】win32下的session不能正常工作
php.ini默认的session.save_path = /tmp
这显然是linux下的配置,win32下php无法读写session文件导致session无法使用
把它改成一个绝对路径就可以了,例如session.save_path = c:\windows\temp
【4】显示错误信息
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽
例如显示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
【5】Win32下mail()不能发送电子邮件
在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器
www.phpe.net有个很好的class,不过需要修改一下发信会暴快,修改后版本将在近日推出
【6】header already sent这个错误通常会在你使用HEADER的时候出现,他可能是几种原因:
1,你在使用HEADER前PRING或者ECHO了
2.你当前文件前面有空行
3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。!
还有使用session_register()
【7】初装的mysql如果没有设置密码,应该使用
update mysql.user set password=password("yourpassword") where user="root"
【8】更改php.ini后没有变化
重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置
【9】php在2003上面安装(ISAPI的安装方法)
PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装
步骤一,先去www.php.net下在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站-->应用程序配置
步骤二:点击 web服务扩展 -->新建web服务扩展.
步骤三: 扩展名-->php,然后添加
步骤四:找到php.exe的路径添加上去。
步骤五: 确定就可以了!
步骤六: 选择php的服务扩展,然后点击允许。
【10】有时候sql语句不起作用,对数据库操作失败
最简便的调试方法,echo那句sql,看看变量的值能不能得到
【11】
<?php
// 自 PHP 3 起可用
print $HTTP_POST_VARS['username'];
// 自 PHP 4.1.0 起可用
print $_POST['username'];
print $_REQUEST['username'];
import_request_variables('p', 'p_');
print $p_username;
// 如果PHP指令 register_globals = on 时可用。不过自PHP 4.2.0 起默认值为 register_globals = off不提倡使用此种方法。
print $username;
?>
使用 GET 表单也类似,只不过要用适当的 GET 预定义变量。GET 也适用于 QUERY_STRING(URL 中在“?”之后的信息)。因此,举例说,网页链接 包含有可用 $_GET['id'] 访问的 GET 数据。参见 $_REQUEST 和 import_request_variables()。
在 PHP 4.2.0 之前 register_globals 的默认值是 on。在 PHP 3 中其值总是 on。鼓励大家不要依赖此指令,建议在编码时假定其为 off。
【12】暂存你的变量到临时文件:
if(file_exists('temp.php'))
{
$x=r('temp.php');
@eval("\$a = $x;");
}
if(!is_array($a)){
#重新构造数组A
$a=array(array("af"=>"fsdf"),"f"=>"df");
}
w('temp.php',var_export($a,true));
var_dump($a);
读取,写入文档数据
function r($file_name)
{
$filenum=@fopen($file_name,"r");
@flock($filenum,LOCK_SH);
$file_data=@fread($filenum,filesize($file_name));
@fclose($filenum);
return $file_data;
}
function w($file_name,$data,$method="w")
{
$filenum=@fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
【13】include和require的区别
两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出;据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许linux下情况不同,暂时还没测试;如果一个文件不想被包含多次可以使用include_once或require_once
【14】session在函数和方法中的应用:你打算注册进session的变量都必须是全局的。
原因是这样的:
php的session_register函数只是记住变量的名字,而不会去记变量的值。
真正要在服务器端记住这个变量的值是在整个脚本运行结束之后,也就是说变量的值是在脚本运行结束的时候才会被读取并保存入服务器端的临时目录,这样,在所有函数或方法外的、或在函数或方法内被定义为全局变量的变量才会成功register,而其他的则都会在脚本运行结束时被unset掉。
【15】PHP中的session由于基于cookie实现,所以在所有会话窗口关闭后并不会马上消失。这一点和其他脚本语言不同,同时让我感到郁闷。
答:不不不
,楼上的朋友没有把php的session研究透,如果非要说php的session跟cookie有关系,那也就是一个session_id被记录在了客户端
而在服务器端的临时目录下,会生成一个跟session_id大致同名的文件,这个文件才是真正记录你成功register过的变量和它们的值。同样,如果客户端禁止使用cookie,php会自动以get的方式传递session_id的值,使其不会丢失。所以,cookie跟session之间的关系,并不是那么密不可分。而且,php的session也不能说是基于cookie实现的。
【16】isset()和empty()的区别
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示;
两者都是测试变量用的,但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空
如果一个变量被赋空值,$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。要注销一个变量,可以用 unset($foo)或者$foo=NULL
【17】通过HTTP协议一次上传多个文件的方法
有两个思路,是同一个方法的两种实现。
1,在form中设置多个文件输入框,用数组命名他们的名字,如下:
<form action="" method=post enctype="multipart/form-data">
<input type=file name=usefile[]>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
</form>
这样,在服务器端做以下测试
echo "<pre>";
print_r($_FILES);
echo "</pre>";
2,在form中设置多个文件输入框,但名字不同,如下:
<form action="" method=post enctype="multipart/form-data">
<input type=file name=usefile_a>
<input type=file name=usefile_b>
<input type=file name=usefile_c>
</form>
在服务器端做同样测试:
echo "<pre>";
print_r($_FILES);
echo "</pre>";
【18】可以创建一个临时的PHP格式的文件,在需要的地方include进来,这样临时的PHP文件中定义的变量就有了,可以取代session。
【19】正如上面说得,现在get,post方式提交的都无法直接使用,有时甚是麻烦,自己写了段代码,把他们转化为全局变量,以便使用,session变量同理可得。
把通过GET或POST方式提交的变量转化为全局变量:
foreach($_GET as $key=>$value){
$$key=$value;
}
foreach($_POST as $key=>$value){
$$key=$value;
}
【20】自动判断PHP版本,并把所有环境变量转为全局变量
<?php
function pmyoutput(&$a)
{
if (is_array($a))
{
array_walk($a,'pmyoutput');
}
else
{
$a = stripslashes($a);
}
}
function pmyinput(&$a)
{
if (is_array($a))
{
array_walk($a,'pmyinput');
}
else
{
$a = addslashes($a);
}
}
if (phpversion() < '4.1.0')
{
isset($HTTP_SESSION_VARS) ? $GLOBALS['_SESSION'] = &$HTTP_SESSION_VARS : '';
isset($HTTP_SERVER_VARS) ? $GLOBALS['_SERVER'] = &$HTTP_SERVER_VARS : '';
isset($HTTP_ENV_VARS) ? $GLOBALS['_ENV'] = &$HTTP_ENV
_VARS : '';
isset($HTTP_FILES_VARS) ? $GLOBALS['_FILES'] = &$HTTP_FILES_VARS : '';
if (get_magic_quotes_gpc() == )
{
isset($HTTP_GET_VARS) ? $GLOBALS['_GET'] = &$HTTP_GET_VARS : '';
isset($HTTP_POST_VARS) ? $GLOBALS['_POST'] = &$HTTP_POST_VARS : '';
isset($HTTP_COOKIE_VARS) ? $GLOBALS['_COOKIE'] = &$HTTP_COOKIE_VARS : '';
}
else
{
isset($HTTP_GET_VARS) ? pmyinput($HTTP_GET_VARS) : '';
isset($HTTP_POST_VARS) ? pmyinput($HTTP_POST_VARS) : '';
isset($HTTP_COOKIE_VARS) ? pmyinput($HTTP_COOKIE_VARS) : '';
$GLOBALS['_GET'] = &$HTTP_GET_VARS;
$GLOBALS['_POST'] = &$HTTP_POST_VARS;
$GLOBALS['_COOKIE'] = &$HTTP_COOKIE_VARS;
}
$GLOBALS['_REQUEST'] = array_merge($_GET, $_POST, $_COOKIE);
}
else
{
if (get_magic_quotes_gpc() != )
{
isset($_GET) ? pmyinput($_GET) : '';
isset($_POST) ? pmyinput($_POST) : '';
isset($_COOKIE) ? pmyinput($_COOKIE) : '';
isset($_REQUEST) ? pmyinput($_REQUEST) : '';
}
}
?>
【21】中文日期显示函数
unction Get_Date($sent)
{
//return local area time now it's available DSONet @ 2003-8-7 17:29
$months=array('一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月');
$weeks = array('星期日','星期一','星期二','星期三','星期四','星期五','星期六');
list($sec,$min,$hour,$mon,$year,$mday,$wday,$yday) = explode(" ",date("s i H n Y j w z",date($sent)));
list($Tsec,$Tmin,$Thour,$Tmon,$Tyear,$Tmday,$Tyday) = explode(" ",date("s i H n Y w z",time()));
$mon-=;
//$mday.="日";
$date="{$year}年$months[$mon]{$mday}日";
if ($year == $Tyear)
{
$Cyday = $Tyday - $yday;
if ($Cyday == ) { $date = "今天"; }
else if ($Cyday == ) { $date = "昨天"; }
else if ($Cyday == ) { $date = "前天"; }
else if ($Cyday <= ) { $date = "$weeks[$wday]";}
return $date;
}
return $date;
//return date("M d Y H:i",$sent);
}
另外如果您的php无法接受中文,有以下方法:
//htmlentities maybe can't supported to chinese gb2312 DSONet @ 2003-8-7 17:00
//$email = htmlentities($in['email']);
//following is ok
$subject = htmlspecialchars($in['subject'],ENT_QUOTES);
还有这个正则表达式可以去掉(\")
$txt=ereg_replace("([\r\n])","",$txt);
//DSONet @ 2003-8-8 12:09
//cause $txt include some interpunction like \" so must clearn these dirty words.I don't konw why it has these bad words now .js?
$txt=ereg_replace("[\\](\")","\"",$txt);
【22】取得上一页面参数
function get_arg($arg_name)
{
return isset($_POST[$arg_name])?$_POST[$arg_name]:(isset($_GET[$arg_name])?$_GET[$arg_name]:(isset($$arg_name)?$$arg_name:""));
}
PHP中常见问题总结的更多相关文章
- VC++学习之VC中常见问题
VC++学习之VC中常见问题 (1)为什么某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 ( ...
- 小程序开发过程中常见问题[微信小程序、支付宝小程序]
目录 一.样式中如何使用background-image呢? 二.使用自适应单位rpx类似于rem,布局尽量使用flex布局 三.万能的{{双大括号,用于在模版中输出变量 四.你想要的基础组件和API ...
- 【转】Linux中常见问题(磁盘 定时任务)
[转]Linux中常见问题(磁盘 定时任务) 第1章 linux无法上网 1) 第一步,先ping域名. ping www.baidu.com 2)再ping一个公网ip , ping 223 ...
- (转)CloudStack 安装及使用过程中常见问题汇总
CloudStack 安装及使用过程中常见问题汇总 在做工程项目中对CloudStack 安装及使用过程中常见的几个问题及如何解决做一个总结. 1.Windows XP虚拟 ...
- Hibernate中常见问题 No row with the given identifier exists问题
收集:Hibernate中常见问题 No row with the given identifier exists问题的原因及解决 2007年11月21日 15:02:00 eyejava 阅读数:2 ...
- iOS开发中常见问题集锦
在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...
- SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
大家都知道SAP HANA项目打包成Delivery Unit(缩写为DU).依照"官方"的开发模式,特别是整个团队仅仅使用一个HANA Instance进行项目开发,因为HANA ...
- mysql在查询中常见问题汇总
1.从主从表中查询外键内容(常见问题) 从主从表中查询对应的外键,需要指定外键的表,即sno=> student.sno或者score.sno 错误:select sno,sname,degre ...
- Android Studio使用过程中常见问题及解决方案
熟悉Android的童鞋应该对Android Studio都不陌生.Android编程有两个常用的开发环境,分别是Android Studio和Eclipse,之前使用比较多的是Eclipse,而现在 ...
- js/jQuery使用过程中常见问题
目录 一.jQuery选择器选择选中的或者disabled的选择框时attr函数无效 二.jQuery each函数的break/continue 三.jQuery 获取元素的left会值/left数 ...
随机推荐
- e858. 将键盘键和事件绑定
This example creates a number of keystrokes and adds them to the input map of a component. When a ke ...
- Tomcat 部署一工程时Deploy Location 为什么 是 INVALID
1.eclipse项目: 在项目的.settings目录下,找到org.eclipse.wst.common.component文件: <?xml version="1.0" ...
- 混合线路接入时,360、QQ管家等测速显示电信IP或任意线路的IP
最近很多人QQ上问我,我有电信.联通接入,用户测速的时候有的时候显示联通的IP,可是我想让他显示为电信的IP,怎么办? 3年前开始使用联通的线路时,就这样设置了,有些人还拿这个设置当宝贝了???? 其 ...
- vue的安装
第一步:环境的搭建 : vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言(https://nodejs.org/zh-cn/down ...
- nginx搭建(centos7)
1.安装前准备: 系统: CentOS 7.5 x64 下载包:wget yum -y install wget 安装: 2.安装一下这些依赖条件: yum install gcc pcre pcre ...
- AngularJS orderBy 使用要点
AngularJS orderBy 使用要点总结: 1,书写格式 基本应用格式为: ng-repeat="item in itemList | orderBy:p1:p2" 参数p ...
- SOCKET,TCP/IP,UDP,HTTP,FTP总结
一.TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议 ...
- 小程序实现textarea随输入的文字行数变化高度自动增加
参考链接:https://blog.csdn.net/liuwengai/article/details/78987957 该实现方法是根据上面的链接改编为小程序的实现,代码如下: wxml: < ...
- WebGL 着色器语言(GLSL ES)
1.类型转换内置函数 转换/函数/描述 转换为整形数/int(float)/将浮点数的小数部分删去,转换为整形数(比如,将3.14转换为3) 转换为整形数/intl(bool)/true被转换为1,f ...
- Phpcms V9手机门户设置教程:怎么用PC V9做手机网站
一.在PHPcms V9管理后台设置手机门户 1.1.开启手机网站.位置:模块 >手机门户 > 添加手机站点,具体设置可参照截图: 填写站点名和LOGO文件相对位置,绑定用于手机网站的二级 ...