在php表单重定向之后,如何增加数字?

时间:2019-03-31 23:50:44

标签: javascript php html

我正在为网站构建一个简单的计数显示,仅在表单成功提交后才需要递增计数。表单是一种简单的HTML表单,它使用PHP mail()函数发送信息并重定向回页面。

    let clicks = Number(document.getElementById("clicks").innerHTML);
    function stateInc() {
        clicks += 1;
        document.getElementById("clicks").innerHTML = clicks;
    }

我想也许我会使用按钮内的onClick =“ function()”标签来调用一个函数,以增加存储在带有适当ID参考的标签中的页面上的数字。

    <p class="for-text">State Hats Ordered:  <a id="clicks">0</a></p>

    <p><button class="for-text" id="clicker" formaction="mailform.php" onclick="stateInc()" style="color: darkred; padding: 8px 8px; margin: 4px;">Submit Order</button></p>

我希望在离开页面之前甚至以php形式进行增量操作,但是我不确定该怎么做,到目前为止,我一直没有尝试过。

我还认为我会尝试在上面的javascript函数中进行重定向以转到表单邮件脚本,但由于显而易见的原因,由于在重定向发生时尚不具备表单信息,因此显然不起作用。

谢谢!

5 个答案:

答案 0 :(得分:1)

有两种方法:

1。在客户端存储

优点:便宜又容易

缺点:计数是特定于用户的,而不是全局/总计。因此,没有人能说出提交页面的频率。

let clicks = localStorage.getItem("clicks") || 0; // get value
clicks++;
document.querySelector("#clicks").innerText = "You've visited this page " + clicks + " time(s)"; // display on webpage
localStorage.setItem("clicks", clicks); // save value to client

2。在服务器端存储(强烈建议)

优势:总人数

缺点:需要一点点努力

由于您使用的是php,所以我假设您宁愿使用mysql。 您必须在其中创建一个数据库和一个新表。 从这一点上,您可以跟踪访问,也可以仅跟踪柜台。例如,您可以创建下表: visits(id, ip, time, url) 然后,您建立一个mysql连接并运行此sql命令INSERT INTO visits (ip, time, url) VALUES(?,?,?)。请记住,您不需要任何安全问题,尤其是在涉及sql注入时。如果您从未听说过它,那么您绝对应该阅读它。

要显示访问量,请在上一个命令后之后运行此sql命令: SELECT COUNT(id) FROM visits

要存储访问记录:

$db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

$query = $db->prepare("INSERT INTO visits (ip, time, url) VALUES(?,?,?)");
$query->bind_param("sss", $_SERVER["REMOTE_HOST"], date("Y-m-d H:i:s"), $_SERVER["REQUEST_URI"]);
$query->execute();
$query->close();
$db->close();

要显示访问计数器:

$db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

$query = $db->prepare("SELECT COUNT(id) FROM visits WHERE url = ?");
$query->bind_param("s", $_SERVER["REQUEST_URI"]);
$query->bind_result($clicks);
$query->execute();
$query->fetch();
echo "This page was" . $clicks . " time(s) visited";
$query->close();
$db->close();

通知:请确保在生产环境中运行此程序之前先进行错误检查

最后,如果不确定如何使用mysql,则将其忽略或将页数保存到文件中可能会更容易。

答案 1 :(得分:1)

尝试使用PHP会话。

  

使用session_start()函数启动会话。

     

使用PHP全局变量$ _SESSION设置会话变量。

答案 2 :(得分:0)

如果您只需要在没有其他任何增加的情况下增加计数器,则可以将当前计数器的值存储在服务器上的.txt文件中,并每次使用它来检查当前值,然后在之后增加1您的表格已发送。

但是,正如Kevin所说,最好的方法是用php将其存储在一个小型数据库中。

答案 3 :(得分:0)

如果您不想使用数据库,那么在文件中执行此操作的最佳方法是简单地添加新行。

当尝试更新文件中存储的值时,您必须读取该值,在PHP中进行更改,然后保存。如果不对文件进行排他锁,则可能会出现并发和竞速问题。基本上有2个进程可以读取它,一个进程将其递增,然后另一个进程将旧值递增,因此您错过了递增或更差的值。

因此,您可以仅添加一个新行,然后更新计数就不会涉及任何读取。

 file_put_contents($filename, "1\n",  FILE_APPEND);

那么我们如何计算文件中的行数,即行数等于增量数。

$Obj = new SplFileObject($filename, 'r');
$Obj->seek(PHP_INT_MAX); //seek to the max PHP int, or the end of the file
$line = $Obj->key();

答案 4 :(得分:-1)

您应该在PHP中管理计数器,并在表单页面中显示更新的值。您可以将值存储在数据库中。