【问题标题】:Why is my form auto submitting on page load?为什么我的表单在页面加载时自动提交?
【发布时间】:2014-12-31 04:35:48
【问题描述】:

我有一个 html 表单,它可以在表单中的所有元素之间自动切换。提交后,它调用第一个元素(order_number)并且光标停留在第二个字段中,这样人们就可以使用相同的 order_number 扫描多个(Chip_numbers)。

要重置整个表单,我想刷新页面,但是弹出错误消息并且光标自动放在第二个元素中。

这是我的脚本:

<?php
$servername = "host";
$username = "username";
$password = "password";
$dbname = "JVSIntranet";

$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MICROCHIP_TBL (chip_number,order_number)
VALUES 
('$_POST[chip_number]','$_POST[order_number]')";

IF (mysqli_query($conn, $sql)) {
    echo "Great Job! You've entered it correctly!";
} else {
    echo "Error: TRY AGAIN HUMAN!";
}

$value = "";
if( isset( $_POST ["order_number"] )) $value = $_POST ["order_number"];

mysqli_close($conn);
?>

<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">
  function getNextElement(field) {
    var form = field.form;
    for ( var e = 0; e < form.elements.length; e++) {
        if (field == form.elements[e]) {
            break;
        }
    }
    return form.elements[++e % form.elements.length];
}

function tabOnEnter(field, evt) {
if (evt.keyCode === 13) {
        if (evt.preventDefault) {
            evt.preventDefault();
        } else if (evt.stopPropagation) {
            evt.stopPropagation();
        } else {
            evt.returnValue = false;
        }
        getNextElement(field).focus();
        return false;
    } else {
        return true;
    }
}

</script>
</head>

<body onLoad="document.chip_insert.chip_number.focus();">
<center>
<h1>Jeffers HomeAgain Microchip Entry</h1>


<form name="chip_insert"  id="chip_insert" action="<?php echo $PHP_SELF;?>" method="post" >
Order Number: <input tabindex="1" maxlength="12" type="text" name="order_number"  id="order_number" value="<?php echo $value; ?>"  required="required"onkeydown="return tabOnEnter(this,event)"  /><br /><br />
Tag Number: <input tabindex="2" maxlength="15" type="text" name="chip_number" id="chip_number" required="required" /><br /><br />
<input tabindex="7" type="submit" />
</center>
</form>

</body>
</html>

【问题讨论】:

  • 因为初始 PHP 只是加载,所以没有什么要等待表单加载。没有检查您是否提交了表单。
  • 你是对的,但我是新手,所以我不知道正确的方法

标签: javascript php jquery html forms


【解决方案1】:

无论何时打开此页面,无论是否有帖子,它都会插入数据库。 因为没有后期控制(是post来还是不控制)下面的代码块:

IF (mysqli_query($conn, $sql)) {
 echo "Great Job! You've entered it correctly!";
} else {
 echo "Error: TRY AGAIN HUMAN!";
}

这部分应该是这样的:

if(isset($_POST)){
  IF (mysqli_query($conn, $sql)) {
    echo "Great Job! You've entered it correctly!";
  } else {
     echo "Error: TRY AGAIN HUMAN!";
 }
}

【讨论】:

  • 如果您只是询问是否设置了帖子,这并不是很好。因为如果你提交的表单是空的,post IS set ^^
  • 你是对的,检查帖子是否为空应该添加代码:)
【解决方案2】:

这段代码还有一些问题...

IF (mysqli_query($conn, $sql)) {
 echo "Great Job! You've entered it correctly!";
} else {
 echo "Error: TRY AGAIN HUMAN!";
}

应该是这样的

if(isset($_POST['chip_number'] && $_POST['chip_number'] != '')
{
  IF (mysqli_query($conn, $sql)) {
   echo "Great Job! You've entered it correctly!";
  } else {
   echo "Error: TRY AGAIN HUMAN!";
  }
}

$sql = "INSERT INTO MICROCHIP_TBL (chip_number,order_number)
VALUES 
('$_POST[chip_number]','$_POST[order_number]')";

应该有点像

$sql = "INSERT INTO MICROCHIP_TBL (chip_number,order_number)
VALUES 
('{$_POST['chip_number']}','{$_POST['order_number']}')";

即使是最后一件事也不是正确的类型来调用它...... 可以看看http://php.net/manual/en/mysqli-stmt.bind-param.php

实际上会是什么样子

$stmt = mysqli_prepare($link, "INSERT INTO MICROCHIP_TBL VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'dd', $_POST['chip_number'], $_POST['order_number']);
//....
mysqli_execute();

$stmt = mysqli_prepare($link, "INSERT INTO MICROCHIP_TBL SET chip_number=?,order_number=?");
mysqli_stmt_bind_param($stmt, 'dd', $_POST['chip_number'], $_POST['order_number']);
//....
mysqli_execute();

这些样本不是构建到像 $db = new mysqli(...); 这样的对象上的。但是您应该考虑以这种方式使用它:)

【讨论】:

  • 您链接的手册看起来主要是德文,但我会多看一些。但是,我确实按照您所说的方式编辑了我的代码,并且页面加载并仍然自动提交,现在当我尝试通过标签浏览元素时,我得到“找不到页面”错误。所以它又破坏了一点,我现在撤消了这些更改。
  • 抱歉,但它在 php.net 上,所以你只需要将字母 DE 切换为 EN,这样你就可以在这里得到这个 php.net/manual/en/mysqli-stmt.bind-param.php,我将在我的帖子中编辑它。我还编辑了 if。尝试使用$var != '' 而不是!empty($var)
  • 我尝试了您编辑的版本,页面现在甚至无法加载。我迷茫了,但仍然没有放弃。
  • 可能是因为您遇到了一些错误。在第一行添加error_reporting(E_ALL);,然后再试一次。页面返回什么?
  • 页面加载,但是当我提交时,我得到“网站无法显示页面”,即使有 error_reporting(E_ALL);在第一行
【解决方案3】:

你的 php 部分应该是这样的

<?php
$servername = "host";
$username = "username";
$password = "password";
$dbname = "JVSIntranet";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}



$value = "";
if (isset($_POST ["order_number"])) {
    $value = $_POST ["order_number"];
    $sql = "INSERT INTO MICROCHIP_TBL (chip_number,order_number)
VALUES 
('$_POST[chip_number]','$_POST[order_number]')";

    if (mysqli_query($conn, $sql)) {
        echo "Great Job! You've entered it correctly!";
    } else {
        echo "Error: TRY AGAIN HUMAN!";
    }
}


mysqli_close($conn);
?>

在 html 中,&lt;/center&gt; 应该在 &lt;/form&gt; 标记之后,虽然这不是大问题

【讨论】:

  • 我试过了,但当我简单地浏览一个元素时,它仍然自动提交并显示“找不到页面”。我知道我必须告诉 php 等待表单提交,我只需要方法,我对此非常陌生。
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多