HTML / PHP表单不会将数据插入MySQL数据库

时间:2014-08-11 22:29:10

标签: php html mysql

我是PHP的新手,我一直在尝试制作一个小型的家庭作业管理器应用程序。

这个想法是你可以输入一个主题和描述,它将被添加到一个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表单上的Subject和Description框的输入不会进入MySQL数据库。

但是,如果我设置

'VALUES ('$subject', '$description')';

'VALUES ("test", "test")';

它有效。

任何帮助表示赞赏! 谢谢!

3 个答案:

答案 0 :(得分:1)

除了已经针对连接的缺失点给出的答案:

如果表单标记中省略了该方法,则表单方法默认为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 injection开放。使用mysqli_* with prepared statementsPDOprepared statements


使用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>

答案 1 :(得分:0)

你忘记了变量周围的点,你可以根据变量的内容添加一些双引号:)

'VALUES ("'.$subject.'", "'.$description.'")';

答案 2 :(得分:0)

您的问题是因为您在$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语句中使用单引号是正确的,您可以在此处阅读有关该主题的更多信息:When to use single quotes, double quotes and backticks