将具有多个值的变量插入到mysql数据库中

时间:2013-07-11 16:03:09

标签: php mysql

我以为我会编辑我的问题,因为评论似乎这是一种非常不安全的方式来做我想做的事。

我想要做的是允许用户导入.csv文件,但我希望他们能够设置他们导入的字段。

除了我试图在原始问题中展示的方式之外,有没有办法做到这一点?

谢谢 丹尼尔


我遇到这个问题已经让我疯了几个星期了,我尝试的一切都应该工作失败。

基本上我有一个包含大量字段的数据库。

在我的一个页面中,我有以下代码

$result = mysql_query("SHOW FIELDS FROM my_database.products"); 

while ($row = mysql_fetch_array($result)) { 

    $field = $row['Field'];

    if ($field == 'product_id' || $field == 'product_name' || $field == 'product_description' || $field == 'product_slug' || $field == 'product_layout') {
    } else {
        echo '<label class="label_small">'.$field.'</label>
        <input type="text" name="'.$field.'" id="input_text_small" />';
    }
} 

然后回显一个包含数据库字段标签的字段列表,并在文本框的名称中包含数据库字段。

然后我使用以下代码发布结果

$result = mysql_query("SHOW FIELDS FROM affilifeed_1000.products"); 

$i = 0; 

while ($row = mysql_fetch_array($result)) { 

    $field = $row['Field'];

    if ($field == 'product_name' || $field == 'product_description' || $field == 'product_slug' || $field == 'product_layout') {

    } else {

        $input_field = $field;
        $output_field = mysql_real_escape_string($_POST[''.$field.'']);
    }

    if ($errorcount == 0) {
        $insert = "INSERT INTO my_database.products ($input_field)
        VALUES ('$output_field')";

        $result_insert = mysql_query($insert) or die ("<br>Error in database<b> ".mysql_error()."</b><br>$result_insert");

    }

}

if ($result_insert) {

    echo '<div class="notification_success">Well done you have sucessfully created your product, you can view it by clicking here</div>';

} else {

    echo '<div class="notification_fail">There was a problem creating your product, please try again later...</div>';

}

它成功发布,但问题是它为每个插入创建了一个新的“行”。

例如在第1行中它将发布第一个值,然后其余部分将为空,在第2行中它将发布第二个值,但其余的将为空,第3行为第三个值,依此类推...... / p>

我已经尝试了许多很多东西来完成这项工作,并且已经研究过我以前不熟悉的foreach循环,绑定变量,爆炸,爆炸,但它们似乎都没有做到这一点。

我可以理解它为什么这样做,因为它包含在while循环中,但是如果我把它放在它之外它只插入最后一个值。

任何人都可以解释为什么会发生这种情况吗?

如果您需要更多信息,请告诉我。

谢谢 丹尼尔

2 个答案:

答案 0 :(得分:2)

您将要显示的每个字段视为要插入的自己的记录。由于您尝试使用MULTIPLE字段创建SINGLE记录,因此需要动态构建查询,例如

foreach ($_POST as $key => $value);
    $fields[] = mysql_real_escape_string($key);
    $values[] = "'" . msyql_real_escape_string($value) . "'";
} // build arrays of the form's field/value pairs

$field_str = implode(',', $fields); // turn those arrays into comma-separated strings
$values_str = implode(',', $values);

$sql = "INSERT INTO yourtable ($field_str) VALUES ($value_str);"
// insert those strings into the query

$result = mysql_query($sql) or die(mysql_error());

会给你

INSERT INTO youtable (field1, field2, ...) VALUES ('value1', 'value2', ...)

请注意,我在这里使用mysql库,但你应该避免使用它。它已被弃用且过时。在构建任何可能在短时间内完全无用的代码之前,请考虑切换到PDO或mysqli。

在安全的基础上,您不应该直接通过数据库传递字段值。考虑您可能正在使用用户权限管理系统的情况。您可能不希望公开“is_superuser”字段,但您的表单允许任何人通过破解他们的html表单并添加一个新字段is_superuser=yes来为自己提供超级用户权限。

这种代码非常危险,你不应该在生产系统中使用它,无论你注入多少sql注入保护它。

答案 1 :(得分:0)

好吧....我不能说我知道到底发生了什么但是试试看......

首先关闭......

$result = mysql_query("SHOW FIELDS FROM my_database.products"); 
$hideArray = array("product_id","product_name","product_description", "product_slug","product_layout");
while ($row = mysql_fetch_array($result)) { 
    if (!in_array($row['Field'], $hideArray)){
        echo '<label class="label_small">'.$field.'</label>
        <input type="text" name="'.$field.'" id="input_text_small" />';
    }
}

现在,为什么你想要发布这些数据对我来说没有意义但是我会忽略那些.....你真的很奇怪你甚至不使用帖子数据...也许我是没有得到的东西....我建议使用db包装类...这样你只需通过post var into .... ie。 $ db-&gt; insert($ _ POST)....但是如果你做得很好......

$fields = "";
$values = "";
$query = "INSERT INTO table ";
foreach ($_POST as $key => $data){
   $values .= $data.",";
   $fields .= $fields.",";
}
substr($values, 0, -1);
substr($fields, 0, -1);

$query .= "(".$fields.") VALUES (".$values.");";

这是未经测试的....您还可以查看http://php.net/manual/en/function.implode.php,这样您就不必进行循环。

基本上你似乎不明白你的脚本中发生了什么...如果你回应sql语句,你可以更好地了解最新情况....了解你的代码发生了什么然后尝试了解正确的方法是什么。不要只复制和粘贴我的代码。