PHP中奇怪的数字

 更新时间:2016年11月25日 16:08  点击:1724

 由一条别人adodbbug引发的思考

 

echo 09," => (09) <br>";
echo 9," => (9) <br>";

 

你可以试一下.输出结果是:

 

0 => (09)

9 => (9)

 

而不是

 

09 => (09)

9 => (9)

 

 

 

 

 

这个译者做了下测试,经过分析得出.0开头的数字会被当成8进制,0x开头的会被当成16进制,如下:

 

echo 0x11," => (011) <br>";

echo 010," => (010) <br>";

 

这个会输出:

 

17 => (011)

8 => (010)

 

当然是10x16+1=17

 

1x8+0=8

 

OK.

 

 

 

 

 

Someone reported a bug in ADOdb, the open source db library i maintain. I went crazy for half an hour until i realised the problem. Here''s a little gotcha you can try:

echo 09," => (09) <br>";
echo 9," => (9) <br>";

If you expect the above code to produce the same values, you are sadly mistaken. Try it. I will post a followup later :)

 

 

 

 

PHP中的字符串操作功能是比较多的,重要的有以下这些:   

(1)echo,print,printf,sprintf  
前两个函数是输出字符串.字符串中如果有变量名则被替换成其值.   
后两个函数类似于C的同名函数.  

(2)strchr,strlen,strtok,strrchr,strrev,strstr,strtolower,strtoupper,substr,ucfirst  
这些是常用的字符串操作函数,有些和C中的同名函数意义完全一致.   
strrev是把一个字符串翻转.  
strtolower和strtoupper的意思应该不用解释了.  
ucfirst是把字符串的第一个字符变成大写.  
substr是返回字符串的一个子串,用法是:substr(字符串,头,长度).
头位置是  从0算起的.如果是负数,则是从尾部向前数的意思.  

(3)Chr,Ord  
类似于C的同名函数.  

(4)explode,implode,join  
这些是和数组有关的函数.  
explode(字符串,分割符)返回一个将字符串在分割符处分开所产生的数组.  
implode(数组,分割符)返回一个将数组各元素之间插上分割符而成的字符串.  
join与implode意义相同.  

(5)Chop  
去掉字符串尾部的空白.  

(6)htmlspecialchars  
将字符串中的HTML特殊字符换成它们的名字,例如"<"变成"<".   

(7)nl2br  
在字符串中的每一个回车前面加上"<BR>".  

(8)AddSlashes,StripSlashes  
分别给字符串中需要加上"\"才能用于数据库查询的字符加上和去掉"\".   

(9)parse_str  
将"name1=value1&name2=value2&..."类型的字符串分析成一些变量.   
例如:  
   parse_str("a=1&b=2");  
生成$a与$b两个变量,值分别为1,2.  
如果有两对名字/值的名字部分相同,则后一个的值覆盖前一个的.   
如果这两对的名字尾部都有"[]",例如"a[]=1&a[]=2",则生成数组$a,两个元素分别为1,2 

<

这本来是session的基本用法,但在php中就不灵了。不过我们可以把session变量注册成"跨窗口的全局变量"。但这有一个条件,就是要向需要使用该session变量的窗口发送变量名为session_name(),值为session_id()的变量,用表单或者在url后面用?带上都可以.并且在使用session变量的页面的一开始处调用session_start()。

例子如下:

login.php文件:



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>登陆画面</title>
</head>
<body>
<form action="result.php" method="post">
  
<table width="100%" border="0">
  
<tr>
    
<td align="center" valign="middle"><p>测试系统-----登陆画面</p>
        
<table width="250" style="border-collapse:collapse; border-color:#000000"
            border
="1" cellpadding="2" cellspacing="2">
            
<tr>
                
<td width="30%">用户:</td>
                
<td><input name="username" type="text" style="width:150px"/></td>
            
</tr>
            
<tr>
                
<td>密码:</td>
                
<td><input name="password" type="password" style="width:150px"/></td>
            
</tr>
            
<tr>
                
<td colspan="2" align="center"><input type="submit" value="登陆"/></td>
            
</tr>
        
</table>
    
</td>
  
</tr>
</table>
</form>
</body>
</html>

result.php文件:



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>结果画面</title>
</head>
<body>
<form method="post">
    欢迎你, 
    
<?php
        @
session_start();
        
if(isset($_POST["username"])){
            
$username = htmlspecialchars($_POST["username"]);
            
$_SESSION[''username''= $username;
        } 
else {
            
$username = $_SESSION[''username''];
        }
        
echo $username
    
?>
    
<br/>
    
<br/>
    
<a href="login.php">返回</a>
    
<a href="database.php?".session_name()."=".session_id()."">数据库测试</a>
    
</form>
</body>
</html>

database.php文件:



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>结果画面</title>
</head>
<body>
<form method="post">
    Email:
    
<?php
        @
session_start();
    
        
$conn = mssql_pconnect(''localhost'', ''sa'', ''sa'');
        mssql_select_db(
''netstore'');
        
$query =  mssql_query(''select * from CUSTOMER'', $conn);
        
$name =  mssql_result($query, 0, ''email'');
        
echo $name;
    
?>
    
<br/>
    
<br/>
    
<a href="result.php?".session_name()."=".session_id()."">返回</a>
</form>
</body>
</html>


 



PHP中自增自减运算


 问题:若$i=2,求表达式($i++)*($i++)*($i++)的值,并求$i的值

 答案:($i++)*($i++)*($i++)结果为24,$i为5

 分析:先看计算顺序,发现有括号则先算括号里面的,先取$i的值2为($i++)的值,然后$i自加为3;  [此时($i++)左=2,$i=3]

            再算括号中,先取此时的$i的值3为($i++)的值,然后$i再自加为4;[此时($i++)中=3,$i=4]

            后算括号右,先取此时的$i的值4作为($i++)的值,然后$i再自加为5

            最后做乘法运算,即2*3*4=24          $i=5

 

 

Jakarta Struts结构移植过来的PHP开发框架,使用面向对象的开发结构和API,模拟了一个HTTP Servlet容器和使用了PHP服务页面引擎技术。

下载地址:http://mojavelinux.com/projects/studs/

文件结构如下:

如上图,WEB-INF中的文件都是Studs框架的核心文件(尤其是lib和tld下的文件),其中:

1.messages.properties文件:



welcome.title=Studs :: Welcome
welcome.heading
=Welcome to Studs!
welcome.message
=The application has been successfully installed!

pageviews.message
=This page has been viewed <strong>{0}</strong> times.

2.struts-config.xml文件:



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"
>
<!--
     This is a basic Studs/Struts configuration file with an example
     welcome action/page and other commented sample elements.
-->
<struts-config>

    
<!-- example configuration of a database connection
    <data-sources>
        <data-source type="horizon.sql.BasicDataSource">
            <set-property
                property="description"
                value="Primary data source for localhost database"/>
            <set-property
                property="driverClassName"
                value="horizon.sql.drivers.MySQLDriver"/>
            <set-property
                property="username"
                value="user"/>
            <set-property
                property="password"
                value="secret"/>
            <set-property
                property="url"
                value="mysql://localhost/dbname"/>
        </data-source>
    </data-sources>
    
-->

    
<form-beans>
        
<!-- sample form bean descriptor for an ActionForm
        <form-bean
            name="inputForm"
            type="app.InputForm"/>
        
-->
    
</form-beans>

    
<global-exceptions>
        
<!-- sample exception handler
        <exception
            key="expired.password"
            type="app.ExpiredPasswordException"
            path="/changePassword.jsp"/>
        
-->
    
</global-exceptions>

    
<global-forwards>
        
<!-- Default forward to "welcome" action -->
        
<forward name="welcome" path="/welcome.do"/>
    
</global-forwards>

    
<action-mappings>
        
<!-- Default "welcome" action -->
        
<action path="/welcome" forward="/pages/welcome.psp"/>
        
<action path="/example" forward="/pages/example.psp"/>

        
<!-- sample input and input submit actions

        <action
            path="/Input"
            type="org.apache.struts.actions.ForwardAction"
            parameter="/pages/Input.jsp"/>

        <action
            path="/InputSubmit"
            type="app.InputAction"
            name="inputForm"
            scope="request"
            validate="true"
            input="/pages/Input.jsp"/>

            <action
                path="/edit*"
                type="app.Edit{1}Action"
                name="inputForm"
                scope="request"
                validate="true"
                input="/pages/Edit{1}.jsp"/>

            
-->
    
</action-mappings>

    
<controller locale="false" inputForward="true"/>

    
<message-resources parameter="/WEB-INF/messages.properties"/>

</struts-config>

3.web.xml文件:



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

    
<display-name>Studs Basic Application</display-name>
    
<description>A bare-bones foundation for creating a web application based on the Studs MVC Framework+</description>
    
<context-param>
        
<!-- if controlAllResources is set, all files should be handled by the stratus
             container, including all non-php/html files 
-->
        
<param-name>controlAllResources</param-name>
        
<param-value>false</param-value>
    
</context-param>

    
<!-- Servlet Definitions -->
    
<servlet>
        
<servlet-name>default</servlet-name>
        
<servlet-class>stratus.servlets.DefaultServlet</servlet-class>
        
<init-param>
            
<param-name>listings</param-name>
            
<param-value>true</param-value>
        
</init-param>
        
<load-on-startup>1</load-on-startup>
    
</servlet>
    
<servlet>
        
<servlet-name>phase</servlet-name>
        
<servlet-class>phase.servlet.PhaseServlet</servlet-class>
        
<init-param>
            
<param-name>scratchdir</param-name>
            
<param-value>/WEB-INF/work</param-value>
        
</init-param>
        
<init-param>
            
<param-name>tldresourcedir</param-name>
            
<param-value>/WEB-INF/tld</param-value>
        
</init-param>
        
<init-param>
            
<param-name>ignoreEL</param-name>
            
<param-value>false</param-value>
        
</init-param>
        
<load-on-startup>2</load-on-startup>
    
</servlet>
    
<servlet>
        
<servlet-name>action</servlet-name>
        
<servlet-class>studs.action.ActionServlet</servlet-class>
        
<init-param>
            
<param-name>config</param-name>
            
<param-value>/WEB-INF/struts-config.xml</param-value>
        
</init-param>
        
<init-param>
            
<param-name>validating</param-name>
            
<param-value>true</param-value>
        
</init-param>
        
<load-on-startup>3</load-on-startup>
    
</servlet>

    
<!-- Servlet Mappings -->
    
<servlet-mapping>
        
<servlet-name>default</servlet-name>
        
<url-pattern>/</url-pattern>
    
</servlet-mapping>
    
<servlet-mapping>
        
<servlet-name>phase</servlet-name>
        
<url-pattern>*.psp</url-pattern>
    
</servlet-mapping>
    
<servlet-mapping>
        
<servlet-name>action</servlet-name>
        
<url-pattern>*.do</url-pattern>
    
</servlet-mapping>

    
<!-- Mime Type Mappings -->
    
<mime-mapping>
        
<extension>html</extension>
        
<mime-type>text/html</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>css</extension>
        
<mime-type>text/css</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>js</extension>
        
<mime-type>text/javascript</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>png</extension>
        
<mime-type>image/png</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>jpg</extension>
        
<mime-type>image/jpeg</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>jpeg</extension>
        
<mime-type>image/jpeg</mime-type>
    
</mime-mapping>
    
<mime-mapping>
        
<extension>gif</extension>
        
<mime-type>image/gif</mime-type>
    
</mime-mapping>

    
<!-- Default Welcome File List -->
    
<welcome-file-list>
        
<welcome-file>index.psp</welcome-file>
    
</welcome-file-list>

</web-app>

4.文件build.xml:



<?xml version="1.0"?>
<project name="Studs Basic" basedir="../.." default="package">
    
<property file="../../build.properties" />

    
<target name="package" depends="prepare">
        
<mkdir dir="../../${release.dir}/${project.release.version}"/>
        
<tar destfile="../../${release.dir}/${project.release.version}/studs-basic-${project.release.version}.tar.gz" compression="gzip">
            
<tarfileset dir="." prefix="studs-basic" defaultexcludes="yes">
                
<exclude name="classes/build.xml"/>
                
<exclude name="**/TODO"/>
                
<exclude name="**/NOTES"/>
            
</tarfileset>
        
</tar>
    
</target>

    
<target name="clean">
        
<!-- make sure to break symlinks -->
        
<symlink action="delete" link="${basedir}/WEB-INF/lib" failonerror="no"/>
        
<symlink action="delete" link="${basedir}/WEB-INF/tld" failonerror="no"/>

        
<delete includeemptydirs="yes" failonerror="no">
            
<fileset dir="WEB-INF/work">
                
<include name="**"/>
            
</fileset>
            
<fileset dir="WEB-INF/lib">
                
<include name="**"/>
            
</fileset>
            
<fileset dir="WEB-INF/tld">
                
<include name="**"/>
            
</fileset>
        
</delete>
    
</target>

    
<target name="prepare" depends="clean">
        
<!-- create work directory -->
        
<mkdir dir="WEB-INF/work"/>
        
<chmod dir="WEB-INF/work" perm="0777" type="dir"/>
        
<!-- create lib directory and copy framework libraries -->
        
<mkdir dir="WEB-INF/lib"/>
        
<copy todir="WEB-INF/lib">
            
<fileset dir="../../src">
                
<include name="**"/>
            
</fileset>
        
</copy>
        
<!-- create tld directory and copy known tlds -->
        
<mkdir dir="WEB-INF/tld"/>
        
<copy todir="WEB-INF/tld">
            
<fileset dir="../../conf/tld">
                
<include name="*.tld"/>
            
</fileset>
        
</copy>
        
<!-- copy over the controller and server conf file -->
        
<copy todir=".">
            
<fileset dir="../../conf">
                
<include name="index.php"/>
                
<include name=".htaccess"/>
            
</fileset>
        
</copy>
    
</target>
</project>

5.logging.properties文件:



== Setup log appenders ==
#logging.rootLogger
=DEBUG, file
#logging.appender.file
=horizon.util.logging.FileLogAppender
#logging.appender.file.file
=/tmp/studs-basic.log
== Specific logging per category ==
#logging.logger.
[partial package or classname]=DEBUG

其他文件基本上都可以在框架源代码中找到。

页面文件如下:

1.index.php:



<?php
error_reporting(E_ALL);
ini_set(''include_path'', ''WEB-INF/lib'' . (DIRECTORY_SEPARATOR == ''/'' ? '':'' : '';''. ''WEB-INF/classes'');
umask(0002);

require_once ''horizon/init.php'';

import(
''stratus.connector.HttpProcessor'');
import(
''stratus.config.ContextConfig'');

$config = & new ContextConfig(dirname(__FILE__));
$processor = & new HttpProcessor($config->getContext());
$processor->run();
?>

2.index.psp:



<%@ page language="php" %>
<%@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<c:redirect context="/"><html:rewrite forward="welcome"/></c:redirect>

3.welcome.psp:



<%@ page language="php" %>
<%@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/tld/phase-fmt.tld" prefix="fmt" %>
<%@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<title><fmt:message key="welcome.title" /></title>
        
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
</head>
    
<body>
        
<h3><fmt:message key="welcome.heading" /></h3>
        
<p><fmt:message key="welcome.message" /></p>
        
<p><html:link action="/example">Click here</html:link> for an example of the template tag library.</p>
        
<c:set var="welcomePageViewCount" value="${applicationScope.welcomePageViewCount + 1}" scope="application"/>
        
<style="font-size: small;"><fmt:message key="pageviews.message" arg0="${applicationScope.welcomePageViewCount}"/></p>
    
</body>
</html>

4.example.psp:



<%@ taglib uri="/WEB-INF/tld/studs-template.tld" prefix="template" %>
<%@ taglib uri="/WEB-INF/tld/phase-string.tld" prefix="str" %>
<%@ taglib uri="/WEB-INF/tld/phase-core.tld" prefix="c" %>
<template:insert template="/pages/tmpl/template.psp">
    
<template:put name="title" content="Studs :: Template Taglib Example" direct="true"/>
    
<template:put name="heading" direct="true">Template Taglib Example</template:put>
    
<template:put name="intro" direct="true">
This page demonstrates the use of the studs template taglib.  Content is inserted by the parent page either directly or via an include file.  Below are two examples of content insertion.
    
</template:put>
    
<template:put name="content" direct="true">
<str:replace replace="LF" with="&lt;br /&gt;">This text was specified inline using the template:put tag.

It also uses the str:replace taglib to convert endlines to BR tags.

I am also testing the conditional EL syntax.  
<strong>${2 % 2 ? ''odd'' : ''even''}</strong></str:replace>
    
</template:put>
    
<template:put name="content2" content="/pages/tmpl/content.psp" />
</template:insert>

5.template.psp:



<%@ taglib uri="/WEB-INF/tld/studs-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/studs-template.tld" prefix="template" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    
<head>
        
<title><template:get name="title" /></title>
    
</head>
    
<body>
        
<h3><template:get name="heading" /></h3>
        
<p><template:get name="intro" /></p>
        
<style="border: 1px dashed #999999; background-color: #F0F0F0;">
        
<template:get name="content" />
        
</p>
        
<style="border: 1px dashed #999999; background-color: #F0F0F0;">
        
<template:get name="content2" />
        
</p>
        
<p>&laquo; <html:link forward="welcome">Back</html:link></p>
    
</body>
</html>

6.content.psp:



This text comes from an include file using the template:put tag.

这样,一个基于PHP Studs框架的示例程序就完成了。(注:上诉代码取自studs自带的例子)



[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 金额阿拉伯数字转换为中文的存储过程

    Create Procedure AtoC @ChangeMoney Money as Set Nocount ON Declare @String1 char(20) Declare @String2 char(30) ...2016-11-25
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • c# 数据类型占用的字节数介绍

    本篇文章主要是对c#中数据类型占用的字节数进行了详细的介绍。需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Nest.js参数校验和自定义返回数据格式详解

    这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • C#中decimal保留2位有效小数的实现方法

    这篇文章主要介绍了C#中decimal保留2位有效小数的实现方法,针对decimal变量保留2位有效小数有多种方法,可以使用Math.Round方法以及ToString先转换为字符串等操作来实现。具体实现方法感兴趣的朋友跟随小编一起看看吧...2020-06-25
  • C#实现猜数字游戏

    这篇文章主要为大家详细介绍了C#实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28