【问题标题】:Inserting Data from dropdown into database with PHP使用 PHP 将下拉列表中的数据插入数据库
【发布时间】:2011-12-21 11:41:53
【问题描述】:

首先我需要一个可以轻松更新的下拉列表,因此我创建了一个名为 我在表格中列出要选择的制造商的制造商。

我终于用这段代码完成了:

<?php
 // Connect to the test datbase on localhost
 // That's where we created the countries table above
 mysql_connect('localhost','##user##','##pass##');  mysql_select_db('wordpress');

 // Query the countries table and load all of the records
 // into an array.
 $sql = 'select * FROM manufacturers';
 $res = mysql_query($sql) or die(mysql_error());
 while ($rec = mysql_fetch_assoc($res))
 $manufacturers[] = $rec;
 ?>
<form action="select.php" method="post">
<?php
 echo '<select name="dropdown">';
 foreach ($manufacturers as $c)
{
  if ($c['id'] == $_GET['id'])
   echo "<option value=\"{$c['meta_id']}\" selected=\"selected\">{$c['meta_value']}              </option>\n";
 else
  echo "<option value=\"{$c['meta_id']}\">{$c['meta_value']}</option>\n";
 }
echo '</select>';
?>
 <input type="submit" value="Submit" name="submit"/>
 </form>

效果很好,我现在有一个下拉列表,从我的 数据库制造商。

现在我需要将它发送到现有的数据库调用 post_meta 以便我可以从那里永久显示用户选择。

我尝试了几个不同的选项,但我正在尝试使用以下代码将其发送到我的 post_meta 数据库。

<?php
$con = mysql_connect("localhost","##user##","##pass##");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("wordpress", $con);

$sql="INSERT INTO wp_postmeta (meta_id, post_id, meta_key, meta_value)
VALUES
('$_POST['meta_id']}','$_POST[post_id]','$_POST[meta_key]','$_POST[meta_value]')";

if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
?>

这实际上插入到数据库中,但不记录任何值。

请帮我弄清楚我做错了什么。

【问题讨论】:

  • 您对 SQL 注入攻击非常开放。您真的应该考虑使用 PDO 学习准备好的查询。另外,$_POST['meta_id'] 之后的那个额外的括号是怎么回事?您是否尝试过print_r($_POST) 以确保发布数据到达那里?

标签: php mysql forms


【解决方案1】:

你的价值观没有出现吗?看起来您的键值周围缺少引号。例如,不应该是:

$_POST['post_id']  

要进行完整性检查,只需回显您的 $_POST 变量,而不是立即进行插入。这将帮助您确定您是否有一些语法错误。另外,我会阅读 Brad 的评论并牢记在心。

【讨论】:

  • 否,值不显示。我的所有四个值都出现此错误:注意:未定义索引:meta_id
  • -1 用于可注入 SQL 的答案。问题已经够糟糕了。这真的是不能接受的答案。见:stackoverflow.com/questions/332365/…
  • @Johan Brad 已经指出了这一点,这就是为什么我在回答中引用了他的评论。我没有意识到这还不够,我很抱歉。
【解决方案2】:

试试这个查询:

$sql="
INSERT INTO wp_postmeta
(meta_id, post_id, meta_key, meta_value)
VALUES
(
    '{$_POST['meta_id']}',
    '{$_POST['post_id']}',
    '{$_POST['meta_key']}',
    '{$_POST['meta_value']}'
)
";

而且,正如人们在 cmets 中所说,这段代码非常脆弱,请考虑找到更好的选项将变量传递给查询。

【讨论】:

  • -1 将mysql_real_escape_string() 放在答案中并使用安全代码有多难。 Show, don't tell.
  • 当用户被允许从文本字段输入数据时,sql注入不是才起作用吗?我只允许用户从下拉列表中选择一个选项。
  • 我在很多代码中都使用了 mysql_real_escape_string(),从未见过或听说过您所描述的问题,除非您还使用 magic_quotes 另一个重大安全故障。如果你对 PDO 很感兴趣,那很酷,因为 PDO 规则,但在代码示例中使用它。哦,您没有为 meta_id 插入显式值,它是一个 auto_increment。
  • @Jakeray,所有超全局变量$_.... 都应该被转义。总是。有许多工具可以以您无法轻松监督的方式操作 $_POST、$_GET 和类似的变量。
【解决方案3】:

执行此操作的正确方法是 A:转义所有 $_POST 超全局变量。
B. 编写如下所示的查询。

这是 wp_postmeta 的表定义:
http://codex.wordpress.org/Database_Description#Table:_wp_postmeta

因为 meta_id 是一个 auto_increment 主键,你不提供它,MySQL 提供。

//$meta_id = mysql_real_escape_string($_POST['meta_id']);  <<-- not needed.
$post_id = mysql_real_escape_string($_POST['post_id']);
$meta_key = mysql_real_escape_string($_POST['meta_key']);
$meta_value = mysql_real_escape_string($_POST['meta_value']);
$sql=" INSERT INTO wp_postmeta
       (post_id, meta_key, meta_value)
       VALUES
       ('$post_id','$meta_key','$meta_value') ";  //<<-- don't forget the quotes!
if ($result = mysql_query($sql)) {
  //You can get the new meta_id using:
   $new_meta_id = mysql_insert_id($result);
} else { 
   die ("could not insert ".mysql_error());
}

【讨论】:

  • 感谢您的帮助 Johan,但我仍然面临同样的问题。我收到此错误通知:未定义的索引:C:\xampp\htdocs\wordpress\select.php 中的 post_id 在第 11 行通知:未定义索引:第 12 行 C:\xampp\htdocs\wordpress\select.php 中的 meta_key 注意:第 13 行 C:\xampp\htdocs\wordpress\select.php 中的未定义索引:meta_value 仍然没有找到数据。如果我回显结果,则表明数据正在传递。
  • $_post['x'] 是指表单的字段使用这些字段制作表单。我建议问一个新问题如何在 $_post vars 中获取值。
猜你喜欢
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多