我以为我会编辑我的问题,因为评论似乎这是一种非常不安全的方式来做我想做的事。
我想要做的是允许用户导入.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循环中,但是如果我把它放在它之外它只插入最后一个值。
任何人都可以解释为什么会发生这种情况吗?
如果您需要更多信息,请告诉我。
谢谢 丹尼尔
答案 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语句,你可以更好地了解最新情况....了解你的代码发生了什么然后尝试了解正确的方法是什么。不要只复制和粘贴我的代码。