发布新日志

  • db2 命令行执行sql脚本

    2007-05-21 20:03:59

    1.

    db2 -td@ -f filename
    @是语句结束符。

    2.

    db2 -tvf sample.sql

  • PHP学习笔记(八)——PHP/数据库常见问题

    2007-01-17 17:35:54

    1.没有连接

     

    如果在PHP脚本中有数据库调用函数,但是不能打开连接。有两种可能会导致这种情况。

           第一种可能性是警告没有连接:

           Warning MySQL Connection Failed Can’t connect to MySQL server on ‘localhost’(10061) in …

           这说明问题出自MySQL服务器本身,或者出自连接mysqld的路径。在PHP自己的特殊方式中,PHP告诉它知道MYSQL,但是不能连上。

           第二种可能是问题出在PHP这方面。

           Fatal error Call to undefined function mysql_connect() in ….

           这意味着PHP根本不知道MYSQL

           在这两种错误中,解决致命错误(fatal error)要简单得多。如果遇到的未定义函数确定是PHP函数集中的函数,就可以很明确地确定只是忘了安装该模块。在UNIX中,需要用“-with-mysql”选项重新编译。在WINDOWS中,修改php.ini文件即可。

           看起来无关紧要的“No Connection”错误实际上较难诊断,因为有几个可能的原因。主要分为两类:

    l         MYSQL后台程序没有运行

    l         MYSQL套接字不是PHP寻找的内容

     

    很容易检查mysqld是否在运行,所以可以首先进行检查。只要使用能检查出是否运行的任何方法即可。

           通常在第一次从新的服务器上启动MYSQL时出现套接字问题。虽然发生过这样的问题,但是在长期运行的站点上这种问题不是经常发生。

           通常能在php.ini文件中找到解决数据库连接问题的方法。有一部分MYSQL变量是必须仔细检查的,这些变量是在脚本中指定主机名、端口和套接字的变量。要确保没有让PHP在临时的端口或错误的默认主机上寻找MYSQL。在UNIX上,还可以检查/etc/services文件,寻找不同的套接字地址。一般情况下,应该让这些变量是公开的,除非有特殊的原因要设置它们。

     

    2.权限问题

     

     

    权限问题引起的错误提示信息:

     

    Warning MySQL Connection Failed Access denied for user:’nohost@localshot’(Using password YES) in …

     

    由于这些错误信息会引起安全性问题,最好在站点中使用静默模式,在函数mysql_connectmysql_select_db前面添加字符“@”。

           这些错误种类很多,但是主要有几种:

    l         输入错误的用户名/密码

    l         错误的使用要求的密码

    l         试图使用不存在的密码

    l         试图使用系统的用户名/密码而不是MYSQL的用户名/密码

    l         使用缺少完成任务所需的权限的数据库用户名

    l         使用MYSQL数据库不允许某个特定用户登录的位置或客户端登录

    l         由于不正确的文件权限(必须是完全可执行目录下的完全可执行文件),PHP不能打开数据库密码包含文件

    l         数据库系统故意更改权限

     

    3.未转义的引号

     

    引号能引起PHPMYSQL之间很小但很烦人的问题。问题的症结在于PHP在双引号内求值,很可能忽略单引号,而MYSQL在单引号内求值,很可能忽略双引号。这样必须考虑每个引号的作用。

           在大多数PHP脚本中,单引号内的变量不能被扩展,而双引号或没有引号的变量是被扩展的——所以查询看上去有些奇怪。但是如果考虑一下,会发现在两种语言中语句都是有效的。单引号存在双引号内,所以PHP把它们当作文字字符;变量实际上在双引号内,所以PHP用变量的值代替变量。可以用以下方式考虑这种分工:在数据库查询中,PHP对双引号之间的内容操作(把单引号当作文字),然后MYSQL处理留在单引号内的内容。

           这种风格的语句也消除了引起常见的PHP错误的双引号。

           更大的问题是在文本中使用单引号和双引号的字符串。在PHPMYSQL中撇好和单引号是一样的。所以如果任何姓氏有一个撇号,则SQL语句将中断。

           PHP一侧的相应问题是有双引号的字符串。这种构建方法无疑不能实现希望的功能:

           在非常长的文本条目中,引号问题将导致把部分字符串插入到数据库中,或者完全失败,或者看起来像是不允许较长的条目而允许较短的条目。

           现在介绍处理引号问题的三种方法:

    l         直接在代码内使用字符串的情况下,可以用反斜杠转义必要的引号字符。

    $query=”INSERT INTO employee (ID, lastname, firstname) VALUES (‘NULL’,’O\’Donnell’,’Sean’)”;

    l         在用变量表示字符串的情况下,可以使用addslashes(),自动添加任何必要的反斜杠。

    $string=addslashes(“He said, ‘ I’m not angry,’ but I knew he was.”)

    $statement=mysql_query(“INSERT INTO diary (ID,entry) VALUES(‘NULL’,’$string’)”);

     

    l         可以用-with-magic-quotes选项建立PHP,实时在php.ini文件中设置魔术引号。它将添加反斜杠,而不需要每次指定addslashes()。如果ISP控制php.ini文件,那么应该仍然能更改用户自己的.htaccess文件,设置这些变量。

     

    由于一些说不清的心里原因,许多PHP用户非常不愿意使用addslashes()stripslashes()。当人们实际上不应该使用引号时,他们总是使用单引号,因此就不必转义双引号。在任何时候这样的用法都是不好的风格,尤其在使用数据库时特别危险。

    当向数据库中插入值时需要添加反斜杠;相反,当从数据库中得到字符串时需要去除反斜杠(除非启用了magic-quotes选项)。

    $query=”SELECT passphrase FROM userinfo WHERE username=’$username’”;

    $result=mysql_query($query);

    $query_row=msql_fetch_array($result);

    $passphrase=stripslashes($query_row[0]);

     

           如果不能实现这项任务,那么在每次把数据重新加入到MYSQL中时添加越来越多的反斜杠。在使用重新显示从数据库中取出的值的可编辑WEB表单时,经常会遇到这样的问题。

     

    4.中断的SQL语句

           除了引号问题以外,还有几个容易给数据库发送“坏”查询的方法。查询可能语法不对,或者语法正确但是引用的表不存在,或者存在什么问题使数据库不能正确地处理查询。典型的错误信息如下:

    Warning Supplied argument is not a valid MYSQL result resource in …

     

           但是如果是正确的查询语句但是由于结果集中恰巧只包含0条记录。由于在其他情况下,这意味着捕获到查询失败的错误俘获程序不能帮助检测到0记录的情况。对于使用MYSQL的程序员而言,一个有助于解决这个问题的函数是mysql_num_rows(),调用它得到查询结果的ID,返回一个整数。

           一个好的示例是:

           $result_id=mysql_query($query) or die(mysql_error());

     

    因为如果查询失败,mysql_query()将返回false值,所以只在失败时执行die()部分。如果赋值成功,则or的低运算优先顺序确保die()调用不会在赋值语句中起作用。一旦操作失败,只要脚本一打印出MYSQL设计者编制的信息最丰富的错误消息,就退出脚本。如果用户使用的数据库缺少PHP中的错误变量,就需要调用die($query)。通常一看到真正被发送的查询语句,错误就很明显了。

           如果没有在查询调用中设置检查错误的代码,则在后面的数据库代码中试图使用查询结果ID时将得到第一条坏消息。典型的模式是:

           $my_result=$mysql($bad_query);

           //…other processing and display code

           $row=mysql_fetch_row($my_result);   //error shows up here

     

           MySQL中典型的错误消息是“0 is not a mysql result identifier in [etc.]”。这不是因为检测到在失数时mysql_query()返回的0值,而是因为用户试图使用该值,就好像它是结果集中的一个有效标识符。

           虽然糟糕的查询是产生“0 is not a valid result identifier”消息的最常见的原因,但不是唯一的原因。如果错误的拼写结果标识符变量的名称(该变量是未被设定的)或者根本没有执行查询语句,也会得到该消息。如果早些俘获错误,就更容易区分这些问题。

     

    4.1拼写错误的名称

     

    最常见的拼写错误包括:表、字段和值的名称拼写错误。PHPMYSQL都是区分大小写的。

     

    4.2逗号引起的错误

     

    SQL语句内逗号要放在单引号之外。

     

     

    4.3未被引号引起来的字符串参数

     

    需要在SQL语句内把应该被数据库当作字符串数据值的任何值用单引号引起来。

     

    4.4未被设定的变量

    中断SQL语句的一个更差的方法是在语句中插入未被设定的变量。

           由于有可能出现这种问题,所以最好构建查询语句并用单个语句把它赋给变量。然后再显式调用mysql_query()。如果这样作,就非常容易添加打印或调试语句,显示出正在发送的实际的查询。

     

     

    5.数据太少或太多

           如果查询函数成功返回,但是没有显示出从数据库得到的数据,或者显示的不是预期的结果。这时则应该怀疑SQL本身。重新检查逻辑,尤其是WHERE子句。

           如果脚本正在遍历数据库记录并显示出太多的记录,则问题经常是SQL联结的约束值太少。有这样的一条约定,在WHERE子句中的约束的个数不应该低于被联结的表的数目减1

     

    6.清楚的检查

           如果在调试和查询有关的错误以及不正确的结果,比较嵌入的PHP查询得到的结果与直接对数据库进行的同样查询得到的结果,可以有助于调试程序。如果安装的程序允许直接运行SQL解释器(例如,在命令行输入mysql)以及程序之间的交叉复制和粘贴,那么可以试试一下两个步骤:

    l         PHP插入调试语句,在真正用于数据库查询调用语句之前立即打印查询语句本身(如print($query);)。

    l         把该查询语句从浏览器输入(或HTML源文件)中直接粘贴到SQL解释器中。

     

    如果查询看起来很合理,但是在SQL程序和PHP中都有问题,那么在SQL中一定存在被错过的某些语法错误或命名错误,PHP代码没有错(除非代码首先构建了该查询语句)。类似的,当数据太少或数据太多时,如果得到的结果在两个程序中都是一样的,则查询有问题。另一方面,如果在SQL解释器中结果是预期的那样,则查询语句是正确的,应该怀疑发送该查询语句以及处理结果的PHP代码有问题。

           一个常用的好技巧是非常仔细地研究任何错误消息,注意“link identifier”和“result identifier”短语。在MYSQL中,前者意味看数据库连接的标识符,后者意味着由某个查询返回的记录集的标识符。很容易混淆这两个标识符。

     

    7.小结

     

    PHP数据库中的bug通常不太难也不太微妙,但进行判断仍然有困难。一般情况下,越早在脚本中查到错误,就越早能诊断出问题的所在。尤其是在调试程序时,和数据库有关的每个语句应该有or die()子句,该子句包含丰富的错误消息。

    到目前为止,引起数据库连接问题的最常见的原因是给连接函数提供了不正确的参数(主机名、用户名和密码)。引起查询失败的最常见的原因是引号错误、未被设定的变量和拼写错误。

           如果看起来正常的数据库查询总是失败,则打印出发送数据库的每条查询语句;如果可能,试着直接把查询用于数据库。如果问题持续到PHP结束循环时,则应该把注意力放在数据库设计以及SQL查询语句上,找出问题所在。

  • PHP学习笔记(七)——提高性能

    2007-01-16 15:56:17

    1.减少连接次数和重用连接

     

    建立与数据库的初始连接从来都不是很容易的事情。除非PHP脚本在完成一些异乎寻常密集的计算任务,否则整个数据库的交互将是代码中最耗费时间和资源的部分。

           这里有两个潜在对立的目标。一方面,你会希望在代码中为打开一个全新的数据连接所进行的昂贵、耗时的调用的次数最少。这表明在页面执行期间应该一直打开连接,而不是关闭后再打开。另一方面,有时数据库程序可以支持的同时连接数有很严格的限制,表明应该在可能的情况下就关闭连接,使每个脚本连接着的时间更少,以允许同时执行更多的脚本。

     

    1.1每条语句有一个连接

    常用的规则是只要在单个页面的脚本的执行过程中需要,就一直打开单个连接。

    1.2多个结果不需要多个连接

           一个效率很低的做法是:使用许多数据库程序时,都有可能一次保留多个查询得到的结果(即使只打开了一个连接)。

     

    1.3永久的连接

    最后,如果已经确定打开新的数据库连接会降低性能,那么我们就会希望打开永久的连接。和常规的数据库连接不一样,当页面退出时不会自动断开这些连接(甚至当调用mysql_close()时也是如此),而是保存在缓冲池中以后再用。脚本第一次打开这样的连接时,其资源的耗费方式和常规数据库连接一样。但是,被执行的下一个脚本根据请求可能得到完全相同的连接,这样就省去了重新打开新连接的时间(只有在新请求的参数一样时才会重用前一个连接)。

           对于MySQL,请求这样的永久连接的PHP函数是mysql_pconnect(),使用它的方式和mysql_connect()一样。

           永久数据库连接只用于PHP的模块安装形式。如果CGI版本的PHP中请求永久连接,则只能得到常规的连接。

           除了效率能提高以外,永久数据库连接不提供超出常规数据库连接以外的任何功能。特别是,不应该期望永久数据库连接对从以前页面执行程序得到的查询或变量有任何“记忆”。

     

    2.使用数据库提供的功能

    常用的规则是,除非愿意在自己的程序中花费大量的精力优化代码,否则最好使用数据库提供的功能,而不要使用自己的解决方案实现同样的任务。

    2.1很可能比自己的方案快

    如果可能的话,任何对数据库内容的搜索或排序最好在数据库内完成,而不是用自己编写的代码完成。

     

     

    2.2用例循环却没有限制它

    正确的做法是用“WHERE”子句限制查询。WHERE子句确保首先值选出用户关心的记录。这样不仅减少通过SQL连接传递的数据,而且在数据库一端找到记录的正确位置的代码也比PHP代码快得多。

           当编写代码对从数据库中返回的数据进行排序、计算、求平均值或者对结果进行集合操作时,应该应用完全一样的参数。一般情况下,SQL中的ORDER BY语句允许根据在查询结果中有任何优先次序的字段列表,对检索出的记录预先排序,这样的排序很可能比自己编写的代码或PHP数组排序函数更有效。类似的,不要在数据库记录中据环进行计数、求和和求平均值操作,而要调查一下自己使用的数据库中的SQL语法是否支持GROUP BY结构和内部查询函数,如count()sum()average()

     

    2.3创建日期和时间字段

     

    对于大多数数据库系统,不需要通过曲折的办法把一个字段设置成当前的日期或时间。许多数据库有得到当前日期的函数,可以直接嵌在查询语句中。

           而且,即使需要存储的时间不是执行查询当前的时间,也仍然有比在脚本中构建可读的日期字符串要好的其他方法。除了返回当前日期的函数以外,许多SQL版本提供执行日期算术操作的函数——从某一个日期/时间/开始,然后加上或减去几年、几个月或几个小时。在MYSQL中,这些函数有:

    l         date_add(date,date-interval)

    l         date_sub(date,date-interval)

    这里,date-interval是包括几个时间单位和单位类型的字符串。下面的MYSQL查询语句把所有的记录设置成从现在开始的一个星期后:

    $query=”update mytable set mydate=date_add(now(),’7 days’)”;

     

    2.4寻找最后插入的记录

     

    一些数据库系统提供的另一个惊人的有用功能是寻找插入的最后一条记录的ID

           在需要插入最后一条记录的情况下,最好的方案是使数据库自己以检索的方式跟踪最后插入的ID,并在每个连接基础上进行跟踪,这样不必担心同步的问题。对于MYSQL用户,PHP提供的函数mysql_insert_id(),该函数把连接ID当作参数,返回最后插入的记录自动增长的ID

           对于许多PHP/MYSQL函数,mysql_insert_id()的连接参数是可选的,默认是最近打开的连接。

           在一些其他的数据库系统中,最近增长的ID可以是能被嵌在下一个查询中的“特殊”变量。例如,在Microsoft SQL Server上,变量是’%%identity’,它可以被嵌在查询中,检索最后插入的ID,如下所示:

           $query=”select @@identity”;

     

    3.小结

     

           数据库编码的基本原则很简单。打开和数据库的连接要耗费很多时间和资源,所以不要不必要的打开和关闭数据库连接。要记住,通道是很窄的,应该用来传输每页需要的最少数据。需要学习使用数据库提供的所有功能。SQL非常擅长排序、过滤、约束、计数和分组——使用PHP实现这些功能速度要慢。

  • PHP不能在url中传递变量

    2007-01-04 08:52:35

    全局变量没有开
    PHP全局变量自动是关闭的

    可以使用,$_GET $_POST
    POST方法传过来的就是在 $_POST 数组中.
    GET 方法传过来的就是在 $_GET  数组中.
    COOKIE 就在 $_COOKIE,
    SESSION 就在 $_SESSION
  • PHP学习笔记(六)——自提交

    2006-12-31 10:08:29

    自提交是指在单个脚本中把一个或多个表单以及表单处理程序组合在一起,使用HTMLFORM标准一次或多次把数据提交给该脚本。可以用最简单的方法实现自提交:在FORM标记中把自己指定为ACTION目标,如

        <FORM METHOD=”POST” ACTION=”myself.php”>

     

    或者使用PHP内置的独特特性:

    <FORM METHOD=”POST” ACTION=”<?php print(“$PHP_SELF”);  ?>”>

     

    提示:虽然可以选择只使用文件的路径名,但是在UNIX中内置的变量$PHP_SELF更好。如果重新命名或者移动文件(不必说,要移到能使用PHP的目录中),那么能继续正确地处理文件。另一方面,也有关于这个预定义的变量有问题的报告。

           自提交的最大优点是,可以在HTML表单中建立更标准的逻辑。例如,依赖于形成请求的地点显示稍微不同的表单。或者有时遇到这样的情况,HTML表单只能有一个ACTION属性目标——意味着每个表单只能把数据发送给一个表单处理程序。而使用PHP,可以根据访问者自己设置的首选项有差别的处理表单。

           自提交有时需要考虑更强大的功能和灵活性,因此事情就变得有点复杂了,因此需要提到几个技巧:

           最有用的技巧是隐藏的阶段变量。这样能跟踪出表单把值提交给自己多少次,从而得出已经到了多阶段进程的哪个阶段。程序员需要使用这样的变量(它可以被命名为任何内容,使用字符串类型比整数类型好)指示出是否应该调用表单和/或脚本的表单处理程序部分。

           自提交表单的另一个问题是导航。在传统的HTML表单中,导航是严格单向的:从表单到处理程序,再到设计者规定的任何导航设备(如果有)。但是自提交的表单不需要遵守这个规则。在每个单独的实例中,需要确定:

    l         用户是否可以多次重新提交全部或部分表单

    l         是否由用户决定何时移动表单,还是表单自动使用户移动

    l         以隐藏方式还是以显示方式把变量传递给下一页

    l         是否控制用户下一步转到那里或给用户多种选择

    这些问题的答案将确定是否需要控制、需要另一个表单、需要简单的链接还是多个链接。

     

    提示:无论决定如何进行导航,都要记住,要提供大量文本,清除地解释在每一步将要发生什么事情。因为PHP对表单给出了如此的灵活性,因此新用户的默认期望值可能会错误,结束时不确定是否能结束表单的任务。

  • PHP学习笔记(五)——制作表单的PHP特殊要点

    2006-12-30 09:17:44

    l         对于每个数据项元素(INPUTSELECTTEXTAREA等等)一定要使用NAME。这些NAME属性将是PHP变量的名称。如果所见即所得式的编辑器不允许这样做,则需要记住,要手工添加这些NAME属性。

    l         表单的NAME不需要和相应的数据库字段名称一样,但是起一样的名称是一个好办法。

    l         用户可以(常常是应该)指定VALUE,而不是让PHP使用默认值。如果可能的话,把每个文本值替换成一个数字值,这是因为数据库匹配字符串比匹配整数慢得多。

    l         要记住,使用HIDDEN数据项元素可以在表单(或页)之间传递隐藏变量。

    l         要记住,可以传递一个数组中的多个变量,但是需要通知用户这是可能发生的事情。

  • Client does not support authentication protocol

    2006-12-29 08:53:01

    php连mysql时报错:

    Client does not support authentication protocol

    解决方法:

    MYSQL 帮助:
    A.2.3 Client does not support authentication protocol
    MySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server to 4.1, attempts to connect to it with an older client may fail with the following message:

    shell> mysql
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client

    To solve this problem, you should use one of the following approaches:

    Upgrade all client programs to use a 4.1.1 or newer client library.
    When connecting to the server with a pre-4.1 client program, use an account that still has a pre-4.1-style password.
    Reset the password to pre-4.1 style for each user that needs to use a pre-4.1 client program. This can be done using the SET PASSWORD statement and the OLD_PASSWORD() function:
    mysql> SET PASSWORD FOR
        -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');

    Alternatively, use UPDATE and FLUSH PRIVILEGES:
    mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
        -> WHERE Host = 'some_host' AND User = 'some_user';
    mysql> FLUSH PRIVILEGES;

    Substitute the password you want to use for ``newpwd'' in the preceding examples. MySQL cannot tell you what the original password was, so you'll need to pick a new one.
    Tell the server to use the older password hashing algorithm:
    Start mysqld with the --old-passwords option.
    Assign an old-format password to each account that has had its password updated to the longer 4.1 format. You can identify these accounts with the following query:
    mysql> SELECT Host, User, Password FROM mysql.user
        -> WHERE LENGTH(Password) > 16;

    For each account record displayed by the query, use the Host and User values and assign a password using the OLD_PASSWORD() function and either SET PASSWORD or UPDATE, as described earlier.
    For additional background on password hashing and authentication, see section 5.5.9 Password Hashing in MySQL 4.1.


    例子:
    SET PASSWORD FOR 用户名@localhost = OLD_PASSWORD('密码');

  • PHP学习笔记(四)——基本的PHP错误

    2006-12-28 09:08:03

    1.和安装有关的问题

     

     

    l         现象:文件内容显示在浏览器窗口上

    没有激活PHP引擎。确保自己确实是通过调用httpd而不是通过文件系统访问站点。

     

    l         现象:HTTP不显示文本或浏览器提示保存文件或访问外部文件库

    没有正确地调用PHP引擎。一个最常见的原因是没有指定希望PHP识别的所有文件扩展名,至少没有指定这个目录下的扩展名。第二个最常见的原因是php.ini文件位于错误的目录或者错误的配置指令。

    如果在WEB浏览器中看到PHP代码并且安装可靠,则问题可能出在缺少标记上。

     

    l         现象:没有找到服务器或主机/页面无法显示

    没有找到服务器,可能是DNSWEB服务器配置问题。

    如果能通过IP地址访问站点,而通过域名不能,则问题很可能和DNS有关。也许DNS别名还没有传遍internet。即使在站点建立一段时间以后,这个问题也偶尔会发生,或者是因为DNS服务器出了问题而又没有有效的辅助DNS的服务器,或者是因为本地internet条件的问题。

    如果不能通过IP地址访问站点,很可能是没有成功地把IP地址绑定到网络接口,或者没有成功地配置httpd处理某个域的请求。

     

    2.显示问题

     

    问题是PHP本身没有报告出错,但是用户看到的结果不是预期的内容。

     

    l         现象:完全为空的页面

    空页通常是HTML问题,而不是PHP本身的问题(除非在使用PHP生成HTML的范围内)如果不使用PHP的最大风格(换句话说,如果脚本的任何部分没有首先经过预处理就适合可显示的),几乎可以肯定问题出自HTML内。所以应该首先试试通常调试HTML的方法。

    注意:一般情况下,当面临令人迷惑的浏览器输出问题时,一个最好的调试工具时查看浏览器试图显示的HTML源代码。所有的浏览器都有一些查看源文件的命令。例如,在Internet Explorer中,该命令时“查看”菜单下的“源文件”。

    若使用纯文本编辑器编写文件,就快速地检查一遍,确保没有丢失至关重要的内容,结束标记</TABLE></FORM>。如果治安某个时期使用所见即所得式的编辑器,则问题很可能时多写了某种元素。

    通过从客户端(尤其时如果使用最大PHP风格)或从不同的浏览器查看HTML源文件,以得到有启发性的信息。

    如果没有发现HTML有任何错误(尤其时如果使用PHP的最大风格),则时PHP模块根本没起作用。通过浏览同一目录中的不同页面,测试以前核实过的内容是否正确地被PHP处理。

     

    l         现象:不完整或不是预期的页面

    这些问题通常出自脚本的HTML部分,应该按以前说明的方式进行调试。

     

    l         现象:PHP代码显示在WEB浏览器中

    很可能在某个地方忽略了PHP起始标记(假设已经成功地运行了PHP,使用了安装时设置的正确标记。)

     

    3.载入页面失败

     

    PHP不能找到要求载入的文件时,会出现两种错误。

     

    l         现象:不能找到文件

    如果浏览器不能找到已经创建的PHP页,并且最近已经安装了PHP,先看看本章的第一节。如果在载入其他PHP文件而没有问题时看到这条消息,则很可能只是拼错了文件名或路径。

     

    l         现象:打开被包含的文件失败

    PHPWindows NT/IIS  版本中,有时能看到这样的消息:

    Warning Failed opening ‘C:\InetPub\wwwroot\asdf.php’ for inclusion (include_path=’’) in [no active file ] on line 0

     

    这是“找不到文件”的NT版本——即,PHP不能载入文件的第一行,这是因为没有可用的文件。没有可用的文件是因为没找到有该名称的文件。

    NT下如果试图载入没有相应权限的文件,也可能看到这条消息。

     

    4.解析错误

    最常见的错误种类有输入错或PHP代码的语法错,这会使PHP解析引擎分不清。

     

    l         现象:解析错误消息

    虽然引起解析问题的原因有很多,但是错误现象几乎一样:解析错了可能有问题的代码行的行号。

     

    l         解析错误的一般原因:缺少分号

    如果每个PHP指令没有在合适的地方用分号结束,将会导致解析错误。

           注意:真正引起错误的地方可能就在PHP提出的一行,或者在这一行前面,但是从来不会在这行后面的代码中。

     

    l         解析错误的一般原因:没有$

    另一个非常常见的问题是缺少标识变量名的$号。如果在初始的变量赋值中缺少$号,则会得到解析错误。但是,不是这样,而是在输出变量时缺少$号,则PHP不会只是出有解析错误。

     

    l         解析错误的一般原因:模式问题

    另一系列问题起因于错误地变换PHP模式。

    如果没有正确地结束PHP代码块,则将导致解析错误。

           这种模式问题在较短的PHP代码块中很常见。相反,如果没有正确地开始PHP代码块,则剩下的代码块只不过会显示成HTML

           稍微更复杂的问题是使用“最小”PHP风格造成的,这种风格必须频繁地转入或转出HTML模式。

           另一个很常见的实例是把较短的代码块和转入转出HTML的代码块组合起来。

           这些例子说明,用户很容易在有很多小而重要的符号的页面上忘记一个元素。使用好的文本编辑器,或者首先完成和测试HTML,然后再添加PHP,这样能减少这类错误。

     

    l         解析错误的一般原因:被转义的引号

    另一种解析错误是“最大”PHP模式的特性:被转义的引号。

           需要转义的引号前面被错误的使用斜杆而不是反斜杆,或者是忘记了反斜杆。

     

    l         解析错误的一般原因:其他解析错误的原因

    任何使PHP语句变形的错误都会令解析引擎迷惑,包括没有结束的圆括号、没有结束的尖括号、没有结束的字符串、没有参数的运算符、没有圆括号的控制结构测试,等等。有时解析错误消息包括的语句会指明正在寻找什么但是没有找到,这是有用的线索。如果解析错误消息指出的代码行是文件的最后一行,则通常意味着使用了某种起始符号(引号、圆括号、大括号),但是缺少结束符号,PHP就一直找到末尾。

     

    5.文件权限

    大多数操作系统有一些文件和目录权限的模式,指定哪些用户对哪些文件有哪种访问方式。WEB服务器作为这种系统下的某个系统运行,所以一定要查看所涉及的任何文件的权限,包括HTMLPHP源文件。

     

    l         现象:HTTP error 403

    当浏览器页面显示出现403错误时,意味着文件权限不正确。一些浏览器不会提到错误代码,但是会指出没有权限访问指定的WEB页。

           最常见的原因是没有把该目录设置成完全可执行(UNIX)或启动脚本执行(Windows)。PHP脚本可用在不同于开发者自己的ID的用户ID下运行。在UNIX下,PHP通常继承“nobodyUID,它(很可能)非常受限于HTTP服务。在WINDOWS下,每个HTTP请求按匿名用户登录。

     

    l         缺少包含文件

    除了载入顶级的源文件以外,PHP还需要能载入通过include()require()载入的任何文件。

     

    l         现象:有关包含文件的警告

    问题是,在脚本的某个地方要求包含一个文件,而PHP找不到该文件。检查路径是否正确。还可能是由于区分大小写或其他输入的问题。

    如果脚本脚本试图包含在另一个目录中的文件,而PHP用户没有拥有对该目录的相应权限,这样也会得到这条消息。通常必须把目录指定为能被WEB服务器用户(在UNIX下常常是“nobody”)可读和可执行,或者通常设置成完全可读/可执行(如在UNIX下是755)。当然文件必须完全可读(通常是744)。

     

    6.未被设定的变量

    忘记给变量赋值不会直接导致错误——或者输出结果不正确,或者由于变量没有该有的值,后面的语句会报错(如果更愿意显示警告消息,可以用error_reporting(15)把错误报告级别设置成15,或者用error_reporting(E_ALL))。

     

    l         现象:变量没有出现在打印字符串中

    问题是:变量从来没有被赋过值。

     

    l         现象:数字变量出乎意料为0

    虽然在这种错误现象中可能是数学上的错误或者曲解了结果,但是更可能是实际上还没有被赋值的变量被认为赋过值。

     

    l         未被设定的变量有何作用

    一般情况下,在数字上下文中,未被设定的变量被解释成0,在字符串上下文中被解释成“”,在boolean上下文中被解释成FALSE,在数组上下文中被解释成空数组。

     

    l         大小写问题

    PHP中的变量是区分大小写的。

     

    l         范围问题

    只要没有涉及函数定义,PHP变量的范围就很简单:给一个变量赋值,它的值就从该点开始在脚本的执行过程中可用(一直到变量被重新赋值为止)。但是,在函数体内能被使用的唯一变量是形参以及被声明未全局变量的变量——如果函数体内有被被设定的变量,这很可能是程序员忘了做什么。

     

    提示:在错误报告的默认设置下,PHP不会对使用未被设定的变量发出警告,但是可以更改这种设置,临时进行这种改动常常是找到未被设定的变量问题的最快方法。只要在脚本前面放置如下一行代码:

    error_reporting(15);

    PHP将会在出现未被设定的变量时都发出警告,调试结束后可以删除该语句,或者明确的返回默认值:

    error-reporting(7);

    另一种选择是,如果总是希望被警告,就要在php.ini文件中把默认的错误报告级别更改成15

     

    7.函数问题

     

    调用函数出现的许多问题都得到“fatal errors”(致命错误),意味着PHP放弃处理脚本其余部分。

     

    l         现象:调用未定义的函数my_function()

    可能是因为拼错了函数的名称,或者是因为用户遗漏了函数定义。如果使用include/require包含文件,载入用户定义的函数,确保载入了正确的文件。

    如果问题涉及相当专业的内置函数,可能是在安装PHP时没有启用相关的函数库。

     

    l         现象:调用未定义的函数

    在这种情况下,PHP试图调用甚至不指导函数名的函数。这总是因为有$my_function()形式的代码,函数名本身是一个变量。除非有意使用PHP的变量-函数-名特性,否则很可能偶然地在my_function()调用前写了$号。因为$my_funciton是未被设定的变量,所以PHP把它解释成空字符串——它不是定义过的函数的名称——这就给出了不提供信息的错误信息。

     

    l         现象:不能重新声明my_function()

    在代码的某个位置重复定义了my_funciton()PHP不支持双重定义,确保不要使用include多次载入有函数定义的同一文件。

     

     

    l         现象:错误的参数数目

    在错误消息中指出的函数被调用时,给出的参数少于或多于应该被处

  • GET与POST方法

    2006-12-26 09:37:10

    1.GET方法

    GET方法把参数作为统一资源指示器(Uniform Resource Indicator,或者人们更习惯用统一资源定位器,Uniform Resource Locator,或URL)查询字符串的一部分,从一个页面传递到另一个页面。当用于表单处理时,GET用问号作为分隔符把变量名和值附加给在ACTION属性中指定的URL,并把所有内容提交给处理代理。

    表单处理中的GET方法有一个POST方法不具备的很大的优点:它创建了一个真正新的、完全不同的URL查询字符串。这样,用户现在可以把这一页记作书签。从使用POST方法的表单得到的结果是不能被记作书签的。

    GET方法的缺点:

    l         GET方法不适合用于登陆,因为在把用户名和密码作为访问过的页面潜在地存储在客户浏览器内存中时,在屏幕上是完全可见的。

    l         每个GET提交被记录在WEB服务器日志中,数据集也被包括在内。

    l         因为GET给服务器环境变量分配数据,所以URL的长度受到限制。

     

    尽管GET方法仍然是表单处理的默认选项,但是,笔者极力推荐只把它用于没有长期副作用的地方。把两个优点和两个缺点放在一起考虑,使用GET处理表单的最合适的用途是搜索框。除非迫不得已的原因使用GET用于非搜索性质的表单处理程序,否则使用POST

     

    使用GET更好的方法:

    在导航栏的超链接中,添加代码:

    <a href=”fleece.php?Name=alpaca”><b>alpaca</b></a>

     

    注意,当被单击时,导航栏上的链接被浏览器处理,就好像是提交了GET一样。

     

    2.POST方法

    POST是当今更好的表单处理方法,尤其适合需要得到长期的副作用效果的情况,如给数据库添加信息。当表单数据被送到处理程序时被包括在表单体内。提交的数据不同时,在URL中看不出什么变化。

     

    POST方法有以下这些优点:

    l         它比GET更安全,因为在URL查询字符串、服务器日志中,或者(如果采用了预防措施)在屏幕上从来看不到用户输入的信息。

    l         对能被传递的数据的数量限制放宽了(二千字节,而不是两百多个字符)。

    但是POST也有一些缺点:

    l         结果不能被记作书签

    l         该方法和某些防火墙设置不兼容,为了安全,防火墙要去掉表单数据

     

     

    主要有三种方法用于传递信息:GETPOST、或cookie。主要使用GET构建复杂的URL字符串,用于动态站点的模板,不被推荐用于表单。POST是被推荐用于表单的方法。

     

  • PHP学习笔记(三)——常用函数

    2006-12-25 09:13:44

    1.PHP的常用函数类型有

     

    l         变量类型函数

    l         字符串操作函数

    l         数组操作函数

    l         数学运算函数

    l         日期、时间函数

    l         文件加载函数

    l         目录操作函数

    l         文件操作函数

     

     

    2.类型转换函数

     

    类型强制转换函数用于将一种数据类型转换为另一种数据类型。

     

    l         double doubleval(mixed var)

    mixed var代表简单数据类型,包括数组和对象。该函数会将变量强制转换为浮点型。

     

    l         int intval(mixed var,int [base])

    该函数将变量强制转换为整型,int [base]是可选参数,表示以何种进位制转换为整数。

     

    l         string strval(mixed var)

    该函数将变量强制转换为字符串。

     

    通用的设定类型的函数如下:

    l         int settype(mixed var,string type)

    2个参数“string type”只能是以下值之一:“integer”、“double”、“string”、“array”、“object”。

    该函数将变量var强制转换为string type 参数中所指定的类型,如果返回成功,返回Ture,否则返回False

     

    3.判断取得数据类型的函数

     

     

    类型判断函数

    l         is_int(mixed var)is_integer(mixed var)is_long(mixed var)

    l         is_double(mixed var)is_float(mixed var)is_real(mixed var)

    l         is_string(mixed var)

    l         is object(mixed var)

    同一行中列出的函数的功能都是相同的,这些函数返回值都是布尔型,即如果参数类型与函数名类型一致,则返回True,否则返回False

     

    此外,还有一个通用的取得变量类型的函数:

    l         string gettype(mixed var)

    该函数得到变量var的类型,并返回一个字符串,字符串有如下取值:“integer”、“double”、“string”、“array”、“object”、“unknown type”,最后一个值表示无法识别的类型,比如空值等。

     

    4.其他变量类型操作函数

    PHP中还有其他一些用于变量类型操作的函数,例如:

    l         int empty(mixed var)

    如果变量var是一个非0非空的值,函数返回False,否则函数返回True

     

    l         int isset(mixed var)

    如果变量var已经被初始化,isset()函数返回True,否则返回False

     

    l         int unset(mixed var)

    取消变量的初始化,以后再用到变量var时,将是一个没有初始化的变量。

     

     

    5.简单字符串函数

     

    l         int strlen(string str)

    此函数返回字符串的长度。

     

    l         string strtolower(string str)

    此函数可以将str中的字母全部换成小写字母

     

    l         string strtoupper(string str)

    此函数可以将str中的字母全部换成大写字母。

     

    l         string chop(string str)

    此函数可以将str尾部的空格全部去掉

     

    l         string ltrim(string str)

    此函数可以将str头部的空格全部去掉

     

    l         string trim(string str)

    此函数可以将str两头的空格全部去掉

     

    l         string strrev(string str)

    此函数的作用是将参数str倒转输出。

     

    6.字符串输出函数

     

    l         echo string str1,string [strn]…

    echo 实际上是一个语句,当后面只有一个参数时才能加上括号。

     

    l         print(string str)

    此函数将不带格式输出一个字符串。

     

    l         int printf(string format,mixed [args]…)

    此函数向HTML文档中输出一个格式化字符串。

     

    l         string sprintf(string format,mixed [args]…)

    此函数向一个字符串输出一个格式化字符串。

     

    其中,printf()函数和sprintf()函数第1个参数就是一个表示格式的字符串,此字符串规定了输出的格式,由普通字符和格式转换符组成。其中的普通字符将直接输出,格式转换符则由后面的参数替代输出。

           格式转换符以“%”开头,依次包括以下几个部分。

           填充描述符(可选):指明用什么字符填充字符串的剩余空间,可以是空格(默认值)或者0,如果要使用除这二者之外的填充符,则要在所用字符前面加上一个单引号“”。

           对齐描述符(可选):指明字符串的对齐方式,默认情况下是右对齐,如果使用“-”,则表示左对齐。

           宽度描述符(可选):指明此格式转换符占用的字符宽度。

           精度描述符(可选):指明浮点数小数位数,此项只对浮点数有效。

           类型描述符(必需):指明参数类型,可用的类型如下表所示:

     

    类型描述符

    符号

    说明

    表示不需要参数

    b

    参数被转换为二进制整型

    c

    参数被转换为整型,且以ASCII码字符显示

    d

    参数被转换为十进制整型

    f

    参数被转换为浮点型

    o

    参数被转换为八进制整型

    s

    参数被转换为字符型

    x

    参数被转换为十六进制整型,a-f用小写字母表示

    X

    参数被转换为十六进制整型,a-f用大写字母表示

     

     

    除了上述几个字符串输出函数外,PHP中还提供了一个清空输出缓冲区的函数:

    Void flush(void)

     

     

    7.字符串的分割与连接函数

    l         array explode(string separator, string str)

    此函数以字符串str中的字串separatro作为分隔符将字符串分割开来,分割后的一个或多个子串以数组的形式返回。

    l         string implode(string glue,array pieces)

    此函数的作用与explode()函数的功能正好相反,其作用是将数组pieces中的元素用字符串glue连接起来形成一个完整的字符串。

    l         string strtok(string str, string token)

    此函数的作用是将字符串strtoken所只是的字符处“断开”,并返回断开处之前的字符串。此函数结合循环语句可以达到与函数explode()同样的功能。

           第一次调用strtok()函数时要传入两个参数,以后如果分界符token不变更的话,只需传入一个参数就可以了,strtok()函数会自动搜索到字符串末尾。如果要重新指定分割符,只需再次传入两个参数即可。

     

    8.字符串查找和替换函数

    l         string stristr(string str1,string str2)

    l         string strstr(string str1,string str2)

    这两个函数的作用是在字符串str1中查找字符串str21次出现的地方,如果找到,将返回str1中从str2开始剩余部分。字符串str2也可以是一个整数,函数会先将此整数转换为ASCII码,然后进行查找。其不同点在于stristr()函数不区分大小写,而strstr()函数区分大小写。strchr()函数与strstr函数的功能完全相同。

    l         string strrchr(string str1,string str2)

    此函数的作用是在字符串str1中查找最后依次出现字符串str2的首字符的地方,并返回首字符及剩余字符串,同样str2 查看(549) 评论(0) 收藏 分享 管理

  • MYSQL数据库的基本操作

    2006-12-21 08:54:52

    l         创建数据库

     

    Mysql>create database temp;

     

    注意:在“mysql>”提示符下语句结束要用“;”或者“\g”。

     

    l         删除数据库

    Mysql>drop database temp;

     

    l         选择数据库

    Mysql>use temp;

     

    l         创建数据表

    Create [temporary] table [if not exits] tablename [(createdefine,…)] [tableoptions] [selectstatemente]

    例如:

    Mysql>use temp;

     

    Musql>create table studentinfo

           ->(

           ->name char(10),

           ->id int(6)

           ->);

     

    注意:在创建数据表之前要用use语句选择数据库,否则会出错。

     

    l         删除数据表

    Mysql>drop table studentinfo;

     

    l         更改数据表

    该语句可以修改一个现有表的结构。

     

    alter [ignor] table tablename alterspec [, alterspec…]

     

    l         优化数据表

    在数据表反复修改后,可以用optimize table语句来进行优化和碎片整理工作。

    Mysql>optimize table info;

     

    l         添加记录

     

    insert [low_priority|delayed] [ignore] [into] tablename [(col_name,…)] values (expression,…),(….),…

     

    或者

    insert [low_priority|delayed] [ignore] [into] tablename [(col_name,…)] select…

     

    或者

    insert [low_priority|delayed] [ignore] [into] tablename set col_name=expression, col_name=expression,…

     

    例如:

    Mysql>insert into info(name, id) values(‘aaa’,001,);

     

    l         删除记录

     

    delete [low_priority] from tablename [where where_define] [limit rows]

    该语句将从tablename 数据表中删除满足where语句条件的记录,并返回删除记录的个数。如果没有where子句,该表中所有的记录都将被删除。

     

    Mysql>delete from info;

     

     

    l         查询语句

     

    select语句的语法:

    select [straight_join] [sql_small_result] [sql_big_result] [high_priority] [distinct | distinctrow | all] select_expression… [into {outfile | dumpfile} ‘file_name’ export_options] [from table_ref] [where where_define] [group by col_name] [having where_define] [order by {unsigned_integer | col_name |formula} [asc | desc],…] [limit [offset,] row] [procedure procedure_name]

     

  • PHP学习笔记(二)——函数和对象

    2006-12-19 09:57:36

     

    1.函数的定义

    函数定义的语法形式为:

     

    function 函数名()

    {

     

        函数体

     

    }

     

    PHP中对用户自定义函数的函数名有如下要求:

    l         不能与PHP的内部函数同名

    l         不能与PHP关键字同名

    l         不能以数字开头

    l         不能包含点号“.”。

     

    PHP中不允许一次返回多个值,但我们可以利用返回一个数组的方法达到同时返回多个值的目的。

     

    2.函数的调用

    实际参数列表要与形式参数列表相对应(有默认参数时实际参数还要与默认参数对应)。如果实际参数比形式参数多,多余的参数会被自动舍弃;如果实际参数比形式参数少,实际参数会被一一填入形式参数中,不足部分以空参数代替。

     

    3.函数的参数传递

    ①值传递

    所谓值传递,就是将实际参数的值拷贝到形式参数中,然后由形式参数参与函数内部的计算,函数调用结束后,实际参数的值不会发生改变。

    ②引用传递

    如果要实现形式参数改变时实际参数也发生相应改变,就要使用引用传递的方式了。实现参数的引用传递有两种方法:

    l         在函数定义的时候,在形式参数前面加上“&”符号,例如:

    function fun(&$Var1){…}

                  以后在调用函数fun()时就会默认采用引用传递了。

    l         函数调用的时候,在实际参数前面加上“&”符号,例如:

    function fun($Var1){…}

    fun(&$Var2);

    如果形式参数$Var1的值在函数中发生改变,实际参数$Var2的值也会发生相应的改变。

     

    ③默认参数

           PHP还支持与C++中类似的默认参数,即在函数定义时可以为一个或多个参数指定默认值。

     

    4.可变函数

    PHP的某个代码段中,如果某一变量的值与一个函数同名时,则在该代码段中可以使用该变量代替函数名来调用函数,调用方法为在变量名后加上括号及函数参数“(…)”。

    例如:

    function fun(){…}

    $Var=”fun”;

    $Var();

     

           可变函数与普通函数调用时最大的区别就在于可变函数前面的“$”符号,有此符号,系统就会认为是可变函数。

           注意:如果写成$Var=”fun()”,则“$Var”只是一个普通字符串而已,再调用语句“$Var;”不会实现fun()函数的功能。

     

     

    5.三个与不定参数相关的函数:

    3个函数都只能在函数中调用,在函数之外使用会产生出错信息。

    int func_num_args(void)

    这个函数的作用是返回传入参数的个数。

     

    int func_get_arg(int arg_num)

    这个函数将返回第arg_num个参数值,传入的参数下标从0开始,如果越界,系统会报错,并返回False

     

    int func_get_args(void)

    这个函数的作用是返回一个包含当前函数所有参数的数组。

     

    6.PHP中类的定义

    类中成员变量的定义方法为:“var 变量名;”,成员函数与一般函数的定义方法相同。

    类一旦定义之后,系统会自动为其指定一个$this变量,代表类自身。

    注意:如果成员函数中要使用类中的成员变来那个或其他成员函数,不能直接引用,要用“$this->变量名”或“$this->函数名”。

    每个类一般还有一个构造函数,用于类的初始化。

     

    7.类的封装性

    类中的属性不能由类的实例化对象直接访问,只能通过成员函数来访问。

     

    8.类中的构造函数

    构造函数是类中一个特殊的函数,这个函数的函数名与类名相同,而且在对象生成时会自动调用。

    构造函数可以接收参数,这样可以在对象实例化时指定初始化的值。

     

    9.类的继承性

    一个类在继承其他类时,可以继承其中所有的属性和方法,这种继承其他类的类就是派生类,被继承的类叫父类。PHP中继承类要使用extends关键字,使用方法为:

           Class 父类名 extends 子类名

           注意:PHP中不支持多重继承。

           派生类通常也需要有自己的构造函数,因为父类中的构造函数在派生类中只是一个普通函数,当派生类对象生成时并不会自动执行。

     

    10.PHP中类的多态性

    当派生类中某个函数的函数名与其父类中某个函数的函数名重复时,系统在派生类对象中会自动选用派生类中的函数,这就时类的多态。

           之类继承父类时,在之类中重新对父类函数加以定义,而不改变函数名,就实现了类的多态。

  • PHP学习笔记(一)——基本语法

    2006-12-15 08:55:12

    1.PHP中的文件包含

           PHP中的文件包含有两种方法:使用include()函数和使用require()函数。函数里面是所要包含进来的文件的名称。

           Include()函数可以放在程序的任何地方,PHP编译器在读到include()函数时,才将指定文件包含进来。而require()函数必须要放在PHP程序的最前面,PHP程序在执行时,先读入require()函数所包含的文件,使它成为PHP网页的一部分。常用的函数一般都是用require的方法包含进来的。

     

    2.PHP中预定义的常量

    常量名称

    常量含义

    __FILE__

    当前PHP程序文件名。在include()require()函数中使用这个常量能得到该函数包含的文件名

    __LINE__

    当前执行语句在PHP程序文件中的行数。在include()require()函数中这个常量将表示被引用文件的行数

    PHP_VERSION

    当前PHP程序的版本号

    PHP_OS

    当前所用操作系统类别

    True

    逻辑真

    False

    逻辑假

    E_ERROR

    指明最近一次产生的不可恢复的错误

    E_WARING

    指出有错误,但程序可以继续进行下去,该错误可被脚本捕获

    E_PARSE

    语法错误,分析器将停止分析

    E_NOTICE

    产生异常,但不一定是错误,程序可以继续执行

     

    说明:__FILE____LINE__中的“__”是双下划线,不是单下划线。以“E_”开头的常量一般与error_reporting()函数联用,以产生相关的调试出错信息。

     

    3.PHP的自定义常量

    除预定义常量外,PHP也支持用define()函数自定义常量,例如:

    <?php

        Define(STR,”A constant string”);

        Echo STR;

     

    ?>

    注意:常量一旦定义,在程序中就不允许再更改它的值。

     

     

    4.PHP中的变量类型

     

    l         integer:整型

    l         floating point number (double):浮点型(或双精度型)。

    l         boolean:布尔型(PHP4

    l         string:字符串

    l         array:数组

    l         object:对象

     

    PHP中的变量属于松散数据类型,不必由编程者自己定义,而是在使用时由PHP编译器动态进行类型指定或转换,变量名要以“$”符号开头,且区分大小写。变量如果未赋值而直接使用,变量值将被视为空。

     

    5.路径书写的注意

           在字符串中表示路径时尽量用“\\”,不要用“\”,以免编译系统产生误解。

     

    6.两种字符串分界符

     

    单引号中的字符串不能自动转换其中的变量。使用双引号括起来的字符串能自动转换其中包含的变量。

     

    7.PHP的数组

           PHP同时支持以数字为下标的数组(scalar array,索引数组)和以字符串为下标的数组(associative array,关联数组),这二者没有任何区别。

    PHP中可以使用list()函数或者array()函数来创建数组,也可以直接进行赋值。

     

    8.PHP的变量类型转换

    变量的自动转换主要依赖于操作符,如用“.=”将会转换为字符,用“+=”将会转换为数字。在四则运算中,字符串会自动转换为数字。如果字符串中含有“.”、“e”或者“E”,将被转换为浮点型数据,否则将按整型来处理,字符串中不符合数字规则的部分将被舍去。如果字符串以普通字符开头,在转换为数字时将被视为0。此外,字符串的自增、自减运算是在字符串中最后一个字符的ASCII码基础上进行的。

     

     

     

     

    <?php

     

     

        $Var1=3;    //$Var1 是整数3

        $Var.1=”10a”;    //$Var1 现在是字符串310a

        $Var2=”1”;    //$Var2是字符串1”

        $Var2++;    //$Var2变为字符串2”!!

        $Var2+=1;    //$Var2变为整数3

        $Var2+=1.1;    //$Var2变为浮点型4.1

        $Var2=”a”;    //$Var2是字符串”a”

        $Var2++;    //$Var2变为字符串”b”!!

        $Var2=”ab”;    //$Var2是字符串”ab”

        $Var2++;    //$Var2变为字符串”ac”!!

        $Var3=1;    //$Var3为整数1

        $Var3+=”10a”;    //$Var3变为整数11!!

        $Var4=1;    //$Var4为整数

        $Var4+=”a10”;    //$Var4还是整数1!!

        $Var4+=”-10a”;    //$Var4变为整数-9!!

     

    ?>

     

    9.PHP变量的作用域

    PHP中的变量是有作用范围的,一般情况下,变量的作用域是包括变量的PHP程序块,也就是“<?php”、“?>”之间的代码段或者“{”、“}”之间的代码段。如果其中还有用include()require()函数包含的文件,变量的作用域也能扩展到这些文件中。

           如果要在函数中引用主程序中的变量的值,可以使用PHP定义的$GLOBALS数组,$GLOBALS数组是一个以变量名为下标的数组。全局数组在使用时不能写成“$GLOBALS[“$int1”]”,要去掉变量前面的美元符。

           还有一种实现跨域调用功能的方法就是使用全局变量,全局变量对整个程序都是可见的,不仅在函数中可以访问主程序中的全局变量,在主程序中也可以访问函数中的全局变量。全局变量定义方法为在变量名前冠以“global”关键字。

           全局变量的定义不能与赋值写在一起,即“global $int2=2;”将无法通过语法检查。

     

    10.静态变量

           静态变量只能用于函数范围内,与普通局部变量不同之处在于:当该函数运行结束时,静态变量不会丢失自己的值。静态变量的定义方法为在变量前冠以“static”关键字。

           静态变量虽然在函数结束时值不丢失,但其作用域只在本函数中,在函数之外仍然是无效的。

     

    11.动态变量

    PHP中的动态变量允许一个变量的值作为另一个变量的变量名,前提条件是这个值要符合变量命名规则。

           在数组中使用动态变量时要解决一个岐义问题:比如$$Var[1]究竟是以变量$Var[1]的值作为变量名,还是以$$Var作为变量,再引用它的第一个元素?此时需要用{}消除岐义,上述两种情况应分别表示为${$Var[1]}${$Var}[1]

     

    12.引用变量

           PHP支持引用变量。对一个变量进行引用产生新变量后,新变量可以看作原变量的一个别名,改变其中任何一个的值,两个值都会一起改变。使用引用变量的方法是赋值时在右边变量前加“&”。

     

    13.PHP中的预定义变量

     

    变量名称

    含义

    argv

    传递给脚本的参数数组,与C语言main()函数中的argv参数一样,在通过GET方法发送请求时,此参数包含了查询字符串。

    argc

    传递脚本的参数大小

    PHP_SELF

    当前运行脚本的文件名,以命令行方式启动PHP时没有此变量

    HTTP_COOKIE_VARS

    HTTP Cookies传给当前脚本的一个关联数组

    HTTP_GET_VARS

    使用HTTP GET 方法时,传给当前脚本的一个关联数组

    HTTP_POST_VARS

    使用HTTP POST 方法时,传给当前脚本的一个关联数组

     

    注意:要使用后3个变量先要将php.ini 文件中的“track_vars”置为On

     

    14.外部变量

    PHP中外部变量的来源可能有3种途径:

    <P class=MsoNormal style="MARGIN: 0cm