为数组中的所有$ _POST变量创建INSERT语句

时间:2014-05-29 09:46:40

标签: php mysql arrays

我们都熟悉传统的表格处理,即

  

$ email = $ _POST ['email']; $ name = $ _POST ['name'];

等等。然后我们继续从帖子中获取所有变量。 然后我们将创建一个像

这样的复合语句
$qry = "INSERT INTO $tableName (email,name) values ('$email','$name')";

现在如果您有18-20个问题怎么办?大多数人只会编写代码行和代码行99.9%的人在线一遍又一遍地做同样的事情。

让我们试试不同的东西吧? 我意识到必须有一种更好的方法来使用数组。

多年来,我一直在寻找一个简单的例程,并在任何地方查找它将从所有$ _POST变量中插入一个插入语句。

我突然意识到$ _POST实际上是一个数组,所以我写了这个小脚本:

$vars = $_POST;
print_r($vars);
exit;

在这个论坛上与人们一起工作几个小时后,这里是生成的代码。我相信通过创建所有数组键的哈希值的校验和将解决SQL攻击的恐惧,因为除非它得到完全匹配,否则不会调用服务器。如果有人添加字段,它将失败。大家都同意吗?

$predefinedChecksum = "84e602bbec8124f298e353171fb7f5b2"; // this is the hash value of all the array keys
$keys = array_keys($_POST);
$values = array_values($_POST);
$sql = "INSERT INTO $tableName (" . join(',', $keys) . ") VALUES ('" . join("',", $values) . "');";
$checksum = md5(join(',',$keys));
if ($checksum<>$predefinedChecksum) exit;
else $res = mysql_query($qry, $conn);

感谢所有贡献的人...我认为我们已经完成了一个伟大剧本的运作。

有人提到取消设置'按钮' - 你是怎么做到的?

unset( $_POST['button'] );

这不起作用 - 脚本的输出仍显示“按钮”作为变量之一。因此,脚本的输出最后仍然有一个名为“button”的字段。

我不确定如何从$ value系列中删除它 有人有想法吗?

也是输出

INSERT INTO(nameFirst,nameLast,emailPref,emailAlt,phoneDay,phoneMobile,ethnicity,yob,income,marital,kids&lt; 18,Education,employment,company,title,industry,department,revAnnual,numemps,street,city, state,zip,Type_Mobile,tablet,computer,laptop)VALUES('Vik',Grant',viktor @ eml.cc',',',',african',',19',single',',Some_HS',学生 ' '',Finance_Accntg',管理员, '', '', '',机器人 ' '',');

缺少值开头的'引号 - 连接是否可以作为连接(a,b,c)存在?

4 个答案:

答案 0 :(得分:0)

使用foreach http://nl1.php.net/manual/en/control-structures.foreach.php循环它,请小心,因为这样可以覆盖任何列。 指定允许插入哪些列更安全。

并且使用像PDO这样的东西来使用准备好的语句

答案 1 :(得分:0)

由于其巨大的安全问题,你不应该这样做。

但是如果你真的想这样做:(未经测试,你仍然可以注入SQL,这样就不会安全!

$keys = array_keys($_POST);
$values = array_values($_POST);

$sql = "INSERT INTO $tableName (" . join(',', $keys) . ") VALUES ('" . join("',", $values) . "');";

编辑:

如果您使用的是PDO,可以这样做:

$keys = array_keys($_POST);
$values = array_values($_POST);

$valuePlaceholders = "";

for ($i=0; $i < count($_POST); $i++) {
    $valuePlaceholders .= $i === 0 ? '?' : ', ?';
}

$sql = "INSERT INTO $tableName (" . join(',', $keys) . ") VALUES ($valuePlaceholders);";

执行$pdo->execute($values);

答案 2 :(得分:0)

您不是真的想这样做,因为您生成的查询可以被客户更改。

但要回答你的问题,你可以这样做:

$columns = array("email", "name", "etc.."); // Array with the "good" columns.

// Unset the columns you do not want in your query.
foreach($_POST as $key=>$value){
    if(!in_array($key, $columns)){
        unset($_POST[$key]);
    }
}

$qry = "INSERT INTO " . $tableName . " (" . implode(", ", array_keys($_POST)) . ") values (" . implode("', '", array_values($_POST)) . ")";

答案 3 :(得分:0)

虽然通常的方法是使用循环来生成包含值的字符串,但是当我知道数组中完全键的顺序时,我有时会执行以下操作:

$arr = array(
   "email"=>"foo@bar.gr",
   "name"=>"vlzvl"
);
$sql = "INSERT INTO mytable (email,name) VALUES ('".implode("','",$arr)."')";