🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
<div class="article-view"> <div class="view-body think-editor-content"><p>在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。</p> <h2 id="u83B7u53D6u53D8u91CF">获取变量</h2> <p>虽然你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:</p> <pre><code class="hljs php"><span class="hljs-variable">$id</span> = <span class="hljs-variable">$_GET</span>[<span class="hljs-string">'id'</span>]; <span class="hljs-comment">// 获取get变量</span> <span class="hljs-variable">$name</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>]; <span class="hljs-comment">// 获取post变量</span> <span class="hljs-variable">$value</span> = <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'var'</span>]; <span class="hljs-comment">// 获取session变量</span> <span class="hljs-variable">$name</span> = <span class="hljs-variable">$_COOKIE</span>[<span class="hljs-string">'name'</span>]; <span class="hljs-comment">// 获取cookie变量</span> <span class="hljs-variable">$file</span> = <span class="hljs-variable">$_SERVER</span>[<span class="hljs-string">'PHP_SELF'</span>]; <span class="hljs-comment">// 获取server变量</span></code></pre> <p>但是我们不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。所以,更好的方式是在框架中统一使用I函数进行变量获取和过滤。</p> <p><span class="e-search-highlight" rel="mark">I方法</span>是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:</p> <pre><code class="hljs bash">I(<span class="hljs-string">'变量类型.变量名/修饰符'</span>,[<span class="hljs-string">'默认值'</span>],[<span class="hljs-string">'过滤方法或正则'</span>],[<span class="hljs-string">'额外数据源'</span>])</code></pre> <p>变量类型是指请求方式或者输入类型,包括:</p> <table> <thead> <tr> <th>变量类型</th> <th>含义</th> </tr> </thead> <tbody> <tr> <td>get</td> <td>获取GET参数</td> </tr> <tr> <td>post</td> <td>获取POST参数</td> </tr> <tr> <td>param</td> <td>自动判断请求类型获取GET、POST或者PUT参数</td> </tr> <tr> <td>request</td> <td>获取REQUEST 参数</td> </tr> <tr> <td>put</td> <td>获取PUT 参数</td> </tr> <tr> <td>session</td> <td>获取 $_SESSION 参数</td> </tr> <tr> <td>cookie</td> <td>获取 $_COOKIE 参数</td> </tr> <tr> <td>server</td> <td>获取 $_SERVER 参数</td> </tr> <tr> <td>globals</td> <td>获取 $GLOBALS参数</td> </tr> <tr> <td>path</td> <td>获取 PATHINFO模式的URL参数</td> </tr> <tr> <td>data</td> <td>获取 其他类型的参数,需要配合额外数据源参数</td> </tr> </tbody> </table> <blockquote class="default"> <p>注意:变量类型不区分大小写,变量名则严格区分大小写。 <br> 默认值和过滤方法均属于可选参数。</p> </blockquote> <p>我们以GET变量类型为例,说明下<span class="e-search-highlight" rel="mark">I方法</span>的使用:</p> <pre><code class="hljs bash"><span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.id'</span>); // 相当于 <span class="hljs-variable">$_GET</span>[<span class="hljs-string">'id'</span>] <span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.name'</span>); // 相当于 <span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>]</code></pre> <p>支持默认值:</p> <pre><code class="hljs bash"><span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.id'</span>,<span class="hljs-number">0</span>); // 如果不存在<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'id'</span>] 则返回<span class="hljs-number">0</span> <span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.name'</span>,<span class="hljs-string">''</span>); // 如果不存在<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>] 则返回空字符串</code></pre> <p>采用方法过滤:</p> <pre><code class="hljs bash">// 采用htmlspecialchars方法对<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>] 进行过滤,如果不存在则返回空字符串 <span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.name'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">'htmlspecialchars'</span>); </code></pre> <p>支持直接获取整个变量类型,例如:</p> <pre><code class="hljs bash">// 获取整个<span class="hljs-variable">$_GET</span> 数组 I(<span class="hljs-string">'get.'</span>); </code></pre> <p>用同样的方式,我们可以获取post或者其他输入类型的变量,例如:</p> <pre><code class="hljs ruby"><span class="hljs-constant">I</span>(<span class="hljs-string">'post.name'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">'htmlspecialchars'</span>); <span class="hljs-regexp">//</span> 采用htmlspecialchars方法对<span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>] 进行过滤,如果不存在则返回空字符串 <span class="hljs-constant">I</span>(<span class="hljs-string">'session.user_id'</span>,<span class="hljs-number">0</span>); <span class="hljs-regexp">//</span> 获取<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'user_id'</span>] 如果不存在则默认为<span class="hljs-number">0</span> <span class="hljs-constant">I</span>(<span class="hljs-string">'cookie.'</span>); <span class="hljs-regexp">//</span> 获取整个 <span class="hljs-variable">$_COOKIE</span> 数组 <span class="hljs-constant">I</span>(<span class="hljs-string">'server.REQUEST_METHOD'</span>); <span class="hljs-regexp">//</span> 获取 <span class="hljs-variable">$_SERVER</span>[<span class="hljs-string">'REQUEST_METHOD'</span>] </code></pre> <p>param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:</p> <pre><code class="hljs bash"><span class="hljs-built_in">echo</span> I(<span class="hljs-string">'param.id'</span>);</code></pre> <p>如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。</p> <p>由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:</p> <pre><code class="hljs go">I(<span class="hljs-string">'id'</span>); <span class="hljs-comment">// 等同于 I('param.id')</span> I(<span class="hljs-string">'name'</span>); <span class="hljs-comment">// 等同于 I('param.name')</span></code></pre> <p>path类型变量可以用于获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如: 当前访问URL地址是 <code>http://serverName/index.php/New/2013/06/01</code></p> <p>那么我们可以通过</p> <pre><code class="hljs cs"><span class="hljs-function">echo <span class="hljs-title">I</span>(<span class="hljs-params"><span class="hljs-string">'path.1'</span></span>)</span>; <span class="hljs-comment">// 输出2013</span> <span class="hljs-function">echo <span class="hljs-title">I</span>(<span class="hljs-params"><span class="hljs-string">'path.2'</span></span>)</span>; <span class="hljs-comment">// 输出06</span> <span class="hljs-function">echo <span class="hljs-title">I</span>(<span class="hljs-params"><span class="hljs-string">'path.3'</span></span>)</span>; <span class="hljs-comment">// 输出01</span></code></pre> <p>data类型变量可以用于获取不支持的变量类型的读取,例如:</p> <pre><code class="hljs bash">I(<span class="hljs-string">'data.file1'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">''</span>,<span class="hljs-variable">$_FILES</span>);</code></pre> <h2 id="u53D8u91CFu8FC7u6EE4">变量过滤</h2> <p>如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:</p> <pre><code class="hljs php"><span class="hljs-comment">// 系统默认的变量过滤机制</span> <span class="hljs-string">'DEFAULT_FILTER'</span> =&gt; <span class="hljs-string">'htmlspecialchars'</span></code></pre> <p>也就说,<span class="e-search-highlight" rel="mark">I方法</span>的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:</p> <pre><code class="hljs bash">// 等同于 htmlspecialchars(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>]) I(<span class="hljs-string">'get.name'</span>); </code></pre> <p>同样,该参数也可以设置支持多个过滤,例如:</p> <pre><code class="hljs php"><span class="hljs-string">'DEFAULT_FILTER'</span> =&gt; <span class="hljs-string">'strip_tags,htmlspecialchars'</span></code></pre> <p>设置后,我们在使用:</p> <pre><code class="hljs bash">// 等同于 htmlspecialchars(strip_tags(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>])) I(<span class="hljs-string">'get.name'</span>); </code></pre> <p>如果我们在使用<span class="e-search-highlight" rel="mark">I方法</span>的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:</p> <pre><code class="hljs bash">// 等同于 strip_tags(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">'name'</span>]) <span class="hljs-built_in">echo</span> I(<span class="hljs-string">'get.name'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">'strip_tags'</span>); </code></pre> <p><span class="e-search-highlight" rel="mark">I方法</span>的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用<code>array_map</code>进行过滤处理),否则会调用PHP内置的<code>filter_var</code>方法进行过滤处理,例如:</p> <pre><code class="hljs bash">I(<span class="hljs-string">'post.email'</span>,<span class="hljs-string">''</span>,FILTER_VALIDATE_EMAIL);</code></pre> <p>表示 会对<code>$_POST['email']</code> 进行 格式验证,如果不符合要求的话,返回空字符串。 (关于更多的验证格式,可以参考 官方手册的<code>filter_var</code>用法。) 或者可以用下面的字符标识方式:</p> <pre><code class="hljs bash">I(<span class="hljs-string">'post.email'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">'email'</span>);</code></pre> <p>可以支持的过滤名称必须是<code>filter_list</code>方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:</p> <pre><code class="hljs cs"><span class="hljs-keyword">int</span> boolean <span class="hljs-keyword">float</span> validate_regexp validate_url validate_email validate_ip <span class="hljs-keyword">string</span> stripped encoded special_chars unsafe_raw email url number_int number_float magic_quotes callback</code></pre> <p>还可以支持进行正则匹配过滤,例如:</p> <pre><code class="hljs cs"><span class="hljs-comment">// 采用正则表达式进行变量过滤</span> I(<span class="hljs-string">'get.name'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">'/^[A-Za-z]+$/'</span>); I(<span class="hljs-string">'get.id'</span>,<span class="hljs-number">0</span>,<span class="hljs-string">'/^\d+$/'</span>);</code></pre> <p>如果正则匹配不通过的话,则返回默认值。</p> <p>在有些特殊的情况下,我们不希望进行任何过滤,即使<strong>DEFAULT_FILTER</strong>已经有所设置,可以使用:</p> <pre><code class="hljs cs"><span class="hljs-comment">// 下面两种方式都不采用任何过滤方法</span> I(<span class="hljs-string">'get.name'</span>,<span class="hljs-string">''</span>,<span class="hljs-string">''</span>); I(<span class="hljs-string">'get.id'</span>,<span class="hljs-string">''</span>,<span class="hljs-keyword">false</span>);</code></pre> <p>一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤。</p> <h2 id="u53D8u91CFu4FEEu9970u7B26">变量修饰符</h2> <p>最新版本的I函数支持对变量使用修饰符功能,可以更方便的通过类型过滤变量。</p> <p>用法如下: </p> <pre><code class="hljs bash">I(<span class="hljs-string">'变量类型.变量名/修饰符'</span>)</code></pre> <p>例如:</p> <pre><code class="hljs go">I(<span class="hljs-string">'get.id/d'</span>); <span class="hljs-comment">// 强制变量转换为整型</span> I(<span class="hljs-string">'post.name/s'</span>); <span class="hljs-comment">// 强制转换变量为字符串类型</span> I(<span class="hljs-string">'post.ids/a'</span>); <span class="hljs-comment">// 强制变量转换为数组类型</span></code></pre> <p>可以使用的修饰符包括: </p> <table> <thead> <tr> <th>修饰符</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>s</td> <td>强制转换为字符串类型</td> </tr> <tr> <td>d</td> <td>强制转换为整型类型</td> </tr> <tr> <td>b</td> <td>强制转换为布尔类型</td> </tr> <tr> <td>a</td> <td>强制转换为数组类型</td> </tr> <tr> <td>f</td> <td>强制转换为浮点类型</td> </tr> </tbody> </table></div> <div class="view-foot"> <div class="article-jump"> <span class="jump-up" style="display: none;">上一篇:<a data-articleid="1712" href="/manual/thinkphp/1712">控制器</a></span> <span class="jump-down" style="display: none;">下一篇:<a data-articleid="1714" href="/manual/thinkphp/1714">前置和后置操作</a></span> </div> <a class="view-backtop"><i class="icon-arrow-up2"></i></a> </div> </div>