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