php包括打印1

use*_*879 7 php

我编写以下代码

<?php 
if ($id = mysql_real_escape_string(@$_GET['pid']) 
    && $uid = mysql_real_escape_string(@$_GET['file']))
       echo include "foo.php"; 
    else 
       echo include "bar.php"; 
?>
Run Code Online (Sandbox Code Playgroud)

当我将include函数与设计用于输出到页面的函数结合使用时(例如,或echo包含'foo.php'),它返回include,但在包含的内容后面带有"1".

小智 23

echo include "foo.php"
Run Code Online (Sandbox Code Playgroud)

应该

include 'foo.php';
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,打印'1'的原因是因为include()方法在成功包含所需文件之后返回一个TRUE值,当echo'输出时,该值为1. (4认同)

小智 6

请注意,在使用不带echo的include时也会发生这种情况:

<?= include 'foo.php'; ?>
Run Code Online (Sandbox Code Playgroud)

在脚本中使用时,这也将打印出返回值1.要摆脱这种情况,您需要删除语句中的'='符号,如下所示:

<? include 'foo.php'; ?>
Run Code Online (Sandbox Code Playgroud)

PHP现在将打印出没有返回值的文件内容.


src*_*der 5

好吧,所以这里的答案实际上并不完全正确;在某种意义上甚至是误导。

include获取文件的内容并将它们放在上下文中。更常见的用途之一是传递变量范围,即。通过将范围变量包含在处理程序中并include在视图上使用来在视图中传递范围变量。常见,但也有其他用途;你也可以return在一个included文件里面。

假设你有一个这样的文件:

<?php return array
    (
        'some',
        'php'
        'based'
        'configuration',
        'file'

    ); # config
Run Code Online (Sandbox Code Playgroud)

这样做$config = include 'example-config-above.php';非常好,您将在$config变量中获得上面的数组。

如果您尝试包含一个没有return声明的文件,那么您将获得1.

陷阱时间

您可能认为这include 'example-config-above.php';实际上是在调用 的文件所在的目录中搜索文件include,好吧,但它也在各种其他路径中搜索文件,而这些其他路径优先于本地路径!

所以,如果你知道你有一个像上面这样的文件,return里面有一个,但1可能会出现奇怪的 PEAR 错误之类的东西,那么你可能已经做了这样的事情:

// on a lot of server setups this will load a random pear class
include 'system.php' 
Run Code Online (Sandbox Code Playgroud)

由于它正在加载一个没有返回的文件,因此您将获得1(在我们的示例中)而不是我们期望的配置数组。

简单的修复当然是:

include __DIR__.'/system.php' 
Run Code Online (Sandbox Code Playgroud)