php变量范围和fwrite里面的函数

时间:2013-09-05 15:08:38

标签: php

我正在试图找出我的添加到购物车进程的地方搞砸了,所以我决定添加一些日志代码(fwrite)然后我很快就了解了php变量范围。现在我被卡住了。

在我了解变量范围之前,我尝试过的第一件事。

$fp = fopen('logs/functions.txt', 'w');

function addtocart($pid,$qty){
    fwrite($fp, 'addtocart()\nProduct ID: '. $pid .'\nQuantity: '. $qty .'\n');
    if($pid<1 or $qty<1) return;
    if(is_array($_SESSION['cart'])){
        if(product_exists($pid)) return;
        $max=count($_SESSION['cart']);
        $_SESSION['cart'][$max]['productid']=$pid;
        $_SESSION['cart'][$max]['qty']=$qty;
    }else{
        $_SESSION['cart']=array();
        $_SESSION['cart'][0]['productid']=$pid;
        $_SESSION['cart'][0]['qty']=$qty;
    }
}

fclose($fp);

因此返回错误,表示未定义类似fp的内容。

然后我查了php变量范围。因为如果在另一个中写了类似的东西,它可能有效。

我尝试宣布$ fp global;

function addtocart($pid,$qty){
        global $fp;
        fwrite($fp, 'addtocart()\nProduct ID: '. $pid .'\nQuantity: '. $qty .'\n');

我收到错误“警告:fwrite():3不是有效的流资源”,就像它将$ fp转换成某种整数一样。为什么呢?

4 个答案:

答案 0 :(得分:1)

尝试使用fopen内部函数...我认为这是最好的解决方案,也许让代码为每个函数创建不同的日志文件。

希望这有用。

答案 1 :(得分:1)

您可以尝试这样的事情

<?php 
$pid=$_SESSION['PID'];
$qty=$_SESSION['QTY'];
$contentToWrite="Product ID:". $pid ."Quantity:". $qty;
$writeToText = "filePathToWriteTo.php";

if (is_writable($writeToText)) {


    if (!$willWrite = fopen($writeToText, 'w')) {
         echo "writeToText Cannot open file ";
         exit;
    }


    if (fwrite($willWrite, $contentToWrite) === FALSE) {
        echo "writeToText Cannot write to this file ".$writeToText;
        exit;
    }
    fclose($willWrite);

} else {
    echo "May be security reasons ".$writeToText." is not writable";
}?>

答案 2 :(得分:0)

您需要将文件处理程序传递给函数

function addtocart($fp,$pid,$qty){
// your code
}

根据您的代码,这是最简单的方法,并且比使用$ GLOBALS要好得多。

您是否使用http://php.net/manual/es/function.error-reporting.php来显示错误,或者您可以查看网络服务器的错误日志。

答案 3 :(得分:0)

更好的方法是使用$ GLOBALS []数组。

我不确定是否可以将global-keyword用于资源。