PHP 表单未插入 mySQL 数据库
Posted
技术标签:
【中文标题】PHP 表单未插入 mySQL 数据库【英文标题】:PHP form not inserting into mySQL database 【发布时间】:2014-04-04 00:40:12 【问题描述】:我试图将表单中的两个文本字段拉到一个基本的 mysql 数据库中,这给我带来了麻烦。所以这是我的两个文件,首先是 html 表单:
<!DOCTYPE html>
<html>
<body>
<title>Home Page</title>
<h3>Please Place your Order Below:</h3>
<form action="tacoOrder.php" method="POST" />
<p>Name: <input type="text" name="name" /></p>
<p>Taco Order: <input type="text" name="tacoOrder" /></p>
<input type="submit" value="Submit" />
</form>
</body>
</html>
和 PHP:
<?php
define('DB_NAME', 'tacoPractice');
define('DB_USER', 'root');
define('DB_PASS', 'root');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link)
die('Could not connect to database: ' . mysql_error());
$db_select = mysql_select_db(DB_NAME);
if(!$db_select)
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
echo "HOLY EFF";
$name = $_POST('name');
$tacoOrder = $_POST('tacoOrder');
$query = "INSERT INTO orders ('name', 'tacoOrder') VALUES ('$name', '$tacoOrder')";
if(!mysql_query($query)
die("DAMMIT");
$mysql_close();
?>
它没有给出连接错误,但没有数据插入到我的数据库中。有什么想法吗?
谢谢。
【问题讨论】:
【参考方案1】:不需要 '' 和 $_POST('name')
$name = $_POST['name'];
$tacoOrder = $_POST['tacoOrder'];
$query = "INSERT INTO orders ('name', 'tacoOrder') VALUES ('$name','$tacoOrder')";
【讨论】:
复制答案是坏习惯:) 我没有复制我先给出了答案,外星人先生 您在阅读了我和 marcs 的答案后编辑了您的答案,您只是回答不要使用花括号,我到处都有眼睛 我没有看到你的答案我看到了代码并编辑了它。 没错。 ?.无论如何,您的答案仍然是错误的,表名没有引号,没有看到吗?【参考方案2】:基本 PHP:$_POST 是一个数组。这不是一个函数:
$name = $_POST('name');
^------^--- should be []
【讨论】:
【参考方案3】:所有$_POST('var_name')
都应该是$_POST['var_name']
;
替换
$name = $_POST('name');
$tacoOrder = $_POST('tacoOrder');
作者:
$name =mysql_real_escape_string($_POST['name']);
$tacoOrder = mysql_real_escape_string($_POST['tacoOrder']);
【讨论】:
【参考方案4】:其他人已经给了你答案。要添加,您在列名周围使用引号,这些引号应该是反引号或完全删除引号。
变化:
INSERT INTO orders ('name', 'tacoOrder')
^ ^ ^ ^
到
INSERT INTO orders (`name`, `tacoOrder`)
或
INSERT INTO orders (name, tacoOrder)
或者作为一个完整的答案:
$name = $_POST['name'];
$tacoOrder = $_POST['tacoOrder'];
$query = "INSERT INTO orders (`name`, `tacoOrder`) VALUES ('$name', '$tacoOrder')";
旁注:反引号不是必需的,但列名不能使用单引号。我自己在列名周围使用反引号只是一种习惯。
另外,这个$mysql_close();
不应该在mysql_close
前面有一个$
,而是在括号内有一个$link
:
更改为mysql_close($link);
正如 Alien 先生所说,mysql_close()
的变量是可选的(谢谢)
在if(!mysql_query($query)
中还缺少一个)
,应该读作if(!mysql_query($query))
请考虑使用准备好的语句或 PDO 切换到 mysqli_*
函数。 mysql_*
函数已弃用,将从未来的版本中删除。
完全重写:(测试并在我的服务器上工作)
<?php
define('DB_NAME', 'tacoPractice');
define('DB_USER', 'root');
define('DB_PASS', 'root');
define('DB_HOST', 'localhost');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link)
die('Could not connect to database: ' . mysql_error());
$db_select = mysql_select_db(DB_NAME);
if(!$db_select)
die('Can\'t use ' . DB_NAME . ': ' . mysql_error());
echo "HOLY EFF";
$name = $_POST['name'];
$tacoOrder = $_POST['tacoOrder'];
$query = "INSERT INTO orders (name, tacoOrder) VALUES ('$name', '$tacoOrder')";
if(!mysql_query($query))
die("DAMMIT");
else echo "Success";
mysql_close();
?>
你也可以使用这个稍有不同的方法:
$query = mysql_query("INSERT INTO orders (name, tacoOrder) VALUES ('$name', '$tacoOrder')");
if (!$query)
die('Invalid query: ' . mysql_error());
else echo "Success";
脚注:
您可能会获得空数据条目,因为您没有检查表单元素是否为空。
您可以使用条件语句来实现:
if(!empty($_POST['name']) || !empty($_POST['tacoOrder']))
// continue with code processing
另外,使用 Awlad 在 his answer
中提到的关于使用 mysql_real_escape_string()
的内容
您还可以在 SO How can I prevent SQL injection in PHP?
上阅读一篇好文章
这是一个(基本)基于mysqli_*
的方法,带有mysqli_real_escape_string()
函数和一个条件语句,用于检查是否有任何字段为空。
如果其中一个字段为空,则不会执行查询。
<?php
define('DB_NAME', 'tacoPractice');
define('DB_USER', 'root');
define('DB_PASS', 'root');
define('DB_HOST', 'localhost');
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link)
die('Could not connect to database: ' . mysqli_error());
$db_select = mysqli_select_db($link,DB_NAME);
if(!$db_select)
die('Can\'t use ' . DB_NAME . ': ' . mysqli_error());
echo "HOLY EFF";
$name = mysqli_real_escape_string($link,$_POST['name']);
$tacoOrder = mysqli_real_escape_string($link,$_POST['tacoOrder']);
if(!empty($_POST['name']) || !empty($_POST['tacoOrder']))
$query = "INSERT INTO orders (name, tacoOrder) VALUES ('$name', '$tacoOrder')";
if(!mysqli_query($link,$query))
die("DAMMIT");
else echo "Success";
mysqli_close($link);
?>
【讨论】:
它们都不是 sql 保留关键字,因此您不需要反引号,此外,变量对于mysql_close ()
in1.php.net/mysql_close 和 aaaah 是可选的,我没有看到表名周围的引号,将删除我的并赞成你的,但你可以删除你的答案中不必要的部分
我说的是列名,而不是保留字。它们不能用引号括起来,而是用反引号括起来。 @Mr.Alien 值是但不是列名。
是的,但这里不需要反引号,如果我们使用 mysql 保留关键字作为列名,则使用它们
你的意思是$link
里面的mysql_close
? @Mr.Alien
是的,我同意反引号,但我倾向于认为使用它们更安全。但你是对的,反引号不是必需的,但引号不能使用。 @Mr.Alien 这只是我的一种习惯。【参考方案5】:
嗨@user2839411,即使我遇到了同样的问题,值没有被插入到mysql数据库中,所以尝试在许多相关网站中搜索,但最后w3schools帮助我获得了结果。 这是将值插入数据库的波纹管代码。
PHP 代码:
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "dbitb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error)
die("Connection failed: " . $conn->connect_error);
if(isset($_POST['btn-signup']))
$name = ($_POST['name']);
$address = ($_POST['address']);
$email = ($_POST['email']);
$mobile = ($_POST['mobile']);
$highest_degree = ($_POST['highest_degree']);
$relavant_exp = ($_POST['relavant_exp']);
$sql = "INSERT INTO dbitb.volunteer_reg (name,address,email,mobile,highest_degree,relavant_exp)
VALUES ('$name','$address','$email','$mobile','$highest_degree','$relavant_exp')";
if ($conn->query($sql) === TRUE)
echo "New record created successfully";
else
echo "Error: " . $sql . "<br>" . $conn->error;
$conn->close();
?>
HTML 代码:
<form method="post" action ="register.php" id="contact-form">
<input type="text" name="name" placeholder="name" required />
<textarea id = "address" name="address" placeholder="address" required /></textarea>
<input type="email" name="email" placeholder="email" required />
<input type="mobile" name="mobile" placeholder="mobile" required />
<input type="highest_degree" name="highest_degree" placeholder="highest degree" required />
<textarea id = "relavant_exp" name="relavant_exp" placeholder="relavant experience" required /></textarea>
<div class="btn-group" role="group">
<input type="submit" class="btn btn-default" name="btn-signup" value="Enter the box" style="margin-top: 15px; margin-right: 15px; border-radius: 4px;">
<a href="index.html"><button type="button" class="btn btn-default" style="margin-top: 15px;">« Back</button></a>
</div>
</form>
【讨论】:
【参考方案6】:我也有同样的挑战。这就是我在 12 个令人沮丧的小时后解决它的方法。
<?php
if(isset($_POST['button']))
// echo "hi";
$username = $_POST['username'];
$password = $_POST['password'];
//TO ALERT SUBMISSION OF BLANK FIELDS(IT DOESN'T PREVENT SUBMISSION OF BLANK FIELD THOUGH)
if (!$username && !$password)
echo "can't submit blank fields";
//TO CONFIRM YOU ARE CONNECTED TO YOUR DATABASE (OPTIONAL)
$connection = mysqli_connect('localhost', 'root', '', 'berrybells');
if ($connection)
echo "we are connected";
else
die("connection failed");
//TO INSERT username and password from field to jossyusers database
$query = "INSERT INTO jossyusers(username,password) VALUES('$username','$password')";
$result = mysqli_query($connection, $query);
if(!$result)
die("OOPPS! query failed".mysqli_error($connection));
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="login_create.php" method="post">
<div class="myclass">
<h1>Username</h1>
<input placeholder="Name" name="username" type="text">
<input placeholder="Password" name="password" type="password">
<input type="submit" name="button" value="submit">
<?php
?>
</div>
</form>
</body>
</html>
【讨论】:
【参考方案7】:检查数据库和插入 INTO 中的字段是否相同:
ejm: BD: fiel1 varchar...
插入(字段1)
【讨论】:
以上是关于PHP 表单未插入 mySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章
MySQL / PHP 数据库连接以从 Web 表单输入文本
将html表单中的数据插入sql数据库(html,php,sql)时未保存输入的值
为啥这个 PHP 脚本不会在 MySQL 数据库中插入表单数据?