将javascript prompt()保存到mysql

时间:2011-04-20 17:32:26

标签: php javascript

<script type="text/javascript">
function saveReason()
{
var reason=prompt("I'm saving this because","");
if (reason!=null && reason!="")
  {
  <?php
       mysql_query("INSERT INTO `save` (reason) VALUES ('reason'))");
  ?>
  }
}
</script>

我感到愚蠢,因为我不认为我的想法会起作用。从prompt()框中获取数据并将其保存到mysql的正确方法是什么?

6 个答案:

答案 0 :(得分:11)

这个答案将是迄今为止我在这里看到的大多数事情的综述,但更详细一点。

您似乎对服务器端和客户端代码感到困惑。在将页面内容发送到客户端之前执行PHP代码。此页面包含您的javascript。因为php是在服务器上执行的,所以在发送到客户端之前,我们将其称为服务器端代码。因为php是一种在服务器端执行的编程语言,所以我们将其称为服务器端语言。

因此,包含javascript和html的页面将发送到客户端。浏览器现在解释html,然后突然找到<script>标签。它立即开始执行脚本标记之间的javascript。因为这个脚本是在客户端的浏览器中执行的,所以我们说它是在客户端执行的。但是,说javascript是一种纯粹的客户端语言是错误的,因为现在正在使用像node.js这样的东西,但是,因为看起来你刚开始弄清楚所有这些东西,我会坚持使用php作为服务器侧。如果你掌握了php,以及客户端和服务器端脚本的概念,那么nodejs绝对值得一看。但现在,我正在摆脱这个答案的主要观点。回到它,让我们来看看你发布的代码。所有这些代码都放在.php文件中:

<script type="text/javascript">
function saveReason()
{
var reason=prompt("I'm saving this because","");
if (reason!=null && reason!="")
  {
  <?php
       mysql_query("INSERT INTO `save` (reason) VALUES ('reason'))");
  ?>
  }
}
</script>

现在让我们看看请求此页面时会发生什么。 当服务器开始查看php文件时,它处于HTML模式。这意味着它遇到的任何事情都将被添加到输出中。 所以你的javascript将被添加到输出直到第6行,因为在第7行,你打开php标签。服务器现在进入PHP模式,这意味着它执行它遇到的php代码,将php代码的任何输出添加到已处理的输出中。

处理您的SQL查询。查询在表'save'中添加一行,其中'reason'列的值为'reason',因为这是你传递给它的字符串。在此查询之后,服务器遇到关闭的php标记。它现在将html的其余部分添加到输出中,并将其发送给用户。用户现在将收到的页面如下所示:

<script type="text/avascript">
function saveReason()
{
var reason = prompt("I'm saving this because");
if (reason!=null && reason!="")
  {
  }
}

你应该这样做是使用AJAX。 AJAX代表 Asynchronuous 使用Javascript 和 XML。

这基本上意味着在不重新加载页面的情况下向服务器发送请求。这在原生javascript中是可能的,但由于浏览器之间的差异,使用javascript框架更容易。使用框架编写的代码也更具可读性。我将向您展示如何使用jQuery完成它,这是最容易学习的框架之一。

    $.post("save.php", { reason: reason});

此代码向您的服务器发送帖子请求

在您的服务器上,您创建一个名为save.php的文件来处理数据。使用您发布的代码,php文件将如下所示:

<?php
$reason = $_POST['reason'];     // gets the data it received from the request
mysql_query("INSERT INTO `save` (reason) VALUES ('"+$reason+"'))");
?>

现在,为了安全起见,你应该让你从用户那里获得的数据安全地放入数据库,这样黑客就不能使用sql注入,所以你应该将第2行更改为

$reason = mysql_real_escape_string($_POST['reason']);

您可能还希望确保用户无法向您的网页添加额外的HTML,甚至更糟糕的额外JavaScript。您可以通过在mysql_query之前添加额外的行来实现此目的:

$reason = strip_tags($reason);

您可以通过将第2行编辑为

来缩短此时间
$reason = mysql_real_escape_string(strip_tags($_POST['reason']));

我希望有所帮助。

答案 1 :(得分:6)

在谈论JS时,正确的方法是完全忘记 mysql。 你不能用JS与mysql交互。你可以调用PHP脚本,它将与mysql交谈 但它将是另一个 PHP脚本,而不是您运行以显示此页面的脚本。

您需要了解浏览器的工作原理。

整个PHP脚本在服务器端执行,在浏览器中生成纯HTML。仅限HTML和JS。浏览器中没有PHP。

这就是为什么你不能在同一个PHP脚本中编写HTML表单和它的处理程序,只需在第一个脚本之后放置后者。您将不得不再次调用服务器以使处理程序工作。它将完全是另一个调用,是同一个脚本的另一个实例,而前一个已经很久以前就已经死了 - 这是你必须要了解的关于PHP的另一件事:

PHP脚本执行是原子的。它不像是在您的浏览器中不断运行的桌面应用程序,甚至不是与您的桌面应用程序持久连接的恶魔。它更像是一个命令行实用程序 - 做它的工作和退出。它运行离散:

  1. 浏览器拨打电话
  2. PHP醒来,创建一个HTML页面,将其发送到浏览器并消亡
  3. 浏览器呈现该HTML并将其显示给用户。
  4. 用户点击链接
  5. 浏览器拨打电话
  6. 另一个PHP实例,对前一个调用一无所知,醒来等等

答案 2 :(得分:3)

您需要使用AJAX将数据从提示符发送到服务器端PHP脚本。

如果你正在使用JQuery,你的Javascript看起来像这样:

 function saveReason()
{

    var reason=prompt("I'm saving this because","");
    if (reason!=null && reason!="")
    {
        $.post("save.php", { reason: reason});
    }
}

'save.php'中的PHP代码如下所示:

$reason = mysql_escape_string($_POST['reason']);
mysql_query("INSERT INTO `save` (reason) VALUES ($reason))");

答案 3 :(得分:1)

当你找到技术方法来实现你在这里尝试的东西时(Ajax调用serverphp来处理SQL插入)不要做它!您打开的安全漏洞让任何人都可以将他们想要的任何内容发送到您的数据库中,因此3岁的人将能够通过它驱动恶意代码。让用户提供一些值,然后自己编写SQL以利用这些值。

答案 4 :(得分:0)

Javascript是客户端语言,PHP是服务器端语言。您必须发出ajax请求才能将所需数据发送到服务器并执行您想要的操作(在这种情况下插入原因)。

答案 5 :(得分:0)

不能这样做,因为PHP是服务器端的,并且在javascript被加载之前执行(客户端)。如果你真的想这样做我认为你必须看看AJAX,它允许你使用javascript向另一个页面发出请求。这样你就可以访问anotherfile.php?reason = reasonhere并在那个页面上执行查询。