将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]')";

【问题讨论】:

您必须将 &lt;select&gt; 包装成带有 POST method 属性的 &lt;form&gt;。但是您应该对现代 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数据库的主要内容,如果未能解决你的问题,请参考以下文章

php在提交表单之前将数据插入数据库中的值为空?

mysq

我正在尝试将复杂复选框表单的值存储在 mysql 数据库中

将html表单中的数据插入sql数据库(html,php,sql)时未保存输入的值

如何通过 PHP 将未知数量的 HTML 表单字段插入 MySQL?

php循环并插入