0

カートへの追加プロセスが台無しになっている場所を突き止めようとしているので、いくつかのログ コード (fwrite) を追加することにしました。そして今、私は立ち往生しています。

変数のスコープについて学ぶ前に最初に試したこと。

$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 グローバルを宣言してみました。

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

$fp をある種の整数に変換するような「警告: fwrite(): 3 は有効なストリーム リソースではありません」というエラーが表示されます。なんで?

4

4 に答える 4

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";
}?>
于 2013-09-05T15:26:56.233 に答える
0

ファイルハンドラーを関数に渡す必要があります

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

コードによると、これが最も簡単な方法であり、$GLOBALS を使用するよりもはるかに優れています。

http://php.net/manual/es/function.error-reporting.phpを使用してエラーを表示していますか、または Web サーバーのエラー ログを確認できます。

于 2013-09-05T15:16:10.520 に答える
0

より良い方法は、代わりに $GLOBALS[] 配列を使用することです。

global-keyword をリソースに使用できるかどうかはわかりません。

于 2013-09-05T15:16:30.030 に答える