在for循环期间创建数组

时间:2013-07-09 12:39:40

标签: php arrays iframe if-statement

我有一个来自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中。

1 个答案:

答案 0 :(得分:1)

使用INSERT 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));
}

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

要保留插入的课程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. (续)修改if语句底部的$coursevalues数组会为将来创建一个难以阅读的场景。乍一看,您似乎为自己创建了一个无限循环。但是,经过进一步检查,您将记住if语句排除非数字值,因此您的循环最终将终止。这是一个可读性/代码样式问题,将来会咬你(或维护者)。你应该避免做那样的事情。如果需要,创建另一个用于跟踪插入ID的变量,不要使用您从中获取插入值的变量。
  3. 你不应该使用旧的(已弃用的)mysql php扩展,你应该使用更新的东西,至少mysqli,但最好是pdo
  4. (我的答案更有效率)您可以创建数组的插入部分,而不是将它们分配给$new_courses变量然后再循环(读作:您可以执行我在上面的1循环中显示的内容)而不是2)。我只是用2来说清楚。