我的表单正在提交多个数据库条目,但我不希望它这样做
My form is submitting multiple database entries and I don't want it to
我有一个简单的 html 表单和一个 php 文件来执行数据库插入。我遇到的问题是,当我按下提交按钮时,我的数据库 table 收到同一提交的 3 份副本,而我只需要一份。下面是代码。
html:
<!DOCTYPE html>
<html>
<form action="demo.php" method="post">
<p>
Input 1: <input type="text" name="input1" />
<input type="submit" value="Submit" />
</p>
</form>
</html>
php:
<?php
define('DB_NAME', 'phpmyadminName');
define('DB_USER', 'phpmyadminUser');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
$value = $_POST['input1'];
$sql = "INSERT INTO demo (input1) VALUES ('$values')";
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
mysql_close();
?>
由于显而易见的原因,DB_NAME、DB_USER 和 DB_PASSWORD 都已更改,但代码确实有效。
它只是向数据库提交了太多的表单数据副本table。早在我上学的时候,我就遇到过这个问题,但问题似乎出在服务器端,而不是我们的代码。这里使用的服务器是我的,我可以完全控制它。如果服务器出了问题,我需要帮助来纠正(因为我这样做是为了学习如何管理这些工具,所以我只知道基本级别的管理)。
您在名为 $value
的变量中获取 POST 输入值,并在查询中发送 $values
我已经更正了代码。
你能试试下面的代码吗
<?php
define('DB_NAME', 'phpmyadminName');
define('DB_USER', 'phpmyadminUser');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
$value = $_POST['input1'];
if($value!=''){
$sql = "INSERT INTO demo (input1) VALUES ('".$value."')";
}
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
mysql_close();
?>
Kenneth,您在此处提供的代码确实需要一些改进。首先,请不要再使用 mysql
API 了。它已被弃用,在未来的 PHP 版本中将不再受支持,并且不安全。对于所有数据库操作,请使用 mysqli
或 PDO
API,最好使用准备好的语句。
其次,永远不要 INSERT
$_POST
或 $_GET
变量在没有 validating/sanitizing 的情况下直接进入数据库,因为有人可能会删除您的数据,甚至更糟的是您的整个数据库。 PHP 有许多函数可以使这非常容易,例如 ctype 取决于数据类型。
也许在你的代码中尝试这样的事情:
if (!empty($_POST['input1'])) { //checks if data was received//
$value = $_POST['input1'];
mysql_real_escape_string($value);
$sql = "INSERT INTO demo (input1) VALUES ('$value')";
} else {
echo "form was not received";
exit;
}
我还注意到您的变量名称不同,上面已更正。
编辑:
错误地为 PHP ctype 函数使用了错误的语法。
以下是该问题的正确代码。我已经检查过,当您刷新页面时,它会在数据库中创建新的空白条目,而且变量名也是错误的。
您必须检查 Request 方法。这个
$_SERVER['REQUEST_METHOD'] === 'POST'
将检查表单方法,它将防止数据库中出现空白条目。
<?php
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', 'mysqldba');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
//Test for request method
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$value = $_POST['input1'];
$sql = "INSERT INTO demo (input1) VALUES ('$value')";
//echo $sql;die;
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
}
mysql_close();
?>
我有一个简单的 html 表单和一个 php 文件来执行数据库插入。我遇到的问题是,当我按下提交按钮时,我的数据库 table 收到同一提交的 3 份副本,而我只需要一份。下面是代码。
html:
<!DOCTYPE html>
<html>
<form action="demo.php" method="post">
<p>
Input 1: <input type="text" name="input1" />
<input type="submit" value="Submit" />
</p>
</form>
</html>
php:
<?php
define('DB_NAME', 'phpmyadminName');
define('DB_USER', 'phpmyadminUser');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
$value = $_POST['input1'];
$sql = "INSERT INTO demo (input1) VALUES ('$values')";
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
mysql_close();
?>
由于显而易见的原因,DB_NAME、DB_USER 和 DB_PASSWORD 都已更改,但代码确实有效。
它只是向数据库提交了太多的表单数据副本table。早在我上学的时候,我就遇到过这个问题,但问题似乎出在服务器端,而不是我们的代码。这里使用的服务器是我的,我可以完全控制它。如果服务器出了问题,我需要帮助来纠正(因为我这样做是为了学习如何管理这些工具,所以我只知道基本级别的管理)。
您在名为 $value
的变量中获取 POST 输入值,并在查询中发送 $values
我已经更正了代码。
你能试试下面的代码吗
<?php
define('DB_NAME', 'phpmyadminName');
define('DB_USER', 'phpmyadminUser');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
$value = $_POST['input1'];
if($value!=''){
$sql = "INSERT INTO demo (input1) VALUES ('".$value."')";
}
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
mysql_close();
?>
Kenneth,您在此处提供的代码确实需要一些改进。首先,请不要再使用 mysql
API 了。它已被弃用,在未来的 PHP 版本中将不再受支持,并且不安全。对于所有数据库操作,请使用 mysqli
或 PDO
API,最好使用准备好的语句。
其次,永远不要 INSERT
$_POST
或 $_GET
变量在没有 validating/sanitizing 的情况下直接进入数据库,因为有人可能会删除您的数据,甚至更糟的是您的整个数据库。 PHP 有许多函数可以使这非常容易,例如 ctype 取决于数据类型。
也许在你的代码中尝试这样的事情:
if (!empty($_POST['input1'])) { //checks if data was received//
$value = $_POST['input1'];
mysql_real_escape_string($value);
$sql = "INSERT INTO demo (input1) VALUES ('$value')";
} else {
echo "form was not received";
exit;
}
我还注意到您的变量名称不同,上面已更正。
编辑:
错误地为 PHP ctype 函数使用了错误的语法。
以下是该问题的正确代码。我已经检查过,当您刷新页面时,它会在数据库中创建新的空白条目,而且变量名也是错误的。
您必须检查 Request 方法。这个
$_SERVER['REQUEST_METHOD'] === 'POST'
将检查表单方法,它将防止数据库中出现空白条目。
<?php
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', 'mysqldba');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link){
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db(DB_NAME, $link);
if (!$db_selected){
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
}
//Test for request method
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$value = $_POST['input1'];
$sql = "INSERT INTO demo (input1) VALUES ('$value')";
//echo $sql;die;
if (!mysql_query($sql)){
die('Error: ' . mysql_error());
}
}
mysql_close();
?>