2010-07-26 92 views
3

我再次对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 [“广场”],$ _ POST [“日期”],等等。现在,我每次添加一个新的部分形式(如另一个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匹配值计数我知道这意味着我试图把太多的数据到数据库中,因为没有足够的列来适应数据。我已经来回查看,看看我是否正确(我认为我是这么做的)。仅供参考,这是我对的形式和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数据,但为了我的目的,我将它遗漏了!如果您有任何问题随时问我会与编辑张贴在这里:标签:)

+1

你不应该将序列化数据添加到数据库。你可能想使用面向文档的数据库,如[Mongo](http://www.mongodb.org/) – quantumSoup 2010-07-26 19:20:22

+0

它可以保持非序列化? – 2010-07-26 19:39:36

回答

15

我对这个功能:

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; 
} 
6

不要为你的数据创建一个单独的领域..它否定了拥有数据库的全部价值。您将失去在特定字段上搜索的所有灵活性(例如,所有工作时间超过25小时的记录,或2010年7月26日的服务日期) 您可以轻松编写一个函数,该函数根据类似值的数组构建插入语句到Riateche提供的那个。

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

-1

对不起朋友,但你几乎什么都不对。

  1. I plan to sanitize my DB contents/$POST data - WRONG
    没有一个叫消毒的事情。只有句法规则不应该“计划使用”,但服从无条件。或者你会比惊吓SQL注入更快地结束查询错误。 而就数据库而言,不应该以任何特殊方式处理数据库内容和POST数据。这是DB 查询,而不是你准备的内容。并且不仅仅是POST数据,而且还有任何数据将进入查询。差别很大。
    另请注意,mysql_real_escape_string函数本身不会“清理”任何东西。
    上查询构建规则的综合信息,你可以找到在this my answer

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

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

在你的问题唯一明智的一点是如何使查询建设缓解。
这里是我使用的功能:

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); 

所以,你的情况,你必须只是一个单一的单词添加到字段列表

+0

@SkyWookie哈哈。尽量不敏感。我的回答没有傲慢。你真的很滑稽:) – 2010-07-27 16:37:41

+4

即使你不是什么傲慢的人,对于学习PHP的人来说,你的一般风度是荒谬的。每次看到不正确或不喜欢的东西时,没有一位体面的老师或帮手会尖叫出错。 “对不起,朋友”也没有帮助。 – 2010-07-27 17:11:53

+0

但我很抱歉,我有点螃蟹,这里还是早上;) – 2010-07-27 17:19:02

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);