问题: 1.为什么我得不到变量? 2.怎样得到页面所有变量? 3.如何使用Session? 4.为什么说headers已经发送? 5.为什么向另一页面传递变量时,以空格开头的全部丢失? 6.如何正确截取汉字,而不会以?>结尾? 7.如何规范SQL语句 8.如何使HTML/PHP格式的字符串照原样显示? 9.如何在函数中取得函数外的变量值? 10.如何知道系统默认支持的函数? 11.如何比较两个日期相差多少天? 12.为什么升级PHP后,原来的程序出现满屏的 Notice: Undefined variable...? 13.我想给每个文件的最前边和最后面都加上一个文件,但改起来又很麻烦? 14.如何利用PHP上传文件? 15.如何配置GD库? 16.如何修改Mysql的用户名和密码? 17.用户是从哪个网站连接到本页的? 18.数据存入数据库和取出显示在页面需要注意什么? 19.如何读取当前地址栏信息? 20.点击后退按钮后为什么之前填写的东西不见了? 21.图片里显示IP地址是怎么做到的? 22.如何得到用户的真实IP? 23.如何从数据库中读取三天内的所有记录? 24.如何远程连接Mysql数据库? 25.从Apache得到的页面都是乱码,怎么办? 26.为什么单引号和双引号在接收页面变成\'和\"? 27.为什么程序运行超过30秒就停止了? 28.如何计算在线人数? 29.怎么用PHP解释字符? 30.如何计算一个页面运行多长时间? 31.我的问题上面都没有提到,怎么办? 解答: 1.为什么我得不到变量? 从一个页面向另一页面POST数据name,$name却得不到任何值。 在PHP4.2以后的版本中register_global默认为off,若想取得从另一页面提交的变量: (1).在PHP.ini中找到register_global,并把它设置为on; (2).在接收网页最前面放上“extract($_POST);extract($_GET);”(注意extract($_SESSION)前必须要有session_start()); (3).一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等,这种方法虽然麻烦,但比较安全。 2.怎样得到页面所有变量? 建立一文件debug.php,其内容如下: ------------------------------ ob_start(); session_start(); echo ""; echo "本页得到的_GET变量有:"; print_r($_GET); echo "本页得到的_POST变量有:"; print_r($_POST); echo "本页得到的_COOKIE变量有:"; print_r($_COOKIE); echo "本页得到的_SESSION变量有:"; print_r($_SESSION); echo " "; ?> ------------------------------- 然后在php.ini中设置:include_path = "c:/php",并将debug.php放在此文件夹, 以后就可以在每个网页里包含此文件,查看得到的变量名和值。 3.如何使用Session? 凡是与session有关的,使用之前必须调用函数session_start(); (1).为session赋值: ------------------------------- session_start(); $Name = "这是一个Session例子"; session_register("Name");//注意,不要写成:session_register("$Name"); echo $_SESSION["Name"]; //$_SESSION["Name"]="这是一个Session例子" ?> -------------------------------- 在php4.2之后,可以为session直接赋值: -------------------------------- Session_Start(); $_SESSION["name"]="value"; ?> -------------------------------- (2).取消session: -------------------------------- session_start(); session_unset(); session_destroy(); ?> -------------------------------- 取消某个session变量在php4.2以上还有BUG。 4.为什么说headers已经发送? session、cookie和header函数前不应该有输出。 凡是出现"........headers already sent..........",就是之前已经向浏览器输出信息。 如果很难确定之前哪里向浏览器输出信息,在页面第一行加上:
5.为什么向另一页面传递变量时,以空格开头的全部丢失? send.php: -------------------------------- $Var="hello php";//修改为$Var=" hello php";试试得到什么结果 $post= "receive.php?Name=".$Var; header("location:$post"); ?> -------------------------------- receive.php: -------------------------------- echo ""; echo $_GET["Name"]; echo " "; ?> -------------------------------- 正确的方法: send.php -------------------------------- $Var="hello php"; $post= "receive.php?Name=".urlencode($Var); header("location:$post"); ?> -------------------------------- 在接收页面你不需要使用urldecode(),变量会自动解码。 6.如何正确截取汉字,而不会以?结尾? -------------------------------- $str="这个字符好长呀,^_^"; $Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符... echo "$Short_Str"; function csubstr($str,$start,$len) { $strlen=strlen($str); $clen=0; for($i=0;$i<$strlen;$i++,$clen++) { if ($clen>=$start+$len) break; if(ord(substr($str,$i,1))>0xa0) { if ($clen>=$start) $tmpstr.=substr($str,$i,2); $i++; } else { if ($clen>=$start) $tmpstr.=substr($str,$i,1); } } return $tmpstr; } function showShort($str,$len) { $tempstr = csubstr($str,0,$len); if ($str<>$tempstr) $tempstr .= "..."; //要以什么结尾,修改这里就可以 return $tempstr; } ?> -------------------------------- 7.如何规范SQL语句? 给表格和字段的名称加上"`",这样就不会因为误用关键字而出现错误,当然并不推荐使用关键字。 例如: -------------------------------- $sql="INSERT INTO `xhtml` (`author`, `title`, `id`, `content`, `date`) VALUES ('test', 'test', 1, 'criterion your sql string', '2003-07-11 00:00:00')"; -------------------------------- "`"怎么输入-->在Tab键上面。 8.如何使HTML/PHP格式的字符串照原样显示? -------------------------------- $str="PHP"; echo "被解释过的: ".$str." 经过处理的:"; echo htmlentities(nl2br($str)); ?> -------------------------------- 9.如何在函数中取得函数外的变量值? -------------------------------- $a="PHP"; foo(); function foo() { global $a;//删除这里看看是什么结果 echo "$a"; } ?> -------------------------------- 10.如何知道系统默认支持的函数? -------------------------------- $arr = get_defined_functions(); echo ""; echo "这里显示系统所支持的所有函数,和自定以函数php\n"; print_r($arr); echo " "; ?> -------------------------------- 11.如何比较两个日期相差多少天? -------------------------------- $Date_1="2003-7-15";//也可以是:$Date_1="2003-7-15 23:29:14"; $Date_2="1982-10-1"; $d1=strtotime($Date_1); $d2=strtotime($Date_2); $Days=round(($d1-$d2)/3600/24); echo "偶已经奋斗了 $Days 天^_^"; ?> -------------------------------- 12.为什么升级PHP后,原来的程序出现满屏的 Notice: Undefined variable...? 这是由于变量未定义引起的。 打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL & ~E_NOTICE。 对于Parse error错误,error_reporting(0)无法关闭。 如果你想关闭任何错误提示,打开php.ini,找到display_errors,设置为display_errors = Off。以后任何错误都不会提示。 13.我想给每个文件的最前边和最后面都加上一个文件,但改起来又很麻烦? (1).打开php.ini文件 设置 include_path= "c:\" (2)写两个文件 auto_prepend_file.php 和 auto_append_file.php 保存在c盘,他们将自动依附在每个php文件的头部和尾部. (3)在php.ini中找到: Automatically add files before or after any PHP document. auto_prepend_file = auto_prepend_file.php;依附在头部 auto_append_file = auto_append_file.php;依附在尾部 以后每个php文件就相当于 -------------------------------- include "auto_prepend_file.php" ; .......//这里是你的程序 include "auto_append_file.php"; ?> -------------------------------- 14.如何利用PHP上传文件? --------------------------------
上载文件表单
$upload_file=$_FILES['upload_file']['tmp_name']; $upload_file_name=$_FILES['upload_file']['name']; $upload_file_size=filesize($upload_file); if($upload_file) { $file_size_max = 1000*1000;//1M限制文件上传最大容量(bytes) $store_dir = "d:/";//上传文件的储存位置 $accept_overwrite = 1;//是否允许覆盖相同文件 //检查文件大小 if ($upload_file_size > $file_size_max) { echo "对不起,你的文件容量大于规定"; exit; } //检查读写文件 if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) { echo "存在相同文件名的文件"; exit; } //复制文件到指定目录 if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) { echo "复制文件失败"; exit; } } echo "你上传了文件:"; echo $_FILES['upload_file']['name']; echo " "; //客户端机器文件的原名称。 echo "文件的 MIME 类型为:"; echo $_FILES['upload_file']['type']; //文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。 echo " "; echo "上传文件大小:"; echo $_FILES['upload_file']['size']; //已上传文件的大小,单位为字节。 echo " "; echo "文件上传后被临时储存为:"; echo $_FILES['upload_file']['tmp_name']; //文件被上传后在服务端储存的临时文件名。 echo " "; $Erroe=$_FILES['upload_file']['error']; switch($Erroe) { case 0: echo "上传成功"; break; case 1: echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break; case 2: echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; break; case 3: echo "文件只有部分被上传"; break; case 4: echo "没有文件被上传"; break; } ?> -------------------------------- 15.如何配置GD库? (1).打开php.ini 设置extension_dir = "c:\php\extensions\"; ,extension=php_gd2.dll;把extension前面的逗号去掉 如果没有php_gd2.dll,php_gd.dll也一样 保证确实存在这一文件c:\php\extensions\php_gd2.dll (2)运行下面程序进行测试: -------------------------------- ob_end_flush(); //注意,在此之前不能向浏览器输出任何信息,要注意是否设置了 auto_prepend_file. header ("Content-type: image/png"); $im = @imagecreate (200, 100) or die ("无法创建图像"); $background_color = imagecolorallocate ($im, 0,0, 0); $text_color = imagecolorallocate ($im, 230, 140, 150); imagestring ($im, 3, 30, 50, "A Simple Text String", $text_color); imagepng ($im); ?> -------------------------------- 16.如何修改Mysql的用户名和密码? 大部分情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员. (1).使用phpMyAdmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWORD函数。 (2). 使用mysqladmin:mysqladmin -u root -p password mypasswd 输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。 把命令里的root改为你的用户名,你就可以改你自己的密码了。 当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,那么这种方法就是无效的。 而且mysqladmin无法把密码清空。 下面的方法都在mysql提示符下使用,且必须有mysql的root权限: (3)mysql> INSERT INTO mysql.user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); mysql> FLUSH PRIVILEGES 确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。 在《mysql中文参考手册》里有这个例子,注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。 (4).方法和(3)一样,只是使用了REPLACE语句: mysql> REPLACE INTO mysql.user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); mysql> FLUSH PRIVILEGES (5).使用SET PASSWORD语句: mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); 你也必须使用PASSWORD()函数,但是不需要使用FLUSH PRIVILEGES。 (6).使用GRANT ... IDENTIFIED BY语句: mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; 这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。 注意:PASSWORD()[不是]以在Unix口令加密的同样方法施行口令加密。 17.用户是从哪个网站连接到本页的? -------------------------------- //必须通过超级链接进入才有输出 echo $_SERVER['HTTP_REFERER']; ?> -------------------------------- 18.数据存入数据库和取出显示在页面需要注意什么? 入库时: $str=addslashes($str); $sql="insert into `tab` (`content`) values('$str')"; 出库时: $str=stripslashes($str); 显示时: $str=htmlspecialchars(nl2br($str)) ; 19.如何读取当前地址栏信息? -------------------------------- $s="http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME']}"; $se=''; foreach ($_GET as $key => $value) { $se.=$key."=".$value."&"; } $se=Preg_Replace("/(.*)&$/","$1",$se); $se?$se="?".$se:""; echo $s."?$se"; ?> -------------------------------- 20.点击后退按钮后为什么之前填写的东西不见了? 这是因为使用了session,解决办法: -------------------------------- session_cache_limiter('private, must-revalidate'); session_start(); //........... ?> -------------------------------- 21.图片里显示IP地址是怎么做到的? -------------------------------- header("Content-type: image/png"); $img = imagecreate(180,50); $ip = $_SERVER['REMOTE_ADDR']; imagecolortransparent($img,$bgcolor); $bgColor = imagecolorallocate($img, 0x2c,0x6D,0xAF); // 背景颜色 $shadow = imagecolorallocate($img, 250,0,0); // 阴影颜色 $textColor = imagecolorallocate($img, oxff,oxff,oxff); // 字体颜色 imagettftext($img,10,0,78,30,$shadow,"c:/windows/fonts/Tahoma.ttf",$ip); //显示背景 imagettftext($img,10,0,25,28,$textColor,"c:/windows/fonts/Tahoma.ttf","your ip is".$ip);//显示IP imagepng($img); imagecreatefrompng($img); imagedestroy($img); ?> -------------------------------- 22.如何得到用户的真实IP? -------------------------------- function iptype1 () { if (getenv("HTTP_CLIENT_IP")) { return getenv("HTTP_CLIENT_IP"); } else { return "none"; } } function iptype2 () { if (getenv("HTTP_X_FORWARDED_FOR")) { return getenv("HTTP_X_FORWARDED_FOR"); } else { return "none"; } } function iptype3 () { if (getenv("REMOTE_ADDR")) { return getenv("REMOTE_ADDR"); } else { return "none"; } } function ip() { $ip1 = iptype1(); $ip2 = iptype2(); $ip3 = iptype3(); if (isset($ip1) && $ip1 != "none" && $ip1 != "unknown") { return $ip1; } elseif (isset($ip2) && $ip2 != "none" && $ip2 != "unknown") { return $ip2; } elseif (isset($ip3) && $ip3 != "none" && $ip3 != "unknown") { return $ip3; } else { return "none"; } } echo ip(); ?> -------------------------------- 23.如何从数据库中读取三天内的所有记录? 表格里要有一个DATETIME字段记录时间,格式为'2003-7-15 16:50:00': -------------------------------- $sql="SELECT * FROM `xhtml` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) <= 3"; -------------------------------- 24.如何远程连接Mysql数据库? 在Mysql的用户表里有一个host字段,修改为"%",或者指定允许连接的ip地址,就可以远程连接了。 $link=mysql_connect("192.168.1.80:3306","root",""); 25.从Apache得到的页面都是乱码,怎么办? (1).AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off; (2).AddDefaultCharset GB2312。 26.为什么单引号和双引号在接收页面变成\'和\"? (1).在php.ini中设置:magic_quotes_gpc = Off; (2).$str=stripcslashes($str)。 27.为什么程序运行超过30秒就停止了? set_time_limit(60);//最长运行时间一分钟 set_time_limit(0);//运行到程序自己结束,或手动停止 28.如何计算在线人数? (1).用文本实现 -------------------------------- //首先你要有读写文件的权限 //本程序可以直接运行,第一次报错,以后就可以 $online_log = "count.dat"; //保存人数的文件 $timeout = 30;//30秒内没动作者,认为掉线 $entries = file($online_log); $temp = array(); for ($i=0;$i{ $entry = explode(",",trim($entries[$i])); if (($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] > time())) { array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp } } array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."\n"); //更新浏览者的时间 $users_online = count($temp); //计算在线人数 $entries = implode("",$temp); //写入文件 $fp = fopen($online_log,"w"); flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作 fputs($fp,$entries); flock($fp,LOCK_UN); fclose($fp); echo "当前有".$users_online."人在线"; ?> -------------------------------- (2).用数据库实现: -------------------------------- # Author: Marco(hkfuk) # Contact: Crazy_Marco@msn.com $host="localhost";//mysql的host $user="root";//mysql的用戶名稱 $pw="";//mysql的密碼 $db="";//mysql資料庫名稱 $update_time="30";//更新的頻率---秒数 session_start(); if(!$_SESSION['name'])session_register("name"); ############################################ $con=mysql_connect($host,$user,$pw) or die("不可以連接資料庫"); $now=time(); mysql_select_db($db,$con) or die("錯誤的資料庫$db"); if(!empty($name)) {//如果用戶已經登入了 $query=mysql_query("select count(username) from online_list where username='$name'",$con);//查詢在線到表是否已經有用戶的名稱 $result=mysql_result($query,0);//查詢的結果 if($result!=0) {//如果用戶已經在在線列表了 @mysql_query("update online_list set second_time='$now' where username='$name'",$con);//更新用戶的最後在線時間 } else {//如果用戶已經不在在線列表 @mysql_query("insert into online_list(username,userip,online_time,second_time)values('$name','$REMOTE_ADDR','$now','$now')",$con);//新增一個用戶到在線列表 } } else {//如果用戶沒有登入 $query=mysql_query("select count(userip) from online_list where userip='$REMOTE_ADDR'",$con);//查詢在線到表是否已經有訪客的ip 地址 $result=mysql_result($query,0);//查詢的結果 if($result!=0) {//如果訪客的ip地址已經在在線列表了 @mysql_query("update online_list set second_time='$now' where userip='$REMOTE_ADDR'",$con);//更新訪客的最後在線時間 } else {//如果用戶列表沒有訪客的ip地址 @mysql_query("insert into online_list(username,userip,online_time,second_time)values('訪客','$REMOTE_ADDR','$now','$now')",$con);//新增一個訪客到在線列表 } } $del_time=$now-$update_time; @mysql_query("delete from online_list where second_time<$del_time",$con);//刪除在$update_time秒內沒有動作的用戶 ?> -------------------------------- 29.怎么用PHP解释字符? 输入2+2*(1+2),要想自动输出8,可以用eval函数。 --------------------------------
$str=$_POST['str']; eval("\$o=$str;"); echo "$o"; ?> -------------------------------- 另外,用此函数必须特别小心!!如果有人输入format d:\会是什么结果? 30.如何计算一个页面运行多长时间? 下面的代码加在开始计时的地方: -------------------------------- function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } $time_start = getmicrotime(); ?> -------------------------------- 下面的代码加在结束计时的地方: -------------------------------- $time_end = getmicrotime(); $time = $time_end - $time_start; echo "Did nothing in $time seconds";//输出运行总时间 ?>
|