0

我有一个来自 POST ($coursevalues) 的数组。我需要说明该值是否不是数字,然后将该值添加到数据库中。

Howvwer,由于页面在 iframe 中,它被重复发送数据,所以如果它已被添加,我希望它不要这样做。在 if true 语句中,我添加了一个数组 $newcourses ,它应该包含该值。然后我添加到 if 语句中,如果不在数组 $newcourses 中,则添加到数据库中。

但是,它仍然尝试添加到数据库中,导致 MYSQL 错误 - 表中不允许重复。

$y = 0;

foreach ($coursevalues as $key => $val) {
    // Try to prevent duplicate entry on refresh as value on other form stays
    // same - doesn't update to the ID. add or is a variable I made earlier.
    if (is_numeric($val) == false && !in_array($val, $newcourses)) {
        $newcourses[$y++] = $val;

        $tbl = 'tblCourses';
        $fieldcourse = 'CourseName';

        // This line creates a query that asks the server to create a table,
        // with the name and fields described above
        $insertQuery = mysql_query("INSERT INTO $tbl ($fieldcourse) VALUES ('$val')")
            or die ('Could not insert new course into tblCourses: ' . mysql_error());

        $coursevalues[$val] = mysql_insert_id();
    }
}

你能检查一下声明是否有效吗?它在 PHP 中。

4

1 回答 1

1

使用 anINSERT IGNORE和 mysql 将忽略重复错误并插入不重复的其余部分。

我还会稍微重新构建您的代码,因为您正在为循环的每次迭代运行插入查询。相反,我会做更多类似的事情

<?php
$new_courses = array();
foreach ($coursevalues as $val)
{
    if (!is_numeric($val) && !in_array($val, $new_courses)) {
        $new_courses []= $val;
    }
}

?>

然后我会以编程方式构建一个插入查询来将此数据插入到 mysql 中,如下所示:

<?php
$table = "tblCourses";
$field_course = "CourseName";
//the base insert query (with added ignore 
//to ignore courses that already have been inserted)
$insert_query = "INSERT IGNORE INTO {$table} ({$field_course}) VALUES ";

$insert_parts = array();
//build the correct insert syntax and escape the value of the course name
foreach ($new_courses as $course) { 
    $insert_parts []= "('" . mysql_real_escape_string($course) . "')";
}

if (count($insert_parts) > 0) //make sure we are inserting at least 1 course
{
    //use implode to build a proper mysql multi-insert query which will
    //return a string similar to ('coursename'), ('coursename2'), ('coursename3')
    //and concatenate that to the $insert_query, and run it to mysql_query

    mysql_query($insert_query . implode(",", $insert_parts));
}

编辑(关于保留您插入的 id 用于 cousrses)

为了保留您为课程插入的 ID,我将保留上述代码并在所有内容的末尾运行第二个查询,以获取您尝试插入的课程的所有 ID。

像这样:

<?php
$course_id_map = array();
$course_ids = array();
$where_parts = array();

foreach ($new_courses as $course_name)
{
    $where_parts []= "'" . mysql_real_escape_string($course_name) . "'";
}

$query = "SELECT id, {$field_course} FROM {$table} WHERE {$field_course} IN ("
       . implode(",", $where_parts) . ")";

$results = mysql_query($query);

while ($row = mysql_fetch_assoc($results))
{
    //creates a name=>id map of the courses posted
    $course_id_map[ $row[$field_course] ] = $row['id'];

    //creates a posted_id=>mysql_id map of the courses posted
    $course_ids[ array_search($row[$field_course], $coursevalues) ] = $row['id'];
}

此代码的结果将为您提供一个如下所示的数组:

Array (
    ["course2001"] => "201848",
    ["course2002"] => "201849",
    ["course2003"] => "201850",
    ["course2004"] => "201851",
    ["course2005"] => "201852"
)

结束编辑

关于您的问题的其他一些说明:

  1. 在 if 语句的底部,您正在修改$coursevalues变量,我不确定为什么。如果您稍后需要在代码中插入每门课程的 ID,则此示例可能不适合您。
  2. (续)修改$coursevaluesif 语句底部的数组会为将来创建一个难以阅读的场景。乍一看,您似乎为自己创建了一个无限循环。但是,经过进一步检查,您会记得 if 语句不包括非数字值,因此您的循环最终将终止。这是一个可读性/代码风格问题,将来会困扰您(或维护者)。你真的应该避免做那样的事情。如果需要,请创建另一个用于跟踪插入 ID 的变量,不要使用您从中获取插入值的变量。
  3. 你不应该使用旧的(不推荐的)mysqlphp扩展,你应该使用更新的东西,至少mysqli,但最好是pdo
  4. (在我的回答中效率更高)您可以创建数组的插入部分,而不是将它们分配给$new_courses变量然后再次循环(读作:您可以在 1 个循环而不是 2 个循环中执行我上面显示的操作)。我只是用2来使它更清楚。
于 2013-07-09T12:47:12.563 回答