简体   繁体   English

PHP / MySQL INSERT相同数据INTO两个表

[英]PHP/MySQL INSERT same data INTO two Tables

I have two forms that share some same columns: NAME, EMAIL, NOMINEE, DEPT, RANK and TIMESTAMP and I want to store those same columns in a new table called: TEACHING_AWARD_ALL_NOMINATIONS . 我有两个共享相同列的表单: NAME, EMAIL, NOMINEE, DEPT, RANK and TIMESTAMP ,我想将这些相同的列存储在一个名为: TEACHING_AWARD_ALL_NOMINATIONS的新表中。

I have came up with the code to store each data into different table and then there should be some code to store the shared columns into TEACHING_AWARD_ALL_NOMINATIONS table. 我想出了将每个数据存储到不同表中的代码,然后应该有一些代码将共享列存储到TEACHING_AWARD_ALL_NOMINATIONS表中。

I haven't came up with the code yet, please help!!!! 我还没有提出代码,请帮助!!!!

$srr = array_map('mysql_escape_string', $_REQUEST);

if ($srr['NOMINATIONTYPE'] == 'STUDENT')
    $fields = Array('NAME', 'EMAIL', 'NOMINEE', 'DEPT', 'COURSE', 'YEARTERM', 'REQUIRED_FOR_MAJOR', 'MAJOR_LEARNING_OBJECTIVES', 'WHAT_EXTENT_INSTRUCTOR_HELP', 'RANK', 'RANK_COMMENT', 'TEXTBOX_1', 'TEXTBOX_2', 'TEXTBOX_3', 'TEXTBOX_4', 'TEXTBOX_5');
else if ($srr['NOMINATIONTYPE'] == 'FACULTY')
    $fields = Array('NAME', 'EMAIL', 'NOMINEE', 'DEPT', 'RANK', 'TEXTBOX_1', 'TEXTBOX_2', 'TEXTBOX_3');
else die('error: no nomination type');

foreach ($fields as $f)
    $$f = $srr[$f];

$qry = "INSERT INTO TEACHING_AWARD_".$srr['NOMINATIONTYPE']."_NOMINATIONS (";
    foreach ($fields as $f) $qry .= $f . ", ";
    $qry = substr($qry, 0, -2);
    $qry .= ") VALUES (";
    foreach ($fields as $f) $qry .= "'" . $$f . "', ";
    $qry = substr($qry, 0, -2);
    $qry .= ")";

$result = mysql_query($qry) or die('An error ocurred: '.mysql_error());

echo 'Success! Thank you for submitting your nomination.';

WARNING! 警告! As noted in comments your original code is using deprecated functions and suffers from potential security issues. 正如评论中所述,您的原始代码使用了已弃用的函数,并且存在潜在的安全问题。 Check out the refactored solution that is using PDO, and yes you should use PDO too (instead of your current approach). 查看使用PDO的重构解决方案,是的,您也应该使用PDO(而不是当前的方法)。

Check out the code below, untested but should do your job. 查看下面的代码,未经测试但应该完成您的工作。 As written above it uses PDO - check the docs here 如上所述,它使用PDO - 检查文档

    // obviously, first set your connection parameters $DbHost, $DbName etc.

    //connect to mysql
    $dbh = new PDO("mysql:host=".$DbHost.";dbname=".$DbName, $DbUser, $DbPass, array(PDO::ATTR_PERSISTENT => true));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->query('SET NAMES UTF8'); //assuming you use utf-8 encoding

    //provide values array
    $values = $YourValuesArray;

    //set field types
    $fields = array();
    $fieldsStudent = Array('NAME', 'EMAIL', 'NOMINEE', 'DEPT', 'COURSE', 'YEARTERM', 'REQUIRED_FOR_MAJOR', 'MAJOR_LEARNING_OBJECTIVES', 'WHAT_EXTENT_INSTRUCTOR_HELP', 'RANK', 'RANK_COMMENT', 'TEXTBOX_1', 'TEXTBOX_2', 'TEXTBOX_3', 'TEXTBOX_4', 'TEXTBOX_5');
    $fieldsFaculty = Array('NAME', 'EMAIL', 'NOMINEE', 'DEPT', 'RANK', 'TEXTBOX_1', 'TEXTBOX_2', 'TEXTBOX_3');
    $fieldsAll = array_intersect($fieldsStudent, $fieldsFaculty);

    //pick the proper field set or die
    $fields = ($srr['NOMINATIONTYPE'] == 'STUDENT') ? $fieldsStudent : $fieldsFaculty;
    if(empty($fields)) die('error: no nomination type');

    //set tables
    $table = 'TEACHING_AWARD_'.$srr['NOMINATIONTYPE'].'_NOMINATIONS';
    $tableAll = 'TEACHING_AWARD_ALL_NOMINATIONS';

    //construct fields string
    $strFields = implode(",", $fields);
    $strFieldsAll = implode(",", $fieldsAll);

    //construct the placeholders string
    $strIns = implode(",", array_map(function($item){ return ":".$item; }, $fields)); 
    $strInsAll = implode(",", array_map(function($item){ return ":".$item; }, $fieldsAll)); 

    //insert specific data 
    $sql = "INSERT INTO $table ($strFields) VALUES ($strIns)";
    $sth = $dbh->prepare($sql);

    //bind values to placeholders
    foreach ($fields as $f)
    {
        $sth->bindValue(':' . $f, $values[$f]);
    }

    $sth->execute();

    //insert all data
    $sql = "INSERT INTO $tableAll ($strFieldsAll) VALUES ($strInsAll)";
    $sth = $dbh->prepare($sql);

    //bind values to placeholders
    foreach ($fieldsAll as $f)
    {
        $sth->bindValue(':' . $f, $values[$f]);
    }

    $sth->execute();

EDIT: 编辑:

As per your comment, to select a UNIONed set of results using PDO you can use the below (untested) code: 根据您的评论,要使用PDO选择一组UNIONed结果,您可以使用以下(未经测试的)代码:

    //connect to mysql
    $dbh = new PDO("mysql:host=".$DbHost.";dbname=".$DbName, $DbUser, $DbPass, array(PDO::ATTR_PERSISTENT => true));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->query('SET NAMES UTF8'); //assuming you use utf-8 encoding

    $sql = "SELECT NAME, EMAIL, NOMINEE, DEPT, RANK, TIMESTAMP, 'STUDENT' AS TYPE FROM TEACHING_AWARD_STUDENT_NOMINATIONS 
    UNION 
    SELECT NAME, EMAIL, NOMINEE, DEPT, RANK, TIMESTAMP, 'FACULTY' AS TYPE FROM TEACHING_AWARD_FACULTY_NOMINATIONS";

    $sth = $dbh->prepare($sql);
    $sth->execute();

    //init result array
    $results = array();

    //fetch the results into an array
    while($row = $sth->fetch(PDO::FETCH_ASSOC))
        $results[] = $row;

    //show results or do whatever else you need
    print_r($results);

You could try making two arrays, one for the "shared" columns ( NAME , EMAIL , etc.) and another for the "type-specific" columns ( COURSE , YEARTERM , etc.). 你可以尝试制作两个数组,一个用于“共享”列( NAMEEMAIL等),另一个用于“特定类型”列( COURSEYEARTERM等)。 Then, when you are building up your SQL statement, do a foreach on the "shared" columns followed immediately by the "type-specific" columns to simulate the entire table. 然后,在构建SQL语句时,在“共享”列上执行foreach ,然后立即使用“特定于类型”列来模拟整个表。 It might look something like this: 它可能看起来像这样:

$qry = "INSERT INTO TEACHING_AWARD_".$srr['NOMINATIONTYPE']."_NOMINATIONS (";
    foreach ($fields_shared as $f) $qry .= $f . ", ";
    foreach ($fields_typespecific as $f) $qry .= $f . ", ";
    $qry = substr($qry, 0, -2);
    $qry .= ") VALUES (";
    foreach ($fields_shared as $f) $qry .= "'" . $$f . "', ";
    foreach ($fields_typespecific as $f) $qry .= "'" . $$f . "', ";
    $qry = substr($qry, 0, -2);
    $qry .= ")";

I would also agree with th3falc0n's comment about looking into preparing your SQL statements with more robust tools. 我也同意th3falc0n关于使用更强大的工具来研究准备SQL语句的评论。

Another consideration: rather than enter redundant data into a TEACHING_AWARD_ALL_NOMINATIONS table, why not simply make that a view that pulls all shared columns from each type-specific table (likely using a UNION statement)? 另一个考虑因素:为什么不简单地将一个视图从每个特定于类型的表中提取所有共享列(可能使用UNION语句),而不是将冗余数据输入到TEACHING_AWARD_ALL_NOMINATIONS表中? This prevents redundant data and would make data maintenance easier (eg when a nomination is deleted from one of the type-specific table, it automatically vanishes from the ALL_NOMINATIONS view, etc.). 这可以防止冗余数据并使数据维护更容易(例如,当从类型特定表中删除提名时,它会自动从ALL_NOMINATIONS视图中消失,等等)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM