while循环中的PHP范围问题

时间:2015-10-08 13:53:05

标签: php if-statement while-loop scope

尝试自学php,我正在努力解决我认为的范围问题?

我有一个查询,while循环,if / else和一个函数。

我想在while循环中回显函数get_patronapi_data($id)的结果。

到目前为止,我的代码如下(为清晰起见而删除);

$stmt = $conn->prepare("SELECT... ...");  //QUERY here ...

if( $stmt->num_rows > 0 )
{
    while ($stmt->fetch()) {
       if (SomethingIsTrue){
             echo get_patronapi_data($id);
            }
       else {
             echo $somethingElse;
            }  
    }//end while
}//end if

define("APISERVER", "http://mydomain:4500");

function get_patronapi_data($id) {
    $apiurl = "APISERVER" . "/PATRONAPI/$id/dump";//line 135
    $api_contents = get_api_contents($apiurl);
    $api_array_lines = explode("\n", $api_contents);
        foreach($api_array_lines as $line){ 
            if(strpos($line, "EXP DATE") !== false){ 
                $data = explode("=", $line); 
                return $data[1]; 
            }//end if
        }//end foreach
 }//end function

function get_api_contents($apiurl) {
    $api_contents = file_get_contents($apiurl);//line 154
    $api_contents = trim(strip_tags($api_contents));
    return $api_contents;
}//end function

echo get_patronapi_data($id); // this works and echoes $data on screen

每当我echo get_patronapi_data($id);在函数之外我成功地在屏幕上看到数据。但是当我在循环中echo get_patronapi_data($id);时,我收到以下错误;

  

注意:使用未定义的常量APISERVER - 假设' APISERVER'在   第135行的C:\ xampp ... search_1.php

     

警告:file_get_contents(APISERVER / PATRONAPI / 3047468 / dump):失败   打开流:C:\ xampp ... search_1.php中没有这样的文件或目录   第154行

我确定我做的事非常愚蠢,但是感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

缺失的链接是声明:

$data = get_patronapi_data($id);

你应该放在echo $data;之前。

它调用函数get_patronapi_data()作为参数传递变量$id的值,并将函数return的值存储在变量$data中。

$data变量global与函数使用的变量 if (SomethingIsTrue) { $data = get_patronapi_data($id); echo $data; } else { echo $somethingElse; } 不同。它们使用相同的名称,但它们不同(我希望您在函数中使用关键字$data。)

详细了解echo()中的功能。

更新的(片段)代码如下所示:

    if (SomethingIsTrue) {
        echo get_patronapi_data($id);
    } else {
        echo $somethingElse;
    }  

如果您不对函数返回的值进行进一步处理,您也可以从上面的代码片段中删除临时变量{{1}},并使用:

{{1}}

答案 1 :(得分:2)

将我的一些评论写回答。

您需要删除以下引号:

$apiurl = "APISERVER" . "/PATRONAPI/$id/dump";
          ^         ^ <<< remove those

因为它被视为字符串文字而不是常量。

声明于:

define("APISERVER", "http://mydomain:4500");

参考:

然后你的连接超出了范围,应该在你的函数中使用。

即:

function get_patronapi_data($conn, $id)

并为需要连接的所有功能执行此操作。

您需要确保所有文件夹/文件都具有相应的写入权限。

答案 2 :(得分:1)

假设您想在while循环中的每次迭代中从get_patronapi_data()打印数据,您需要实际调用该方法而不是使用$ data。现在你正在尝试打印一个名为$ data的东西,尽管你从来没有为它设置一个值。您在函数中返回的$数据不能在该函数之外使用,因此它在while循环中不存在。

你在while循环中可以做的是$ data = get_patronapi_data();然后回显$ data。但是,你可以回复get_patronapi_data();第一

如果您只想调用一次函数,则需要在启动while循环之前设置一个变量(即$ variable = get_patronapi_data()),然后在while循环中使用该变量(即echo $ variable) ;

答案 3 :(得分:0)

我不确定我完全理解你的问题。如果你只是把

发生什么

echo get_patronapi_data($ id);

循环中的

而不是

echo $ data;

?如上所述,您不是在循环中调用该函数。