Draven Vestatt
Draven Vestatt

Reputation: 87

Need help resetting a php counter

I'm really new to php. I decided to make a counter based off a script I've seen. I've made changes to it. I'm trying to figure out how to reset the counter.

$userCount = file_get_contents("count.txt");

$userCount = trim($userCount);

$userCount = $userCount + 1;

$countReset = $userCount - $userCount;

$file = fopen("count.txt","w+");

fwrite($file,$userCount);

fclose($file);

print "The number of visitors is: $userCount";

if ($userCount < 20){
echo 'not yet';
}
else {
echo 'done!';
}

if ($userCount > 40){
fwrite($file,$countReset);
fclose($file);
}

I tried subtracting the counter from itself to get it back to 0.

$countReset = $userCount - $userCount;

However, it doesn't seem to work. the counter itself works, but I am unable to get it to reset back to 0.

This is just an impression like script I'm doing as a way to learn php. Also, sorry about the format, struggling with this post editor.

Any help with the script?

Upvotes: 2

Views: 931

Answers (6)

Brad Christie
Brad Christie

Reputation: 101614

/****************************************************************************
 * read the current count from the counter file, increment
 * it by 1, and re-save the new value off to the file
 ***************************************************************************/
function getAndIncrementCount(){
  // attempt to open the file
  // a+ means keep the contents so we can read it at least once,
  // but allow us to overwrite the value once we increment it
  if (($fHandle = fopen('count.txt','a+')) !== FALSE){
    // read in the count (also cast to an int so if there is
    // an invalid (or absent) value it will default to a 0
    $count = (int) fread($fHandle, 100);

    // increase the counter
    $count++;

    // go back to the beginning of the file
    fseek($fHandle, 0);

    // re-write the new count back to the file
    fwrite($fHandle, $count);

    // cose the file now that we're done with it
    fclose($fHandle);

    // return back the count
    return $count;
  }

  // we couldn't get to the file, so return an error flag
  return FALSE;
}

/****************************************************************************
 * write the specified value to the counter file
 ***************************************************************************/
function setCount($count = 0){
  // attempt to open the file with over-write permissions
  // w+ will open the file and clear it
  if (($fHandle = fopen('count.txt','w+')){
    // write the counter to the file
    fwrite($fHandle, $count);

    // close the file now that we're done
    fclose($fHandle);

    // return the newly saved count
    return $count;
  }

  // we couldn't get to the file, so return an error flag
  return FALSE;
}

And applied in practice:

$userCount = getAndIncrementCount();
echo "The number of visitors is: {$userCount}";

if ($userCount < 20){
  echo "Not Yet";
}else{
  echo "Done!";
}
if ($userCount > 40){
  setCount(0);
}

Upvotes: 1

Vyktor
Vyktor

Reputation: 20997

I wouldn't mix fopen() and file_get_content() functions in this context, either use fopen(), fread() and fwrite() or use file_get_contents() and file_put_contents().

If you need just reset counter and you don't need previous value, than use:

file_put_contents('count.txt', '0');

If you need update value you may use either:

$count = file_get_contents( 'count.txt');
$count++;

// Reset?
if( $reset){
    $count = 0;
}

file_put_contents( 'count.txt', "$count");

Or rather:

$fp = fopen( 'count.txt', 'r+') or die( 'Cannot use counter');
$count = trim( fread( $fp, 1024));
$count++;

// Reset?
if( $reset){
    $count = 0;
}

ftruncate( $fp, 0);
fseek( 0, SEEK_SET)
fwrite( $fp, "$count");
fclose( $fp);

Here are the manual pages for ftruncate() and fseek() + you should probably study flock() so two scripts wouldn't overwrite the content at the same time.

Upvotes: 1

ohaal
ohaal

Reputation: 5268

Couldn't you just edit the count.txt file?

Doing it in PHP, you could do

fwrite($file,'0');

EDIT: Like CanSpice said, you shouldn't close the file before you're done with it. Remove the first fclose, and it should work.

Upvotes: 1

Richard Knop
Richard Knop

Reputation: 83695

It's because you are not rewriting the file contents but adding to them when you use the fwrite second time, so $countReset gets appended to the content already in the file. Try this:

$userCount = file_get_contents("count.txt");
$userCount = $userCount + 1;

$countReset = $userCount - $userCount;

file_put_contents("count.txt", $userCount);

print "The number of visitors is: $userCount\n";

if ($userCount < 20){
    echo 'not yet';
}
else {
    echo 'done!';
}

if ($userCount > 40){   
    file_put_contents("count.txt", $countReset);
}

Upvotes: 0

CanSpice
CanSpice

Reputation: 35798

You've closed the file before trying to write to it again. Before your second fwrite, add:

$file = fopen("count.txt","w+");

Upvotes: 2

John Nu&#241;ez
John Nu&#241;ez

Reputation: 1830

Try to simply set value 0 to the var:

$countReset = 0;

Upvotes: 1

Related Questions