使用PHP将所有$ _POST数据插入mysql?

时间:2010-07-26 19:12:24

标签: php mysql

我再次对STACKOVERFLOW hivemind有疑问。这是交易,我试图将表单中的所有$ _POST数据插入到mysql表中。之前,我做过:

    INSERT INTO forms (Place, Date, Find, username, who_sponsored, hours, comments, howdiditgo, studentleader_name, studentleader_email, description)
VALUES ('$place', '$date','$where', '$username', '$who', '$hours', '$comments', '$how', '$description',)");

其中所有$值都声明为$ _POST ['Place'],$ _POST ['Date']等等。现在,每次我向表单添加一个新部件(如另一个textarea或其他东西),我我只想在mysql中创建一个新列,而不是添加另一个$ _POST ['foo']。这是我尝试过的:

// In the previous form, I have set all input ids to "service[]", so all this data would be in a more specific array than just $POST.  Turns out all the $_POST['service'] stuff is null...  Here's an example: <input name="placeofservice" type="text" id="service[]">


$forms = serialize($_POST['service']);
var_dump($forms);

mysql_query("INSERT INTO forms VALUES('$forms')")
 or die(mysql_error()); 

我一直收到的错误是:列数与第1行的值计数不匹配。我意识到这意味着我试图将太多数据放入数据库,因为没有足够的列来适应数据。我来回检查,看看我是否正确(我认为我这样做)。对于Reference,这是我的表单和mysql表的代码:

<form name="form1" method="post" action="process_form.php">
Place of Service</br>
<input name="placeofservice" type="text" id="service[]"></br>

Date of Service</br>
<input name="dateofservice" type="text" id="service[]"></br>

Where did you find this opportunity?</br>
<input name="where" type="text" id="service[]"></br>

What organization sponsored this opportunity?</br>
<input name="who_sponsored" type="text" id="service[]"></br>

How many hours did you work?</br>
<input name="hours" type="text" id="service[]"></br>

How did it go?</br>
<input type="text" id="service[]" name="howdiditgo" maxlength="100" /></br>

Description of Service:
<textarea name="description" id="service[]" COLS=40 ROWS=6></textarea></br>

Comments:
<textarea name="comments" id="service[]" COLS=40 ROWS=6></textarea></br>

Student Leader Name (If Applicable)</br>
<input name="studentleader_name" type="text" id="service[]"></br>

Student Leader Email(If Applicable)</br>
<input name="studentleader_email" type="text" id="service[]"></br>
<input type="submit" name="Submit" value="Submit">
</form>

Mysql表:

放置|日期|查找| form_id | who_sponsored |小时|评论| howdiditgo |描述| studentleader_name | studentleader_email |用户名

注意:我打算清理我的数据库内容/ $ POST数据,但出于我的目的,我把它留了出来!如果您有任何问题请随时提出,我将在此处发布EDIT:标签:)

5 个答案:

答案 0 :(得分:16)

我的功能:

function i($table, $array) {
  $query = "INSERT INTO ".$table;
  $fis = array(); 
  $vas = array();
  foreach($array as $field=>$val) {
    $fis[] = "`$field`"; //you must verify keys of array outside of function;
                         //unknown keys will cause mysql errors;
                         //there is also sql injection risc;
    $vas[] = "'".mysql_real_escape_string($val)."'";
  }
  $query .= " (".implode(", ", $fis).") VALUES (".implode(", ", $vas).")";
  if (mysql_query($query))
    return mysql_insert_id();
  else return false;
}

答案 1 :(得分:6)

不要为所有数据创建单个字段......它否定了拥有数据库的整个价值。您失去了搜索特定字段的所有灵活性(例如,所有工作小时数超过25或服务日期为2010年7月26日的记录) 您可以轻松地编写一个函数,该函数从类似于Riateche提供的值数组中构建insert语句。

可以通过切换到mysqli并使用绑定变量来改进它。

答案 2 :(得分:0)

这是我的:

function incomingdump($array){
    $tablename="incomingdump";

    $currentID = generateID($tablename);

    $query = "INSERT INTO $tablename (ID) VALUES('$currentID');";  
    sendquery($query);
      foreach($array AS $key => $value){

        $query = "ALTER TABLE $tablename ADD `$key` VARCHAR(".strlen($value).");";  
        sendquery($query);
        $query = "ALTER TABLE $tablename MODIFY `$key`VARCHAR(".strlen($value).");";  
        sendquery($query);
        $query = "UPDATE $tablename SET `$key` = '$value' WHERE ID=$currentID";
        sendquery($query);
      }


}
function generateID($tablename){
    $query = "SELECT count(*) FROM $tablename"; 
    $result = sendquery($query);
    $row = mysql_fetch_row($result);
    return $row[0] + 1;

}

sendquery()只是执行sql语句的包装器。 它的召唤如下:

incomingdump($_POST);

答案 3 :(得分:0)

使用json_encode($_POST)将数据保存到JSON到MySql数据库中

答案 4 :(得分:-1)

对不起朋友,但你几乎都错了。

  1. I plan to sanitize my DB contents/$POST data - 错误的 没有一种叫做消毒的东西。只有语法规则不应该“计划使用”,而无条件服从。或者,与scaring SQL注入相比,您最终会遇到查询错误。 就数据库而言,不应以任何特殊方式处理DB内容或POST数据。它是DB 查询,而不是您准备的内容。而且不仅是POST数据,还包括进入查询的任何数据。差异很大。
    另请注意,mysql_real_escape_string函数本身不会“清理”任何内容 有关查询构建规则的综合信息,您可以在this my answer

  2. 中找到
  3. every time I add a new part to the form - 错误。
    向数据库添加新字段不应该是一项微不足道的任务,但始终是特殊问题。数据库应该在之前开始绘制任何表单。当然,不应该发明一种机制来自动执行这样的任务。总是手动。

  4. $forms = serialize($_POST['service']); - 可怕的错误想法 我想知道这样的想法怎么会来。 Mysql当然与PHP专有的序列化格式无关。而且,即使它是, - 数据库如何判断单个字段或序列化行的序数数据?奇怪的。

  5. 您问题中唯一明智的一点是如何简化查询构建 这是我正在使用的功能:

    function dbSet($fields, $data = array()) {
      if (!$data) $data = &$_POST;
      $set='';
      foreach ($fields as $field) {
        if (isset($data[$field])) {
          $set.="`$field`='".mysql_real_escape_string($data[$field])."', ";
        }
      }
      return substr($set, 0, -2); 
    }
    

    这将返回一个SET语句,仅限于先前定义的字段集 用法

    $fields = explode(" ","name surname lastname address zip fax phone");
    $query  = "INSERT INTO $table SET ".dbSet($fields);
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    

    $id     = intval($_POST['id']);
    $fields = explode(" ","name surname lastname address zip fax phone");
    $query  = "UPDATE $table SET ".dbSet($fields)." WHERE id=$id";
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    

    因此,在您的情况下,您只需要在字段列表中添加一个单词