php变量作用域和函数内部的fwrite


php variable scope and fwrite inside function

我正试图弄清楚我的添加到购物车的过程在哪里出错,所以我决定添加一些日志代码(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变成某种整数一样。为什么?

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

希望这是有益的。

您可以尝试类似的

<?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";
}?>

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

我不确定是否可以对资源使用全局关键字。

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

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

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

你在用吗http://php.net/manual/es/function.error-reporting.php以显示错误,或者您可以查看web服务器的错误日志。