【问题标题】:PHP/MySQL query ignored if 'action' is set in form如果在表单中设置了“操作”,则忽略 PHP/MySQL 查询
【发布时间】:2011-02-12 16:23:27
【问题描述】:

我基本上有:

<form action="index.php" method="post">
    <input name="text" type="text" value="Insert text here" size="20"/>
    <input name="submit" type="submit" value="Submit" />
</form>

然后我的 PHP 代码检查是否按下了提交:

if(isset($_POST['submit'])) {
    $newDbValue = $_POST['text'];
    $sql = ("
        UPDATE `pseudo_tableName` 
        SET TEXT = '".$newDbValue."' 
        WHERE name = 'pseudo_fieldName' LIMIT 1
    ");
    //SQL-query run by php function in separate class.
}

据我了解,如果提交表单数据,它会将用户发送回 index.php

但我的做法是 无法用新值更新,并把我送回 index.php,就好像没有任何问题一样!

如果我在表单中留下action="&lt;?php $PHP_SELF; ?&gt;"action=""当我重新加载页面时它会更新(不是 F5 - 点击地址行并回车)。

我想要这个: 我点击提交,它会更新数据库,将我发送到 index.php。

如何做到这一点?

【问题讨论】:

  • 您的代码看起来正确;我想知道你是否被缓存咬了。尝试包含echo date("H:i:s", now()).'&lt;pre&gt;'.print_r($POST,true).'&lt;/pre&gt;'; 以确保您看到的页面实际上是来自服务器的最新版本,包括您的表单数据。顺便说一句,action="&lt;?php $PHP_SELF; ?&gt;" action="" 会产生相同的输出,你的意思可能是&lt;?php echo $_SERVER['PHP_SELF']; ?&gt;
  • 包含此代码的脚本名称是什么?

标签: php sql forms input


【解决方案1】:

删除表单中的action=""(让您重新加载页面并使用与if 相同的文件)并将您的if 更改为:

if(isset($_POST['submit'])) {
    $newDbValue = $_POST['text'];
    $sql = ("
            UPDATE `pseudo_tableName` 
            SET TEXT = '".$newDbValue."' 
            WHERE name = 'pseudo_fieldName' LIMIT 1
    ");
    header("Location: index.php");
    exit;
}

【讨论】:

  • 我收到一个错误:Warning: Cannot modify header information - headers already sent by (output started at /index.php:14) in /index.php on line 117 ... 第 14 行是我的 &lt;?php 标签开始的地方。第 117 行是我的 header 代码刚刚添加的位置。
  • @Kristian 所以,把这个表单处理程序放在标题添加代码之前。
【解决方案2】:

所有&lt;form&gt; 元素都需要action 属性。您所描述的可能意味着您的 PHP 脚本没有检测到表单数据,因此没有对您的 MySQL 数据库进行必要的更改。这背后的原因可能取决于您使用的浏览器;据我了解,如果您按 Enter(键盘),则表单中不包含提交按钮 value(据说这允许多个具有不同值的提交按钮并执行正确的功能)。

如果我是你,我会检查表单中的实际文本输入,而不是按钮。

<?php
// check 'text' exists and make sure it isn't blank.
if(isset($_POST['text']) && $_POST['text']!='') {
  // do MySQL updating here.
  header("Location: index.php"); // send back to index.php after updating.
}
?>

因为最有效的重定向方法是使用header();,所以您需要在HTML 表单之前编写您的PHP 表单检查脚本(因为标题不能中途发送通过实际文档),因此可能在发送 HTML 之前位于页面顶部,此外,您可以根据处理后的数据控制发送的 HTML。

【讨论】:

  • 感谢您的回答...不幸的是,我无法将 if php-check 放在文档的顶部。想象一个普通的 html 文件。在此页面上,将根据您单击的内容添加列表/链接/输入字段/按钮。示例:我选择编辑我网站上的第一页。这会将?table=firstPage 添加到我的网址并回显页面上的元素(列)。我可以通过旁边的链接选择要编辑的元素。将field=firstField 添加到url(现在是index.php?table=firstPage&amp;field=firstField。所以当我编辑一个字段时,我希望它在我点击提交时检查。不是在开始:)
  • @KristianB id 你没有 web 编程经验,最好的方法是制作一个单独的表单处理程序页面,并按照 Marwelln 提到的方式制作。所有其他的答案都只是无用的闲聊,来自伙计何不比你更了解。
  • form 不需要action 属性:w3.org/TR/html5/…
【解决方案3】:

您是否尝试过设置:

<?php
    if (isset($_POST['text']) AND !empty($_POST['text'])) {
        // ...
    }
?>

而不是其他输入?

action='index.php' 会将您送回 index.php,因此请确保您的 PHP 位于表单(以及您的 HTML)之上。我也猜你已经设置了你的 mysql_connect 和你的 mysql_query 函数。

你在 php.ini 中有 error_reporting 吗?当你 var_dump() 变量时,MySQL 查询结果集说明了什么?

<?php
    $sql = mysql_query($newDbValue));
    var_dump($sql);
?>

这真的可以帮到你。

“无法发送标头信息 - 标头已发送”是因为您在 redirect() 函数之前已将字符发送到浏览器 - 如果您要使用它,则无法将任何内容发送到浏览器(甚至是空格!),所以请确保文档中的第一件事是您的 ?> 标签,并且您的文件编码是 UTF-8,而不是 UTF-16 BOM 或类似的东西。

【讨论】:

  • 我的输入字段和按钮由?table=&amp;field URL 参数控制...它完全在PHP 标记内运行。如果我把我的if(isset($_POST[$fieldName])) 放在 PHP 代码的最开始,它甚至不会运行(因为字段的值直到代码的最后才设置。var_dump($sql); 返回bool(true)。 .. 不知道是不是你的意思。
  • @Kristian 我的意思是,如果您要使用重定向功能,请先放置您的 PHP 代码,否则它会给您错误,并始终检查变量是否存在以及它是否在所有内容中都有值(所以你的代码总是运行)。如果var_dump($sql) 返回真,那么数据库应该已经更新了。
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多