当前位置: 澳门新濠3559 > 编程 > 正文

一个Form表单所提交的参数只传给第一个处理程序

时间:2019-11-22 20:51来源:编程
作者:华红狼 正文:上文中曾提到了PHP提交表单信息是很方便的。可是,提交的表单信息中的变量的生命周期是多长呢?本文就来崐谈谈这个问题。表单的参数会传给下一个处理程序,

作者:华红狼 正文: 上文中曾提到了PHP提交表单信息是很方便的。可是,提交的表单信息中的变量的生命周期是多长呢?本文就来崐谈谈这个问题。 表单的参数会传给下一个处理程序,这是不用置疑的。因为,我们曾有过这样的例子。可它还会继续传给下一个处理程序吗? 答案是否定的!一个Form表单所提交的参数只传给第一个处理程序,而下一个处理程序中它是不会起作用的。来看看下例吧: 文件:table.html

Smarty模板引擎技术

基于php基础语言编写的小程序之计算器

表单提交

1. 内建函数

需求:在输入框中输入数字进行加、减、乘、除运算(html+php)

文件:deal-1.php

1. include_php内建函数

作用:载入一个php文件,将载入的文件的内容赋值给一个变量

 

注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化SmartyBC.class.php

 

示例代码:

Index.php

include 'Smarty/SmartyBC.class.php';
*//
实例化Smarty类
*$Smarty = new SmartyBC();
$Smarty->assign('name','小明');
$Smarty->display('index.tpl'); **

index.tpl

{*include_php内建函数*}
{include_php file="date.php" assign="date"}
{$date}

 

思路:

"; echo "你喜欢$start,对吗?
"; echo "试试是否会再传下去"; echo "

1. insert内建函数

作用:当Smarty内置的功能不够使用时,可以通过insert内建函数拓展功能。

 

基本语法:index.php文件中创建一个

insert_自定义函数名($arg){

        echo $arg[模板中定义的变量]    

}

Index.tpl文件

{insert name=自定义函数名称 自定义参数… }

示例代码:

Index.php

function insert_func($arg){
echo $arg['title'];
}
function insert_date($arg){
echo $arg['say']."今天天气好棒的说,现在的时间是**
".date('Y-m-d H:i:s',time());
echo '<br>';
echo $arg['zhangsan']."今天天气好棒的说,现在的时间是*".date('Y-m-d H:i:s',time一个Form表单所提交的参数只传给第一个处理程序,1首先要创建输入数字和运算符的输入框。*());
}

index.tpl模板

{insert name="func" title='PHP是世界上最好的语言**'}
<hr>
{insert name="date" say='老王说:' zhangsan='哈哈哈:**'}

 

 

 

 

 

1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用selelct的option属性

"; ?> 文件:deal-2.php

1. if elseif else内建函数

示例代码:

{if $age >= 18}
**
此人非未成年
{elseif $age == '14'} 此人14岁
{else} 此人是未成年
**{/if}

 

 

2 点击输入框中的=号要进行对应的运算,

"; echo "你说$start好吗?"; echo "

1. ldelim或rdelim内建函数

示例代码:

<b>**在Smarty中我们使用{ldelim}if{rdelim}进行条件判断**</b>

3 =号这个输入框可以用input的submit来做,只要点击submit表单里的内容就传给php了

"; ?> 从上例中,我们可以看见:deal-1.php处理的结果为(假定我们在table.html中输入的是“张学友”): 你喜欢张学友,对吗? 试试是否会再传下去 说明表单提交了变量$start给deal-1.php,而在deal-1.php的显示结果中,若我们点击了链接“试试是否会再传下去”之后,deal-2.ph崐p的处理结果为: 你说好吗? 很明显,$start没有传给deal-2.php。但是,我们又怎样延长$start的生命周期呢?其实,这很简单,使用参数传递的方法就行了。如崐下,我们可以把deal-1.php改成这样:

1. literal内建函数

作用:在该标签中的任何内容都不会受Smarty模板引擎解析

示例代码:

{literal}
{*嗨,我是一个注释**
*}
{assign var='age' value="14"}
{/literal}**

运行效果:

 

图片 1

4 判断从html中得到的运算符进行对应的运算

"; echo "你喜欢$start,对吗?
"; echo "试试是否会再传下去"; echo "

1. php内建函数

作用:在该标签中可以使用原生的PHP代码。

示例代码:

{PHP内建函数*}
*{php}
echo date('Y-m-d h:i:s',time());
echo '<br>';
echo "我在php内建函数中的内容";
{/php}**

运行效果:

 

图片 2

5 运算完成后还得把结果返回到表单中(就是给表单的value赋值)

"; ?> 分晰程序,你会发现只是在deal-1.php后加了一句“?start=$start”就行了,而这起的作用就是参数传递。如: 其?后的为参数,no为参数名,其值为1。这样,会在cartoon.php程序中产生变量$no,其值为1。若传两个以上崐参数,其间用&分隔。如: 为了延长参数的生命周期,我们还可以使用Cookie或Session来实现,这里不加多述,在以后的文章中你会见到它们的用法。 ----

7、strip内建函数

作用:去除空格符和换行符

示例代码:

{strip}
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</table>
{/strip}

使用前:

图片 3

 

 

 

 

 

 

使用后:

图片 4

 

8、section、sectionelse内建函数(二维数组,)

作用:遍历数组

基本用法:

{section loop=$arr name="index"}
{$arr[index]}
<br>
{/section}

参数详解:loop 要遍历数组

         Name 当前循环的索引

拓展使用1:使用start step max

{section loop=$arr1 name="index" start="0" step="1" max="5"}
{$arr1[index]}
<br>
{/section}

  • 参数详解:start    循环的起始索引

         Step    每次循环增加的数量

         Max 最大的循环次数

拓展使用2:sectionelse

作用:判断循环的数组是否为空,如果为空的话,则执行后面的内容。

实例代码:

{section内建函数*}
*{section loop=$arr1 name="index" start="0" step="1" max="5"}
{$arr1[index]}
<br>
{sectionelse}
<b>):没有数组或者数组为空**</b>
{/section}

  • 遍历二维数组

实例代码:

Index.php

$arr3 = array(array('name'=>'小明**','age'=>25,'sex'=>'未知'),
array('name'=>'老王','age'=>26,'sex'=>'男'),
array('name'=>'老李','age'=>27,'sex'=>'你猜**')
);

Index.tpl

{section loop=$arr3 name="index" }
{$arr3[index]['name']} |
{$arr3[index]['age']} |
{$arr3[index]['sex']} |
<hr/>
{/section}

运行效果:

 

图片 5拓展内容:

 

当前索引: {$smarty.section.index.index} ->>
当前索引的前一个:{$smarty.section.index.index_prev}->>
当前索引的下一个:{$smarty.section.index.index_next}->>
当前所循环的次数
                                {$smarty.section.index.iteration}->>
判断当前是否第一次: {$smarty.section.index.first}->>
判断当前是否最后一次:{$smarty.section.index.last}->>

循环的总次数:**{$smarty.section.index.total}->>**

 

运行效果:图片 6

代码

1. 自定义函数

Html代码

1. counter计数器

示例代码:

{counter start='10' }
<hr>
{counter}
<hr>
{counter print=false}
<hr>
{counter skip=2}
<hr>
{counter}
<hr>

运行效果:

图片 7

<form method="post" action=””>//method代表的表单的提交方式,本案例选的是post提交 action是接受的页面,为空表示提交到当前页

1. cycle轮换函数

基本语法:{cycle values=参数1,参数2,参数3}

 

示例代码:

{cycle实现各行换色*}
*<hr>
<table width="100%">
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter start='1' skip='1'}次循环</td>
</tr>
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter}次循环</td>
</tr>
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter}次循环</td>
</tr>
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter}次循环</td>
</tr>
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter}次循环</td>
</tr>
<tr style="background-color: {cycle values="red,green,yellow"}">
<td>我的第{counter}次循环</td>
</tr>
</table>**

 

              <input type = "text" name="num1" >

1. debug调试函数

{debug}

运行效果:

图片 8

              <select name = "select">

1. fetch函数

作用:捕获一个文件的内容,然后赋值给一个变量

示例代码:

{fetch file="shi.txt" assign="text"}
{fetch file="date.php" assign="php"}
{****
变量调节器**
{$text|变量调节器名称**:参数1:参数**2}
*}
*{$php}
<hr>
{$text|nl2br}**

运行效果:

图片 9

                     <option value="+" >+</option>

1. html_image自定义函数

{html_image file="1.jpg"}

 

参数:file    图片资源的路径

运行效果:

图片 10

 

                     <option value="-" >-</option>

1. html_table自定义函数

作用:生成一个表格,将数据遍历进去

示例代码:

{html_table loop=$arr cols="3"}

参数说明:loop    要循环遍历的数组

     Cols    指定表格列数

                     <option value="*" >*</option>

1. html_checkboxes自定义函数

作用:生成一组多选框

示例代码:

{html_checkboxes name = 'job'
values = $arr
checked = $arr2
output = $arr3
separator = "|"
}

参数说明: name        对应多选框中的name属性

         Values    对应多选框中你的value属性

Checked    选中指定的多选框

         Output    控制文本内容

         Separator 连接符

运行效果:

{待补充}

                     <option value="/" >/</option>

1. html_options自定义函数

示例代码:

<select style="width: 100%;">

                                                        {html_options values    =   $arr
                  selected  =   'GO'

                                                                                output    =   $arr3
    }
</select>

参数说明:values         下拉框选项的值

     Selected    指定被选中的下拉选项,注意:必须和value的值对应

         Output    输出的文本

              </select>

9、html_radios自定义函数

示例代码:

{html_radios values     =   $arr
             checked    =   'nodejs'

                                            output     =   $arr3
             separator  =   "|"
}

 

参数说明:values    单选框的值

         Checked    指定默认被选中的单选框

         Output    输出的文本

         Separator    连接符

运行效果:

{待补充}

              <input type = "text" name="num2" >

1. 综合应用

实例代码:

{section loop=$arr4 name="index" }
{html_image file="./img/{$arr4[index]}.jpg"}
<hr>
{/section}

 

              <input type = "submit" name = "submit" value="=">

1. 程序篇

              <input type = "text" name="result" >

1. 常量

SMARTY_DIR

       </form>

1. 变量

  • $template_dir        模板目录    默认是:templates

  • $compile_dir        编译目录    默认是:templates_c

  • $config_dir        配置目录    默认:configs

  • $cache_dir        缓存目录    默认:cache

  • $left_delimiter    左定界符    默认:{

  • $right_delimiter    右定界符    默认:}

 

以上变量都有默认行为。

  • $caching            是否开启缓存

  • $cache_lifetime    缓存的生命周期:默认3600s

  • $debugging        开启调试模板

  • $php_handling    是否允许在模板中引入php

 图片 11

3、常用方法

  • assign 向模板中传递变量

  • assignByRef    分配变量到模板文件(按引用传递)

  • append         追加变量

$Smarty->append('var1','小明**');
$Smarty->append('var1','25');
$Smarty->append('var1','男**');

  • appendByRef追加不同的数据到模板的数组变量中(按引用传递)

  • clearAllAssign     清除模板中所有变量

$Smarty->clearAllAssign(); *//**清除所有模板变量***

  • clearAssign 清除指定的变量

$Smarty**->clearAssign('title');**

  • clearCache     清除缓存

  • configLoad     配置加载

$Smarty**->configLoad('config.conf','class2');**

  • clearConfig    清除配置内容

$Smarty**->clearConfig('name');**

  • display        指定渲染模板

$Smarty->display('index_3.tpl');

加载模板文件

渲染模板

显示模板

  • fetch        捕获模板但是不输出

 

加载模板文件

渲染(将标签替换为php代码)模板文件

我们可以通过fetch实现静态技术。

Index_3.php文件

/
**
*如果有静态文件则加载静态文件,如果没有静态生成一个静态文件。**
* */
if(!is_file('./html/index_3.html')){
$html = $Smarty->fetch('index_3.tpl');
file_put_contents*('./html/index_3.html',$html);
echo '这里是没有静态文件';
include "./html/index_3.html";
}else{
echo '这里是有静态文件
';
include "./html/index_3.html";
}**

[待补充]

  • templateExists 判断模板文件是否存在    

if($Smarty->templateExists('index_4.tpl')){
$Smarty->display('index_3.tpl');
}else{
echo '矮油,模板文件不在哦**
~';
}**

 

 

补充:如何在smarty模板中读取数组,对象。

 

  • 在模板中获取数组内容:

{****多维数组***}
{$var[0]['name']} {***一位数组***}
*{$var['name']}**

  • 在模板中获取对象内容

{****获取对象属性***}
{$std->name}
<hr>
{***获取对方法***}
*{$person->speak()}**

Index3.php文件

$std = new StdClass();
class person{
function __construct(){}
function speak(){
echo '你猜猜我谁**
?';
}
}
$person = new person();
$std->name = '张二明**';

 

 

PHP代码

1. Smarty模板中的缓存技术

当用户点击提交按钮值就会通过post传递过来,现在要接受表单里的值。

1. 什么是缓存技术

概念:一般在我们项目中,有一部分数据并不是实时更新的,但是,有又必须实时访问。如果不使用缓存技术的话,每访问一次,得查询一次或者多次数据库,那么会给数据造成很高的I/O开销。会增加服务器的压力。

在点击之前要做几个判断

1. Smarty缓存原理图

用户端缓存原理:

图片 12

 

服务器缓存原理:

图片 13

 

if (isset($_POST['submit'])) {

1. 缓存的开启

*//开启缓存
*$Smarty->caching = true; **

*//**设置缓存文件的生命周期
*$Smarty->cache_lifetime = '7200';**

//isset检测变量是否设置,存在,或非NULL, 返回值为布尔, 如果变量存在返回true, 否则为false;,结合$_POST[“submit”], $_POST   //接收通过表单的method=’post’ 方法的传值

1. 缓存文件从何而来?

缓存文件由编译文件而来。

 

$num1 = $_POST['num1'];//获取第一个输入框中的值,通过input中的name属性获得

1. 缓存文件何时变化?

编译文的内容何时变化?

  1. 当模板文件被修改时会发生变化

  2. 当缓存不在声明周期内会发生变化(重新生成新缓存文件)

 

思路:设置一个生命周期只有30秒的缓存文件,定义一个变量,在模板中使用该变量。然后打开index.php.

然后修改该变量的值。等待。。。30

             $select = $_POST['select'];//同上

1. Smarty执行原理图(缓存版)

图片 14

             $num2 = $_POST['num2'];//同上

Smarty缓存相关细节

       if (is_numeric($num1) && is_numeric($num2)) {

1. 缓存检测

$Smarty->isCached('index_4.tpl')
  • 基本语法:isCached(templatesName); 检测模板文件的缓村文件是否存在

  • 参数说明:模板文件名称

       //is_numeric() //检测变量是否为数字或数字字符串  返回值 ,true, false  如 100, ‘100’

1. 清除缓存

//清除所有缓存
$Smarty->clearAllCache();
//清楚某模板缓存文件
$Smarty->clearCache('index_4.tpl');

 

 

1. 局部缓存

在Smarty的缓村是全局缓存,如果开启缓存,访问整个页面的数据都会被缓存,如果页面中有一些动态数据需要修改,如何处理?

如何处理页面中动态显示的数据部分呢?

  1. 通过给assign(模板变量名称,值,设置不缓存)设置不缓存
$Smarty->assign('shige','《再别康桥》',true);
  1. 在模板文件中通过{nocache}{/nocache}方式设置变量不被缓存
{nocache}
    {$title}
{/nocache}

             switch ($select) {//$select是前面传来的运算符

1. 单页面多缓存

如何解决一个模板文件,动态显示不同的内容。

实际场景:譬如一个电商网站的商品详细页,会动态的根据URL上的参数,改变该页面的内容。

那么这种情况如何实现缓存呢?

 

在Smarty中,我们通过设置display()第二个参数,来实现,单页面,多缓存。

                    case '+'://根据switch的语法,case中的值和switch括号里的值相等那么就执行case后面的那句话,不等则继续往下找

11、缓存集合

我们通过给display()方法设置第二个参数实现缓存集合(通过|分割)

$Smarty->display('index_5.tpl',$_GET['goods_id'].'|'.$_GET['cate_id']);

 

                           $result = $num1+$num2;

五、过滤器

示例代码:

//定义一个函数用于字符串替换


function check($tpl_output, $smarty){

                                                    $tpl_output = str_replace('苍井空','张某某',$tpl_output);

                                            return $tpl_output;
}

//通过注册过滤器,实现模板中的字符串过滤
$Smarty->registerFilter("output","check");

 

                           break;

1. 模板继承

通过模板继承实现页面精细化拆分

示例代码:

Parent.tpl文件

{extends file="parent.tpl"}
{block name='content'}

                                                        偶哈呦,哈哈哈哈

                            <hr>
{/block}

Child.tpl文件

{extends file="parent.tpl"}
{block name='content'}

                                                        偶哈呦,哈哈哈哈

                            <hr>
{/block}

 

                    case '-':

                           $result = $num1-$num2;

                           break;

                    case '*':

                           $result = $num1*$num2;

                           break;

                    default:

                           if ($num2==0) {//加个判断,除数不能为0

                                  echo "<script>alert('输入的除数为0请重新输入')</script>";

                           }else{

                                  $result = $num1/$num2;

                                  break;

                           }     

             }

             }else{

                    //echo 当用户输入的不是数,可能是字符串则给用户提示

                    echo "<script>alert('输入的不是数')</script>";

                    $num1 = $num2 = $result = "";//把表单里的内容清空

             }

}

运行结果截图

 

 

当输入正确的数字截图

 图片 15

点击=号后

 图片 16

说明值没有传给html中的表单,

现在要去设置表单的value

<input type = "text" name="num1" value="<?php echo $num1?>"  >//把value的值设置为php中运算后的num值

              <select name = "select">

                     <option value="+" >+</option>

                     <option value="-" >-</option>

                     <option value="*" >*</option>

                     <option value="/" >/</option>

              </select>

              <input type = "text" name="num2" value="<?php echo $num2?>" >

              <input type = "submit" name = "submit" value="=">

              <input type = "text" name="result" value="<?php echo $result?>">

       </form>

运行结果

 图片 17

在用户没有点击提交按钮时输入框现在有内容,所以在用户没有点击提交按钮时应该把输入框中的值置为空

改进带码,在php的代码最后加一个else{

 

$num1 =$num2 = $result = "";

}

截图

 图片 18

在点击其他运算时,中间的运算符始终为+,截图

 图片 19

代码改进

在html中

<select name = "select">

                     <option value="+" <?php if($select == '+')echo 'selected'?>>+</option>

//select有一个属性selected当设置了就默认选中了它所以得结合php传过来的值比较,true就代表选中false就代表未选

                     <option value="-" <?php if($select == '-')echo 'selected'?>>-</option>

                     <option value="*" <?php if($select == '*')echo 'selected'?>>*</option>

                     <option value="/" <?php if($select == '/')echo 'selected'?>>/</option>

              </select>

截图看结果

 图片 20

当用户第一次进来

截图

 图片 21

说明要设置selecte中的默认值

代码

$select=”+”

基本功能已经完成

总的代码

<!DOCTYPE html>

<html lang="en">

<head>

       <meta charset="UTF-8">

       <title>Document</title>

</head>

<body>

       <?php

              if (isset($_POST['submit'])) {

//isset检测变量是否设置,存在,或非NULL, 返回值为布尔, 如果变量存在返回true, 否则为false;,结合$_POST[“submit”], $_POST   //接收通过表单的method=’post’ 方法的传值

              $num1 = $_POST['num1'];//获取第一个输入框中的值,通过input中的name属性获得

             $select = $_POST['select'];//同上

             $num2 = $_POST['num2'];//同上

       if (is_numeric($num1) && is_numeric($num2)) {

       //is_numeric() //检测变量是否为数字或数字字符串  返回值 ,true, false  如 100, ‘100’

 

             switch ($select) {//$select是前面传来的运算符

                    case '+'://根据switch的语法,case中的值和switch括号里的值相等那么就执行case后面的那句话,不等则继续往下找

                           $result = $num1+$num2;

                           break;

                    case '-':

                           $result = $num1-$num2;

                           break;

                    case '*':

                           $result = $num1*$num2;

                           break;

                    default:

                           if ($num2==0) {//加个判断,除数不能为0

                                  echo "<script>alert('输入的除数为0请重新输入')</script>";

                           }else{

                                  $result = $num1/$num2;

                                  break;

                           }     

             }

             }else{

                    //echo 当用户输入的不是数,可能是字符串则给用户提示

                    echo "<script>alert('输入的不是数')</script>";

                    $num1 = $num2 = $result = "";//把表单里的内容清空

             }

}else{

       $num1 = $num2 = $result = "";

       $select = "+";

}

        ?>

<form method="post" action=""><!-- //method代表的表单的提交方式,本案例选的是post提交 action是接受的页面,为空表示提交到当前页 -->

            <input type = "text" name="num1" value="<?php echo $num1?>"  >

              <select name = "select">

                     <option value="+" <?php if($select == '+')echo 'selected'?>>+</option>

                     <option value="-" <?php if($select == '-')echo 'selected'?>>-</option>

                     <option value="*" <?php if($select == '*')echo 'selected'?>>*</option>

                     <option value="/" <?php if($select == '/')echo 'selected'?>>/</option>

              </select>

              <input type = "text" name="num2" value="<?php echo $num2?>" >

              <input type = "submit" name = "submit" value="=">

              <input type = "text" name="result" value="<?php echo $result?>">

       </form>

</body>

</html>

编辑:编程 本文来源:一个Form表单所提交的参数只传给第一个处理程序

关键词: