一次很好的总结

问题:
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,其内容如下:
------------------------------
<?php
ob_start();
session_start();
echo "<pre>";
echo "本页得到的_GET变量有:";
print_r($_GET);
echo "本页得到的_POST变量有:";
print_r($_POST);
echo "本页得到的_COOKIE变量有:";
print_r($_COOKIE);
echo "本页得到的_SESSION变量有:";
print_r($_SESSION);
echo "</pre>";
?>
-------------------------------
然后在php.ini中设置:include_path = "c:/php",并将debug.php放在此文件夹,
以后就可以在每个网页里包含此文件,查看得到的变量名和值。

3.如何使用Session?
凡是与session有关的,使用之前必须调用函数session_start();
(1).为session赋值:
-------------------------------
<?php
session_start();
$Name = "这是一个Session例子";
session_register("Name");//注意,不要写成:session_register("$Name");
echo $_SESSION["Name"];
//$_SESSION["Name"]="这是一个Session例子"
?>
--------------------------------
在php4.2之后,可以为session直接赋值:
--------------------------------
<?php
Session_Start();
$_SESSION["name"]="value";
?>
--------------------------------
(2).取消session:
--------------------------------
<?php
session_start();
session_unset();
session_destroy();
?>
--------------------------------
取消某个session变量在php4.2以上还有BUG。

4.为什么说headers已经发送?
session、cookie和header函数前不应该有输出。
凡是出现"........headers already sent..........",就是之前已经向浏览器输出信息。
如果很难确定之前哪里向浏览器输出信息,在页面第一行加上:
<?PHP ob_start(); ?>

5.为什么向另一页面传递变量时,以空格开头的全部丢失?
send.php:
--------------------------------
<?php
$Var="hello php";//修改为$Var="     hello php";试试得到什么结果
$post= "receive.php?Name=".$Var;
header("location:$post");
?>
--------------------------------
receive.php:
--------------------------------
<?php
echo "<pre>";
echo   $_GET["Name"];
echo "</pre>";
?>
--------------------------------

正确的方法:
send.php
--------------------------------
<?php
$Var="hello php";
$post= "receive.php?Name=".urlencode($Var);
header("location:$post");
?>
--------------------------------
在接收页面你不需要使用urldecode(),变量会自动解码。

6.如何正确截取汉字,而不会以?结尾?
--------------------------------
<?php
$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格式的字符串照原样显示?
--------------------------------
<?php
$str="<h1>PHP</h1>";
echo "被解释过的: ".$str."<br>经过处理的:";
echo htmlentities(nl2br($str));
?>
--------------------------------

9.如何在函数中取得函数外的变量值?
--------------------------------
<?php
$a="PHP";
foo();
function foo()
{
        global $a;//删除这里看看是什么结果
        echo "$a";
}
?>
--------------------------------

10.如何知道系统默认支持的函数?
--------------------------------
<?php
$arr = get_defined_functions();
echo   "<pre>";
echo   "这里显示系统所支持的所有函数,和自定以函数php/n";
print_r($arr);
echo   "</pre>";
?>
--------------------------------

11.如何比较两个日期相差多少天?
--------------------------------
<?php
$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文件就相当于
--------------------------------
<?php
include "auto_prepend_file.php" ;

.......//这里是你的程序

include "auto_append_file.php";
?>
--------------------------------

14.如何利用PHP上传文件?
--------------------------------
<html><head>
<title>上载文件表单</title></head>
<body>
<form enctype="multipart/form-data" action="" method="post">
请选择文件: <br>
<input name="upload_file" type="file"><br>
<input type="submit" value="上传文件">
</form>
</body>
</html>

<?
$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 "<p>你上传了文件:";
echo $_FILES['upload_file']['name'];
echo "<br>";
//客户端机器文件的原名称。
echo "文件的 MIME 类型为:";
echo $_FILES['upload_file']['type'];
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
echo "<br>";
echo "上传文件大小:";
echo $_FILES['upload_file']['size'];
//已上传文件的大小,单位为字节。
echo "<br>";
echo "文件上传后被临时储存为:";
echo $_FILES['upload_file']['tmp_name'];
//文件被上传后在服务端储存的临时文件名。
echo "<br>";
$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)运行下面程序进行测试:
--------------------------------
<?php
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.用户是从哪个网站连接到本页的?
--------------------------------
<?php
//必须通过超级链接进入才有输出
echo $_SERVER['HTTP_REFERER'];
?>
--------------------------------

18.数据存入数据库和取出显示在页面需要注意什么?
入库时:
$str=addslashes($str);
$sql="insert into `tab` (`content`) values('$str')";
出库时:
$str=stripslashes($str);
显示时:
$str=htmlspecialchars(nl2br($str)) ;

19.如何读取当前地址栏信息?
--------------------------------
<?php
$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,解决办法:
--------------------------------
<?php
session_cache_limiter('private, must-revalidate');
session_start();
//...........
?>
--------------------------------

21.图片里显示IP地址是怎么做到的?
--------------------------------
<?php
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?
--------------------------------
<?php
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).用文本实现
--------------------------------
<?php
//首先你要有读写文件的权限
//本程序可以直接运行,第一次报错,以后就可以
$online_log = "count.dat"; //保存人数的文件
$timeout = 30;//30秒内没动作者,认为掉线
$entries = file($online_log);

$temp = array();

for ($i=0;$i<count($entries);$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).用数据库实现:
--------------------------------
<?php
# 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函数。
--------------------------------
<form method=post action="">
<input type="text" name="str"><input type="submit">
</form>
<?php
$str=$_POST['str'];
eval("/$o=$str;");
echo "$o";
?>
--------------------------------
另外,用此函数必须特别小心!!如果有人输入format d:/会是什么结果?

30.如何计算一个页面运行多长时间?
下面的代码加在开始计时的地方:
--------------------------------
<?php
function getmicrotime()
{
        list($usec, $sec) = explode(" ",microtime());
        return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
?>
--------------------------------
下面的代码加在结束计时的地方:
--------------------------------
<?php
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "Did nothing in $time seconds";//输出运行总时间
?>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值