0

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

我想要做的是允许用户导入 .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 行的第三个值等等......

我已经尝试了很多很多东西来让它工作,并研究了我以前不熟悉的 foreach 循环、绑定变量、内爆、爆炸,但它们似乎都没有奏效。

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

任何人都可以解释为什么会这样吗?

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

谢谢丹尼尔

4

2 回答 2

2

您将显示的每个字段都视为要插入的自己的记录。由于您尝试创建具有多个字段的 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 注入保护。

于 2013-07-11T16:09:57.857 回答
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 进入....即。$db->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语句,你可以更好地了解发生了什么......了解你的代码发生了什么,然后尝试理解什么正确的做法是。不要只是复制和粘贴我的代码。

于 2013-07-11T16:19:04.547 回答