将html选择表单的值插入mysql数据库
Posted
技术标签:
【中文标题】将html选择表单的值插入mysql数据库【英文标题】:insert value of html select form into mysql database 【发布时间】:2014-03-27 12:44:16 【问题描述】:我想将选定的“选择表单”的值插入到我的 mysql 数据库中。
我怎样才能得到正确的价值?
<form action='' method='post'>
<select name="myselectbox">
<option name="myoption1" value="myoption1">myoption1</option>
<option name="myoption2" value="myoption2">myoption2</option>
<option name="myoption3" value="myoption3">myoption3</option>
<option name="myoption4" value="myoption4">myoption4</option>
</select>
<input type='submit' value='submit'/>
</form>
类似的东西? (这个显然没有用..)
$sql = "INSERT INTO Entries (myoption1) VALUES ('$_POST[myselectbox]')";
【问题讨论】:
您必须将<select>
包装成带有 POST
method
属性的 <form>
。但是您应该对现代 Web 开发的工作原理有更广泛的了解,而不是弄乱通常的和已弃用的 php/MySQL 意大利面条式代码。
我是一个初学者..你能给我一些关键字,我必须搜索以获得“更宽的图片”吗?谢谢
我最喜欢的读物之一仍然是symfony HTTP fundamentals;寻找 HTTP 协议、关注点分离和路由。
另外,查找“SQL 注入”和“准备好的语句”。以这种方式构建 INSERT(或任何其他 SQL)语句是一个坏主意,您应该从一开始就学会避免它。
好的,谢谢。我想我的教授是老式的哈哈之一
【参考方案1】:
$value = mysql_real_escape_string($_POST['myselectbox']);
$sql = "INSERT INTO Entries (myoption1) VALUES ($value)";
【讨论】:
现在我收到此错误:警告:mysql_real_escape_string():第 10 行“mypath”中的用户 'www-data'@'localhost'(使用密码:NO)的访问被拒绝警告:mysql_real_escape_string (): 无法在第 10 行的“mypath”中建立到服务器的链接 @Moeed : 为什么这里需要mysql_real_escape_string
....看起来不像用户输入的输入被转义???
您不必像我想的那样添加 mysql_real_escape_string,因为 mysql 已被弃用,并且在选择框中预定义了“myselectbox”值的发布数据。这样我们就不必太担心它将带来什么数据。如果需要,请使用 mysqli_real_escape_string
我现在没有使用真正的转义......但它仍然没有从我的表单中获取价值
检查按钮的类型是button
还是submit
【参考方案2】:
您的 SQL 命令有错误,$_POST
需要将 html 名称用引号括起来,例如 => $_POST['some_name']
:
$sql = "INSERT INTO Entries (myoption1) VALUES ('$_POST[myselectbox]')";
/* ^^ missing quotes here*/
试试这个方法:
$sql = "INSERT INTO Entries (myoption1) VALUES (".$_POST['myselectbox'].")";
【讨论】:
教新手将字符串连接在一起以构建 SQL 语句并不是一个好主意。请考虑更改示例以使用准备好的语句。 如果新用户不理解串联概念,你认为他/她会掌握prepared statements
....的概念?另外,在学习how-to-prevent-it
... :) 之前,应该先了解漏洞
是的,我认为他们会理解的。解释具体问题出了什么问题,然后说明该方法存在缺陷的原因。我想我们是一致的——我只是有更高的希望!
我会把它留给 OP 来决定什么是首选... :)【参考方案3】:
你必须将你的选择标签包装成一个表单标签。
<form action='' method='post'>
<select name="myselectbox">
<option name="myoption1" value="myoption1">myoption1</option>
<option name="myoption2" value="myoption2">myoption2</option>
<option name="myoption3" value="myoption3">myoption3</option>
<option name="myoption4" value="myoption4">myoption4</option>
</select>
<input type='submit' value='submit'/>
</form>
一旦你提交了表单,你会得到 $_POST['myselectbox']
的 post 变量,可以像你已经做的那样附加到一个 mysql 查询中。但是为了更好的方法,不要只是像那样附加它,而是在附加之前检查表单是否已提交并且发布变量是否可用。
例如:
if(!empty($_POST['myselectbox']))
/*.. do your query section... */
【讨论】:
哎呀。我忘了在我的帖子中添加表单代码。当然,我的代码被包装在一个表单中,就像你在上面发布的那样。但我仍然无法将值放入我的 mysql 数据库:/ 如果您按照我的建议定义了方法属性和操作,那么它应该可以工作。还有一件事,尝试附加 $sql = "INSERT INTO Entries (myoption1) VALUES ('$_POST[myselectbox]')";适当地。因为 post 变量之前的单引号会导致 'post' 数组的字符串键出现问题 :) 。你可以在这里发布完整的代码吗?【参考方案4】:假设您的表单是正确的,并且它正在将您想要的值发布到您的脚本中。
(您在代码中添加了echo
以确保是这种情况?)
将数据发送到 SQL 语句并因此发送到 mysql 的最简单可靠的方法是使用准备好的语句。
看这里:http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
基本上你写的SQL语句没有你的变量(替换为?
),然后告诉mysql稍后用你的变量执行语句。它避免了转义字符串和担心如何构建的需要。
例如,您可能有:
// Connect to mysql
$mysqli = new mysqli('where your server is', 'my_user', 'my_password', 'world');
// Build the initial statement - easier to read as you don't have your string concatenation here
$stmt = $mysqli->prepare( "INSERT INTO Entries (myoption1) VALUES (?)" );
// Tell mysql that the '?' should be replaced with the value in your post array
$stmt->bind_param( "s", $POST['myselectbox'] );
// Execute the statement
$stmt->execute()
显然您也应该添加错误处理,但文档涵盖了这方面的基础知识。
SQL 注入
使用prepared statements是个好主意的主要原因是它避免了SQL注入攻击。
还有其他方法,但在我看来这是最简单的解决方案。
SQL 注入攻击是指有人试图通过将其他 SQL “注入”到您的语句中来更改正在运行的 SQL 语句。
以您的代码为例,您可以执行以下语句:
$sql = "INSERT INTO Entries (myoption1) VALUES ('". $_POST['myselectbox'] ."')";
通常会收到(我们建议)myoption1
之类的内容。
这将导致 SQL 为:
INSERT INTO Entries (myoption1) VALUES ('myoption1');
如果有人决定,他们可以发送'='' OR '1'='1
这将导致 SQL 为:
INSERT INTO Entries (myoption1) VALUES (''='' OR '1'='1');
这(显然)非常不同。
或者,更糟糕的是发送'=')'; DROP TABLE Entries WHERE (''='
这将导致 SQL 为:
INSERT INTO Entries (myoption1) VALUES (''=''); DROP TABLE Entries WHERE (''='');
使用准备好的语句
简单地说,但是使用准备好的语句,你告诉 mysql 你发送的是一个用作参数的文字字符串。它永远不能被视为语句本身的一部分,因此上述内容根本不可能。
安全得多。
我希望这样可以更清楚。如果您想了解更多信息,我建议您独立研究...
【讨论】:
感谢您向我解释这个原则。所以这可能比标准的 mysql/php 更安全?但是我仍然不明白为什么稍后执行变量语句会更安全。我的意思是它仍然是来自表单的相同值吗? 这并不比标准的 mysql/php 更安全——这是标准,这就是为什么当其他人教串联时我很生气的原因。我会在我的回答中添加一个简短的解释......以上是关于将html选择表单的值插入mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章
将html表单中的数据插入sql数据库(html,php,sql)时未保存输入的值