PHP常见问题汇总

来源:互联网 发布:创远家居装修系统源码 编辑:程序博客网 时间:2024/05/01 01:07

1、PHP代码中函数前面的@是什么意思?

答:@的作用是忽略调用该函数时产生的错误信息。

2、为什么出现“APACHE.EXE: cannot determine local host name.”?

答:由于Windows版本的Apache默认情况下不指定ServerName,所以运行时会出错。 解决的办法是修改Apache安装目录下的conf目录下的httpd.conf:

- 搜索ServerName

- 去掉前面的#号

- 把ServerName后面的值换成你自己的设置,如localhost之类的

- 保存,重新启动Apache

3、在Windows NT/9x,为什么会出现“Can't connect to MySQL server on 'localhost' <10061>”?

答:MySQL虽然小巧,但毕竟不同于一般的文件数据库,而是一个应用服务器,所以在使用客户程序如mysql之前,必须启动MySQL服务器。方法是在MySQL的bin目录下运行(哪个文件存在就运行哪个):

mysqld.exe



mysqld-shareware.exe

4、关于PHP与Sybase数据库的连接与使用

答:

很高兴看到大家在使用Sybase,在使用本站php_sybct.dll模块时,不少网友遇到问题,

现将网友们的问题解释如下:

1.注意你的PHP版本,我只使用PHP官方源代码(http://php.net)编译PHP.而且,在PHP4里,我发现

每一个版本都稍有区别(主要与ZEND有关),因此PHP4的模块严格区分PHP版本,PHP4RC1的模块不

可能在PHP4.0.0中使用.有网友使用swwwing.com公司的PHP编译版,我不能保证你一定能使用本

模块.

2.正确配置你的PHP,保证你的机器在系统可遍历的路径里只有一个php.ini,并配置正确,建议的

做法: 将php_sybct.dll拷至php4所在目录,如c:/php4,修改php.ini(一般位于Windows目录或

WinNT目录)中extension_dir=c:/php4 增加 extension=php_sybct.dll 注意=号两边不要有空

格;运行php_info();,查看PHP输出信息,若找到sybase_ct信息,证明模块加载成功.否则,就是

你的PHP版本与本模块不匹配.其实最简单办法是看有没有什么 'X-Powered By...' 信息,若有,

则模块肯定与PHP版本不匹配!

3.正确安装并配置好Sybase Client端,PHP连接Sybase数据库不是凭空的,它需要Sybase Client

DLL的支持.使用SQLEDIT为Web数据库增加一个数据服务(当然,这不是必须的,你可以使用现有

的数据服务)SybWeb,正确填写配置参数后,存盘退出. 使用SybasePing工具,确保SybWeb服务能

ing通Sybase Server.

4.编写PHP代码,连接数据库,使用sybase_pconnect("SybWeb","sa","sapass");//sapass为sa用

户的连接密码.Sybase会提示诸如"changed database to master..."等信息,若想屏蔽这些信

息,可在函数前加'@',sybase_select_db("Your DataBase Name")函数前也应加'@'.

5.其它问题:

*关于非法操作

其一可能与本机有关,如Sybase Client安装不正确,或Win9x系统有问题.你可以移植到WinNT

试试;

其二可能与Sybase Client版本有关,我使用SybaseCT Version 11.0.2编译的本模块,后来有网

友提供了Version 11.9.2,我将在PHP4.0.1(含)以后的版本中使用.就像MSSQL有65与70一

样,Sybase也会有版本区分.此模块我发给过不少国外的网友,他们使用都很正常.我想是因

为老外不像国人那么时髦,什么都用最新的缘故.

*关于Linux或UNIX下Sybase的连接

我没有使用两种系统下的Sybase,因此无法测试,但国内外都有网友使用本模块成功的建立了与

Sybase for Lunix的连接.我想都是基于TCP/IP的,并不奇怪.不过,应注意,此时的SybWeb服务应

基于TCP/IP(NLWNSCK)而不是命名管道(NLMSNMP).

*关于Sybase SQL Any Where

有网友使用本模块连接 Sybase SQL Any Where,这是Sybase的一种小型化的基于桌面的数据库

系统,可能无法使用本模块.



我使用Win98+Apache1.3.12+Sybase system 11(Client)+PHP4.0.0作开发;

数据库为 WinNT4+Sybase system11;

Web Server为Apache1.3.12(运行于WinNT)+PHP4.0.0,暂时与数据库 Server 同机;

使用一直正常.

(由Sunny Wang提供)

 

5、为什么在WINDOWS下使用PHP4的SESSION功能老是报路径出错?

答:这个可能是PHP4.0在WINDOWS下的一个BUG,希望能在以后的版本里得到彻底解决。目前的解决办法是把保存SESSION的路径设为当前路径(只有这样,才不会包错)。

方法是修改php.ini,把

ession.save_path

的值设为

./

 

6、如何在WIN2K下把MYSQL安装成自动的服务?

答:MYSQL在WINDOWS NT 4下很容易被安装成自动启动的服务,但WINDOWS 2000下却要出错?为什么呢?经过查找终于发现了问题所在:

执行mysqld-shareware --install后,将在WINDOWS的服务里增加一项,但这项的执行文件却是mysqld.exe,而不是mysqld- shareware.exe,所以,我的解决办法是把mysqld-shareware.exe复制为mysqld.exe。再启动WINDOWS 2000,一切OK!

7、运行PHP4出现X-Powered-By和Content-type: text/html问题的解决

答:这两条信息本来是HTTP协议头的一部分,也就是说它们是不应该出现在浏览器里的,但为何却出现了呢?

原因是在PHP输出这两条信息之前已经有过浏览器不认识(不是HTTP协议头)的内容,最大的可能就是PHP本身出错,比如调用某个DLL时。

解决的办法是在DOS提示符下运行:

C:/PHP/PHP.EXE

(注意要换成你自己的PHP目录)

看看是否有什么不正常的信息,然后看情况休整错误即可。

8、如何从Linux下访问Microsoft SQL Server?

答:Bill Gates肯定不会提供Linux下的MS SQL驱动程序,那么如何从Linux下访问MS SQL呢?请看:

 

 

确认能够通过TCP/IP PING通MS SQL服务器的那台机器

确认MS SQL上建立了基于TCP/IP的连接方式,默认情况下是命名管道的

对于MS SQL 6.5及更低版本,用Sybase CT库就足够了;对于MS SQL 7及以上版本,要用到TDS。要得到Sybase CT库,有两个办法:到这里下载SYBASE ASE 11.0.3(几十M),或到这里下载SYBASE CT库(几M)。至于TDS,可以到其官方站点去下载。

设置指向MS SQL服务器的interface文件,这里有个例子:

--------------------------------------

t

master tcp ether 192.168.0.1 1443

query tcp ether 192.168.0.1 1443

--------------------------------------

其中1443是MS SQL服务器的默认端口号

以SYBASE的用户登陆到Linux,测试和MS SQL之间的连接:

isql -U -P -S

如:

isql -Uhunte -Pmypass -Snt

看能够执行一些查询。

参考PHP/TDS的编译指南,把所需的库编译进PHP:

./configure --with-sybase=/path/to/sybase

###################################################################################

###################################################################################

###################################################################################

1、关于PHP重定向
方法一:header("Location: index.php");
方法二:echo "<script>window.location =/"$PHP_SELF/";</script>";
方法三:echo "<META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php">";

####################################################################################

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服务器(网上很难找到) Chinaz_com

php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器


【6】初装的mysql如果没有设置密码,应该使用 Chinaz@com

update mysql.user set password="yourpassword" where user="root" Www~Chinaz~com

修改密码 中.国.站长站

【7】header already sent 字串4


这个错误通常在你使用HEADER的时候出现,他可能是几种原因:1,你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。


【8】更改php.ini后没有变化


重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置


【9】php在2003上面安装


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】include和require的区别


两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出 Chinaz~com

据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许*nux下情况不同,暂时还没测试 [中国站长站]

如果一个文件不想被包含多次可以使用include_once或require_once## 读取,写入文档数据 中国.站长站
以下为引用的内容:
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;
}

 

【12】isset()和empty()的区别 站.长.站

两者都是测试变量用的 中国站长.站

但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空


如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示

如果一个变量被赋空值,$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。 Chinaz~com

要注销一个变量,可以用 unset($foo)或者$foo=NULL 站.长.站

【13】mysql查询语句包含有关键字


php查询mysql的时候,有时候mysql表名或者列名会有关键字 Chinaz_com

这时候查询会有错误。例如表名是order,查询时候会出错 Chinaz^com

简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别


例如select * from `order` Chinaz~com

【14】通过HTTP协议一次上传多个文件的方法


有两个思路,是同一个方法的两种实现。具体程序还需自己去设计


在form中设置多个文件输入框,用数组命名他们的名字,如下:
以下为引用的内容:
<form action="" method=post>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
</form>

Chinaz@com

这样,在服务器端做以下测试
以下为引用的内容:
echo "<pre>";
print_r($_FILES);
echo "</pre>";


在form中设置多个文件输入框,但名字不同,如下: Chinaz^com
以下为引用的内容:
<form action="" method=post>
<input type=file name=usefile_a>
<input type=file name=usefile_b>
<input type=file name=usefile_c>
</form>

Chinaz@com

在服务器端做同样测试:

以下为引用的内容:

echo "<pre>";
print_r($_FILES);
echo "</pre>"; Www~Chinaz~com

 

###############################################################################

PHP 和 MySQL 开发的 8 个技巧

LAMP 架构的网站,我以前注重的多是安装/配置方面的,讲述开发的相对较少,因为自己从事开发也少。本文的原文当然也来自:

Published on The O'Reilly Network (http://www.oreillynet.com/)
http://www.oreillynet.com/pub/a/onlamp/2002/04/04/webdb.html

看了以后,颇有启发,以前开发中遇到的一些问题,迎刃而解。所以翻译出来和大家共享。

1. PHP 中数组的使用
在操作数据库时,使用关联数组(associatively-indexed arrays)十分有帮助,下面我们看一个基本的数字格式的数组遍历:

$temp[0] = "richmond";
$temp[1] = "tigers";
$temp[2] = "premiers";

for($x=0;$x
{
echo $temp[$x];
echo " ";
}
?>

然而另外一种更加节省代码的方式是:

$temp = array("richmond", "tigers", "premiers");
foreach ($temp as $element)
echo "$element ";
?>

foreach 还能输出文字下标:

$temp = array("club" => "richmond",
"nickname" =>"tigers",
"aim" => "premiers");

foreach ($temp as $key => $value)
echo "$key : $value ";
?>
PHP 手册中描述了大约 50 个用于处理数组的函数。

2. 在 PHP 字符串中加入变量

这个很简单的:

$temp = "hello"
echo "$temp world";
?>

但是需要说明的是,尽管下面的例子没有错误:
$temp = array("one" => 1, "two" => 2);
// 输出:: The first element is 1
echo "The first element is $temp[one].";
?>

但是如果后面那个 echo 语句没有双引号引起来的话,就要报错,因此建议使用花括号:

$temp = array("one" => 1, "two" => 2);
echo "The first element is {$temp["one"]}.";
?>


3. 采用关联数组存取查询结果
看下面的例子:

$connection = mysql_connect("localhost", "albert", "shhh");
mysql_select_db("winestore", $connection);

$result = mysql_query("SELECT cust_id, surname,
firstname FROM customer", $connection);

while ($row = mysql_fetch_array($result))
{
echo "ID:/t{$row["cust_id"]}/n";
echo "Surname/t{$row["surname"]}/n";
echo "First name:/t{$row["firstname"]}/n/n";
}
?>

函数 mysql_fetch_array() 把查询结果的一行放入数组,可以同时用两种方式引用,例如 cust_id 可以同时用下面两种方式:$row["cust_id"] 或者$row[0] 。显然,前者的可读性要比后者好多了。

在多表连查中,如果两个列名字一样,最好用别名分开:

SELECT winery.name AS wname,
region.name AS rname,
FROM winery, region
WHERE winery.region_id = region.region_id;


列名的引用为:$row["wname"] 和 $row["rname"]。


在指定表名和列名的情况下,只引用列名:

SELECT winery.region_id
FROM winery

列名的引用为: $row["region_id"]。

聚集函数的引用就是引用名:

SELECT count(*)
FROM customer;

列名的引用为: $row["count(*)"]。

4. 注意常见的 PHP bug

常见的 PHP 纠错问题是:

No page rendered by the Web browser when much more is expected
A pop-up dialog stating that the "Document Contains No Data"
A partial page when more is expected

出现这些情况的大多数原因并不在于脚本的逻辑,而是 HTML 中存在的 bug 或者脚本生成的 HTML 的 bug 。例如缺少类似
, , 之类的关闭 Tag,页面就不能刷新。解决这个问题的办法就是,查看 HTML 的源代码。

对于复杂的,不能查到原因的页面,可以通过 W3C 的页面校验程序 http://validator.w3.org/ 来分析。

如果没有定义变量,或者变量定义错误也会让程序变得古怪。例如下面的死循环:

for($counter=0; $counter<10; $Counter++)
myFunction();
?>

变量 $Counter 在增加,而 $counter 永远小于 10。这类错误一般都能通过设置较高的错误报告级别来找到:

error_reporting(E_ALL);

for($counter=0; $counter<10; $Counter++)
myFunction();
?>

5. 采用 header() 函数处理单部件查询

在很多 Web 数据库应用中,一些功能往往让用户点击一个连接后,继续停留在当前页面,这样的工作我叫它“单部件查询”。

下面是一个叫做 calling.php 的脚本:


"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >

当用户点击上面的连接时,就去调用 action.php。下面是 action.php 的源码:

// 数据库功能

// 重定向
header("Location: $HTTP_REFERER");
exit;
?>

这里有两个常见的错误需要提醒一下:
调用 header() 函数后要包含一个 exit 语句让脚本停止,否则后续的脚本可能会在头发送前输出。


header() 函数常见的一个错误是:

Warning: Cannot add header information - headers already sent...

header() 函数只能在 HTML 输出之前被调用,因此你需要检查 php 前面可能存在的空行,空格等等。

6. reload 的问题及其解决
我以前在写 PHP 程序时,经常碰到页面刷新时,数据库多处理一次的情况。
我们来看 addcust.php:

$query = "INSERT INTO customer
SET surname = $surname,
firstname = $firstname";
$connection = mysql_connect("localhost", "fred", "shhh");
mysql_select_db("winestore", $connection);
$result = mysql_query($query, $connection);
?>

"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >

I've inserted the customer for you.
?>
假设我们用下面的连接使用这个程序:

http://www.freelamp.com/addcust.php?surname=Smith&firstname=Fred

如果这个请求只提交一次,OK ,不会有问题,但是如果多次刷新,你就会有多条记录插入。
这个问题可以通过 header() 函数解决:下面是新版本的 addcust.php:

$query = "INSERT INTO customer
SET surname = $surname,
firstname = $firstname";
$connection = mysql_connect("localhost", "fred", "shhh");
mysql_select_db("winestore", $connection);
$result = mysql_query($query, $connection);
header("Location: cust_receipt.php");
?>
这个脚本把浏览器重定向到一个新的页面:cust_receipt.php: www.w3sky.com


"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >

I've inserted the customer for you.


这样,原来的页面继续刷新也没有副作用了。

7. 巧用锁机制来提高应用性能
如果我们要紧急运行一个报表,那么,我们可以对表加写锁,防治别人读写,来提高对这个表的处理速度。

8. 用 mysql_unbuffered_query() 开发快速的脚本
这个函数能用来替换 mysql_query() 函数,主要的区别就是 mysql_unbuffered_query() 执行完查询后马上返回,不需要等待或者对数据库加锁。

但是返回的行数不能用mysql_num_rows() 函数来检查,因为输出的结果集大小未知。

 

##################################################################

1:为什么我得不到变量

我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值?

在PHP4.2以后的版本中register_global默认为off
若想取得从另一页面提交的变量:

方法一:在PHP.ini中找到register_global,并把它设置为on.
方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).
方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等,这种方法虽然麻烦,但比较安全.

2:调试你的程序

在运行时必须知道某个变量为何值。我是这样做的,建立一文件debug.php,其内容如下:

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();

为session付值很简单,如:


PHP代码:--------------------------------------------------------------------------------

<?php
Session_start();
$Name = "这是一个Session例子";
Session_Register("Name");//注意,不要写成:Session_Register("$Name");
Echo $_SESSION["Name"];
//之后$_SESSION["Name"]为"这是一个Session例子"
?>

--------------------------------------------------------------------------------

 

在php4.2之后,可以为session直接付值:

PHP代码:--------------------------------------------------------------------------------

<?PHP
Session_Start();
$_SESSION["name"]="value";
?>

--------------------------------------------------------------------------------

取消session可以这样:

PHP代码:--------------------------------------------------------------------------------

<?php
session_start();
session_unset();
session_destroy();
?>

--------------------------------------------------------------------------------


取消某个session变量在php4.2以上还有BUG.

 

注意:

1:在调用Session_Start()之前不能有任何输出.例如下面是错误的.
==========================================
1行
2行 <?PHP
3行 Session_Start();//之前在第一行已经有输出
4行 .....
5行 ?>
==========================================


提示1:

凡是出现"........headers already sent..........",就是Session_Start()之前向浏览器输出信息.
去掉输出就正常,(COOKIE也会出现这种错误,错误原因一样)

提示2:

如果你的Session_Start()放在循环语句里,并且很难确定之前哪里向浏览器输出信息,可以用下面这种方法:
1行 <?PHP Ob_Start(); ?>
........这里是你的程序......

 

2:这是什么错误

Warning: session_start(): open(/tmp/sess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:....
因为你没有指定session文件的存放路径.

解决方法:
(1)在c盘建立文件夹tmp
(2)打开php.ini,找到session.save_path,修改为session.save_path= "c:/tmp"

 

4:为什么我向另一网页传送变量时,只得到前半部分,以空格开头的则全部丢失


PHP代码:--------------------------------------------------------------------------------

<?php
$Var="hello php";//修改为$Var="     hello php";试试得到什么结果
$post= "receive.php?Name=".$Var;
header("location:$post");
?>

--------------------------------------------------------------------------------

receive.php的内容:

PHP代码:--------------------------------------------------------------------------------

<?PHP
Echo "<pre>";
Echo   $_GET["Name"];
Echo "</pre>";
?>

--------------------------------------------------------------------------------


正确的方法是:

PHP代码:--------------------------------------------------------------------------------

<?php
$Var="hello php";
$post= "receive.php?Name=".urlencode($Var);
header("location:$post");
?>

--------------------------------------------------------------------------------


在接收页面你不需要使用Urldecode(),变量会自动编码.


5:如何截取指定长度汉字而不会出现以"?>"结尾,超出部分以"..."代替


一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字,包括标点.

PHP代码:--------------------------------------------------------------------------------

<?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;
}

--------------------------------------------------------------------------------

 

6:规范你的SQL语句


在表格,字段前面加上"`",这样就不会因为误用关键字而出现错误,
当然我并不推荐你使用关键字.

例如
$Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')"

"`"怎么输入? 在TAB键上面.


7:如何使Html/PHP格式的字符串不被解释,而是照原样显示


PHP代码:--------------------------------------------------------------------------------

<?PHP
$str="<h1>PHP</h1>";
Echo "被解释过的: ".$str."<br>经过处理的:";
Echo   htmlentities(nl2br($str));
?>

--------------------------------------------------------------------------------

 

8:怎么在函数里取得函数外的变量值


PHP代码:--------------------------------------------------------------------------------

<?PHP
$a="PHP";
foo();
Function foo()
{
  global $a;//删除这里看看是什么结果
  Echo "$a";
}
?>

--------------------------------------------------------------------------------

 

9:我怎么知道系统默认支持什么函数


PHP代码:--------------------------------------------------------------------------------

<?php
$arr = get_defined_functions();
Function php() {
}
echo   "<pre>";
Echo   "这里显示系统所支持的所有函数,和自定以函数php/n";
print_r($arr);
echo   "</pre>";
?>
--------------------------------------------------------------------------------


10:如何比较两个日期相差几天


PHP代码:--------------------------------------------------------------------------------

<?PHP
$Date_1="2003-7-15";//也可以是:$Date_1="2003-6-25 23:29:14";
$Date_2="1982-10-1";
$Date_List_1=explode("-",$Date_1);
$Date_List_2=explode("-",$Date_2);
$d1=mktime(0,0,0,$Date_List_1[1],$Date_List_1[2],$Date_List_1[0]);
$d2=mktime(0,0,0,$Date_List_2[1],$Date_List_2[2],$Date_List_2[0]);
$Days=round(($d1-$d2)/3600/24);
Echo   "偶已经奋斗了 $Days 天^_^";
?>

--------------------------------------------------------------------------------


11:为什么我升级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.以后任何错误都不会提示.

那什么是error_reporting?

 

12:我想在每个文件最前,最后面都加上一文件.但一个一个添加很麻烦

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代码:--------------------------------------------------------------------------------

<?php
Include "auto_prepend_file.php" ;

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


Include "auto_append_file.php";
?>

--------------------------------------------------------------------------------

 


13:如何利用PHP上传文件

 

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'];

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;
}
?>

--------------------------------------------------------------------------------

 

14:如何配置GD库


下面是我的配置过程
1:用dos命令(也可以手动操作,拷贝dlls文件夹里所有dll文件到system32目录下) copy c:/php/dlls/*.dll c:/windows/system32/
2:打开php.ini
设置extension_dir = "c:/php/extensions/";
3:
extension=php_gd2.dll;把extension前面的逗号去掉,如果没有php_gd2.dll,php_gd.dll也一样,保证确实存在这一文件c:/php/extensions/php_gd2.dll
4:运行下面程序进行测试

PHP代码:--------------------------------------------------------------------------------

<?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);
?>

--------------------------------------------------------------------------------

 

点击这里查看结果

 

15:什么是UBB代码


UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序,国内也有不少地方使用这个程序)采用的一种特殊的TAG.
即使禁止使用 HTML,你也可以用 UBBCode? 来实现.也许你更希望使用 UBBCode? 而不是 HTML, 即使论坛允许使用 HTML, 因为使用起来代码较少也更安全.

Q3boy的UBB里面付有例子,可以直接运行测试


16:我想修改MySQL的用户,密码

首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的,
所以一般用户无法更改密码,除非请求管理员.

方法一
  使用phpmyadmin,这是最简单的了,修改mysql库的user表,
  不过别忘了使用PASSWORD函数。

方法二
  使用mysqladmin,这是前面声明的一个特例。
  mysqladmin -u root -p password mypasswd
  输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。
  把命令里的root改为你的用户名,你就可以改你自己的密码了。
  当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,
  那么这种方法就是无效的。
  而且mysqladmin无法把密码清空。

下面的方法都在mysql提示符下使用,且必须有mysql的root权限:
  方法三
  mysql> INSERT INTO mysql.user (Host,User,Password)
  VALUES('%','jeffrey',PASSWORD('biscuit'));
  mysql> FLUSH PRIVILEGES
  确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。
  在《mysql中文参考手册》里有这个例子,所以我也就写出来了。
  注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。

方法四
  和方法三一样,只是使用了REPLACE语句
  mysql> REPLACE INTO mysql.user (Host,User,Password)
  VALUES('%','jeffrey',PASSWORD('biscuit'));
  mysql> FLUSH PRIVILEGES

方法五
  使用SET PASSWORD语句,
  mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
  你也必须使用PASSWORD()函数,
  但是不需要使用FLUSH PRIVILEGES。

方法六
  使用GRANT ... IDENTIFIED BY语句
  mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
  这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。

注意: PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。


17:我想知道他是通过哪个网站连接到本页

 

PHP代码:--------------------------------------------------------------------------------

<?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代码:--------------------------------------------------------------------------------

<?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代码:--------------------------------------------------------------------------------

<?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,"d:/windows/fonts/Tahoma.ttf",$ip); //显示背景
  ImageTTFText($img,10,0,25,28,$textColor,"d:/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'

SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) <= 3;


24:如何远程链接Mysql数据库


在增加用户的mysql表里有一个host字段,修改为"%",或者指定允许连接的ip地址,这样,你就可以远程调用了。

$link=mysql_connect("192.168.1.80:3306","root","");


25:正则到底怎么用

点击这里
正则表达式中的特殊字符


26:用Apache后,主页出现乱码


方法一:
AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off

方法二:
AddDefaultCharset GB2312
========================================================
tip:
大家贴代码时GB2312会被解释成??????

改成这样就不会
[color=#000000]GB[/color]2312

10:如何比较两个日期相差几天,(更简单的算法)


PHP代码:--------------------------------------------------------------------------------

<?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 天^_^";
?>

--------------------------------------------------------------------------------

 


27:为什么单引号,双引号在接受页面变成(/'/")


解决方法:
方法一:在php.ini中设置:magic_quotes_gpc = Off
方法二: $str=stripcslashes($str)


28:怎么让程序一直运行下去,而不是超过30秒就停止


set_time_limit(60)//最长运行时间一分钟
set_time_limit(0)//运行到程序自己结束,或手动停止


29:计算当前在线人数

例子一:用文本实现

PHP代码:--------------------------------------------------------------------------------

<?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."人在线";

?>
--------------------------------------------------------------------------------

例子二:
用数据库实现在线用户


30:什么是模板,怎么用


这里有几篇关于模板的文章

我用的是phplib模板
下面是其中几个函数的使用

$T->Set_File("随便定义","模板文件.tpl");

$T->Set_Block("在set_file中定义的","<!-- 来自模板 -->","随便定义");

$T->Parse("在Set_Block中定义的","<!-- 来自模板 -->",true);

$T->Parse("随便输出结果","在Set_File中定义的");

设置循环格式为:

<!--(多于一个空格) BEGIN $handle(多于一个空格)-->

如何将模板生成静态网页

PHP代码:--------------------------------------------------------------------------------

<?php
//这里使用phplib模板
    ............
    ............
    $tpl->parse("output","html");
    $output = $tpl->get("output");// $output 为整个网页内容


    function wfile($file,$content,$mode='w') {
    $oldmask = umask(0);
    $fp = fopen($file, $mode);
    if (!$fp) return false;
    fwrite($fp,$content);
    fclose($fp);
    umask($oldmask);
    return true;
}
   // 写到文件里
    Wfile($FILE,$output);
    header("location:$FILE");//重定向到生成的网页
}
?>
--------------------------------------------------------------------------------

 

phplib下载地址 smarty下载地址


31:怎么用php解释字符

比如:输入2+2*(1+2),自动输出8
可以用eval函数

PHP代码:--------------------------------------------------------------------------------

<form method=post action="">
<input type="text" name="str"><input type="submit">
</form>
<?php
$str=$_POST['str'];
eval("/$o=$str;");
Echo   "$o";
?>

--------------------------------------------------------------------------------


另外,用此函数必须特别小心!!
如果有人输入format: d:会是什么结果?


 

 

 

 

 

原创粉丝点击