【问题标题】:Problem with PHP number incrementPHP数字增量问题
【发布时间】:2011-09-10 01:07:16
【问题描述】:

我有一个简单的表单,其中包含名称和消息字段。当用户提交表单时,页面会显示用户输入的用户 ID 号,当服务器中不存在文件“data.db”时,会在提交时创建文件。用户 ID 号将从 1 开始,每次存储新提交时递增 1。

文件格式如下:

1|{name1}|{gender1}|{email1}|{phone1}
2|{name2}|{gender2}|{email2}|{phone2} ...

但是,我在显示用户编号时遇到了问题,每次提交表单时它都停留在 1。

我创建的 $userid 变量似乎根本没有增加...

这是用于在表单提交后显示数据的 php 代码...

 <?php
     include("email.php");

     $userid += 1;

     echo "<b><u>Your submission has been added!</u></b> <br />";
     echo "User ID: " . $userid . "<br /><br />";
     echo "Name = ";
     echo $_POST["name"];
     echo "<br /> Gender = ";
     echo $_POST["gender"];
     echo "<br /> E-Mail = ";
     echo $_POST["email"];
     echo "<br /> Phone No. = ";
     echo $_POST["phone"];
     echo "<br />";
     echo "<p>Thank You</p>";

     $entry = $userid . "|" . $_POST["name"] . "|" . $_POST["gender"] . "|" . $_POST["email"] . "|" . $_POST["phone"] . "\n";

     file_put_contents("data.db", $entry, FILE_APPEND|LOCK_EX);

     echo "Confirm email sent!";
     ?>

【问题讨论】:

  • 你在哪里初始化$userid
  • 您的脚本不知道它的调用频率。所以 userid 永远是一个。如果它基于同一会话中的同一用户,则可以使用 _SESSION,或者您必须永久存储增量值(如在数据库或文件中)

标签: php increment


【解决方案1】:

$userid 的值不会保留在页面的不同负载上。您可以将其存储在 $_SESSION 全局中以访问它,但这仅在 (a) 您正在使用会话并且 (b) 它是同一会话中同一终端的同一用户时才有效。

我认为您想要的是在任何用户查看页面时使用(并增加)该值。因此,您需要将值存储在文件或 SQL 数据库中。在页面加载时查找它,增加它,将它写回磁盘。但是你会遇到同时访问的问题——如果两个用户同时打开页面怎么办——你可能不会得到一个唯一的[递增]数字。

我建议使用某种 SQL 后端,并让它自动生成一个唯一 ID 以在输出中使用,从而保证每次都有唯一的用户 ID。

【讨论】:

    【解决方案2】:

    正如我在评论中所写,您的脚本无法知道它被调用的频率。所以你必须永久存储用户标识。

    您可以使用它(警告:我不负责文件处理,例如,当同时提交 2 个表单时):

    <?php
     include("email.php");
     include('counter.php');
    
     $userid += 1;
    
     file_put_contents('counter.php', '<?php $userid = '.$userid.';');
    
     echo "<b><u>Your submission has been added!</u></b> <br />";
     echo "User ID: " . $userid . "<br /><br />";
     echo "Name = ";
     echo $_POST["name"];
     echo "<br /> Gender = ";
     echo $_POST["gender"];
     echo "<br /> E-Mail = ";
     echo $_POST["email"];
     echo "<br /> Phone No. = ";
     echo $_POST["phone"];
     echo "<br />";
     echo "<p>Thank You</p>";
    
     $entry = $userid . "|" . $_POST["name"] . "|" . $_POST["gender"] . "|" . $_POST["email"] . "|" . $_POST["phone"] . "\n";
    
     file_put_contents("data.db", $entry, FILE_APPEND|LOCK_EX);
    
     echo "Confirm email sent!";
     ?>
    

    【讨论】:

    • 啊。好的。也许我可以创建一个名为“userid.txt”的文本文件,内容为“0”。是否有脚本读取该值,然后将其中的值加 1 并重新保存文件?
    • 为什么使用文本文件...使用我的代码它会使用 userid 变量写入 phpfile。并自动包含它。 (当然,在第一次运行之前,您应该使用 &lt;?php $userid = 0; 创建 counter.php。
    • 确保 counter.php 是可写的。
    • @Rufinus - 我不确定这是否适用于负载较重的系统 - 您可能最终有两个(或更多!)用户同时尝试写入 counter.php。其中只有一个会成功,这意味着其他对 file_put_contents 的调用会失败——更不用说多个用户都可以从相同版本的 counter.php 中读取的事实——这绝对不是你想要的!跨度>
    • 没什么我没有提到的......但如果你阅读包含文件的代码并立即写入,这会在几毫秒内完成,负载必须非常高,但我会使用真实的数据库。但只要他使用相同的机制来存储文件,我想负载不会那么高:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多