【问题标题】:PHP static counter?PHP静态计数器?
【发布时间】:2011-05-16 13:55:21
【问题描述】:

我正在尝试创建一个保留计数的脚本,即使它被多次调用。这是为脚本正在写入文件的某些内容行提供唯一 ID。

例如:

Monday I call the script and make 2 lines. The script gives ID 1 and 2 to those lines.
Friday I call the script again and make another line. The script gives ID 3 to this one.
etc

【问题讨论】:

    标签: php variables static


    【解决方案1】:

    我建议使用 MySQL 的自动增量功能。

    否则,存储一个平面文件来存储运行计数(并在使用时将其锁定以避免并发问题)。

    【讨论】:

    • 所以你的意思是把当前数字写入文件?如何防止有人手动编辑它?
    • 如何防止他人在您的网络服务器上编辑文件?如果是这种情况,您的网络服务器配置严重错误,存在严重的安全漏洞。如果您想阻止人们查看该文件,请将其存储在文档根目录之外。
    • @MaxMackie:如果您正在开发网页,则必须在服务器上进行操作。应该没有人能够做到这一点。如果它是一个本地脚本,您将提供给其他人,这确实是可能的。
    • 对不起,我没想到,我在服务器上工作了这么久,开发其他东西我忘了人们看不到我在看什么:)
    【解决方案2】:

    您不能使用静态变量来做到这一点。如果脚本结束,该变量将失去其值。您可以将您的信息保存在任何您想要的存储类型中(MySQL、文本文件、xml ...)。

    【讨论】:

      【解决方案3】:

      如何读取添加的最后一行的 ID 并将其加一? PHP 对数据类型没有那么严格,所以很容易做类似的事情

      $a = "1";
      $a = (int)$a;
      $a++;
      // write $a for next line
      

      【讨论】:

      • 或简称:$a = count(file('path/to/file)) + 1;
      • 好吧,如果文件是分开存储的,比如说,每个月一个,但 ID 在所有文件中应该是唯一的,该怎么办? ;-)
      • 是的,这也不是问题,这可能是个问题。但在这种情况下,可以将所有文件的所有行相加,并将总和加一。
      • 好的,这是一种方法......两种解决方案都有问题。如果有单独的文件,我的也会有困难我猜
      • 是的,但我想,John Cartwrights 的解决方案可能比查看“内部”文件要好得多。
      【解决方案4】:

      如果您还没有与数据库交互,那么对您来说最好的答案可能是 SQLite。 (SQLite 是一个 SQL 可访问的数据库,存储在一个平面文件中,允许基本的数据库功能而无需持久服务器。它在 PHP 中使用 PDO 进行访问。http://us3.php.net/manual/en/ref.pdo-sqlite.php

      否则,读取文件可能是最简单的方法。使用 fseek 有一种更智能、更高效的方法可以做到这一点,但我现在想弄清楚还为时过早。

      <?php
          $file = fopen($theFilename, 'r');
          while ($line = fscanf($file));   //Ugly, but the last value of $line will be the last line of the file. (Super cumbersome if the file is big.)
          $array = explode($line, '|') // Or whatever delimiter you're using to separate data
          $last_id = $array[0] // Assuming the ID is in the first place in the file.
       ?>
      

      【讨论】:

      • 谢谢,如果我目前的计划失败,我会调查一下。
      猜你喜欢
      • 2020-09-15
      • 2012-06-08
      • 1970-01-01
      • 2012-11-04
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多