[英]HTML/PHP form doesn't insert data to MySQL Database
我是PHP的新手,我一直在尝试制作一个小型的Homework Organizer应用程序。
这个想法是,您可以输入一个主题和描述,并且它将被添加到一个MySQL数据库中(现在是这样)。
我创建了一个HTML表单:
<form action="insert.php">
<label for="subj">Subject:</label>
<br>
<input type="text" name="subj">
<br>
<label for="desc">Description:</label>
<br>
<input type="text" name="desc">
<br>
<input type="submit" value="Submit" name="submit">
</form>
和一些PHP代码:
<?php
$subject = $_POST['subj'];
$description = $_POST['desc'];
$subject = mysql_real_escape_string($subject);
$description = mysql_real_escape_string($description);
$dbhost = ''; //These are filled in actually
$dbuser = ''; //These are filled in actually
$dbpass = ''; //These are filled in actually
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'INSERT INTO organiser '.
'(subject,description) '.
'VALUES ('$subject', '$description')';
mysql_select_db(''); //These are filled in actually
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not enter data: ' . mysql_error());
}
echo "Entered data successfully\n";
mysql_close($conn);
?>
问题在于,HTML表单上“主题”和“描述”框中的输入不会进入MySQL数据库。
但是,如果我设置
'VALUES ('$subject', '$description')';
至
'VALUES ("test", "test")';
有用。
任何帮助表示赞赏! 谢谢!
除了已经给出的关于连接符缺失点的答案之外:
如果表单方法从表单标签中省略,则表单方法默认为GET方法。
您正在使用<form action="insert.php">
等效于
<form action="insert.php" method = "get">
这不是您想要或不需要的。
更改为
<form action="insert.php" method="post">
因为您正在使用POST变量。
这是促成原因'VALUES ("test", "test")';
有效,而不是相反,因为这两个变量$subject
$description
都基于POST变量:
$subject = $_POST['subj'];
$description = $_POST['desc'];
你可以做
$sql = "INSERT INTO organiser (subject,description) VALUES ('$subject', '$description')";
如评论中所述。
要么
$sql = "INSERT INTO organiser (subject,description) VALUES ('".$subject."', '".$description."')";
将错误报告添加到文件顶部
error_reporting(E_ALL);
ini_set('display_errors', 1);
这可能表示您的代码中发现了错误。
但是,您的方法可以进行SQL注入 。 将mysqli_*
与预处理语句一起使用 ,或将PDO与预处理语句一起使用 。
使用mysqli
准备语句方法; 更安全。
<?php
$DB_HOST = "xxx"; // replace with your own
$DB_NAME = "xxx";
$DB_USER = "xxx";
$DB_PASS = "xxx";
$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}
// optional to check for empty fields
// if(isset($_POST['submit']) && !empty($_POST['subj']) && !empty($_POST['desc'])) {
if(isset($_POST['submit'])) {
$subject = stripslashes($_POST['subj']);
$description = stripslashes($_POST['desc']);
$stmt = $conn->prepare("INSERT INTO organiser (`subject`, `description`) VALUES (?, ?)");
$stmt->bind_param('ss', $subject, $description);
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
else{
echo "<h2>Success!</h2>";
}
$stmt->close(); // Statement
$conn->close(); // MySQLi
}
?>
形式:(新)
<form action = "insert.php" method = "post">
<label for="subj">Subject:</label>
<br>
<input type="text" name="subj">
<br>
<label for="desc">Description:</label>
<br>
<input type="text" name="desc">
<br>
<input type="submit" value="Submit" name="submit">
</form>
您忘记了变量周围的点,并且可以根据变量的内容在其周围添加一些双引号:)
'VALUES ("'.$subject.'", "'.$description.'")';
您的问题是因为您在$sql
声明中使用单引号,
$sql = 'INSERT INTO organiser '.'(subject,description) '.'VALUES ('$subject', '$description')';
当您使用单引号时,您是在告诉PHP您希望将引号中的所有内容按字面意义使用。
$age = 20;
$myAge = 'I am $age years';
echo $myAge;
自从您使用单引号以来,这回荡了I am $age years
。
但是,如果您使用双引号代替,
$age = 20;
$myAge = "I am $age years";
echo $myAge;
输出将是
I am 20 years
因此,您的$ sql语句应为(我将其写在一行上),
$sql = "INSERT INTO organiser (subject,description) VALUES ('$subject', '$description')";
^ ^
如果您回显$ sql,它将变成类似的东西,
INSERT INTO organiser (subject,description) VALUES ('Your subject', 'Your description')
您在SQL语句中使用单引号是正确的,您可以在此处阅读有关此主题的更多信息: 何时使用单引号,双引号和反引号
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.