foreach不是通过数组迭代

时间:2014-09-09 15:26:03

标签: php

我正在使用下面的代码处理一个神奇的简单保存类,每当我运行它时,只触发第一个if语句一次,数据只保存在logs_all表中一次。传递给函数的所有变量都很好。

我花了一个小时进行调试,老实说不知道问题是什么,有人可以帮忙吗?

function saveLog($logtype, $user, $category, $department, $item, $action) {

            $logtype = 'all,buying';
            $a = explode(",",$logtype);

            foreach($a as $value) {

                if($value == 'all') {

                    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);
                    $sql = "INSERT INTO logs_all (user, category, department, item, action, date) VALUES ('$user', '$category', '$department', '$item', '$action', NOW())";
                    $db->query($sql);
                    return $db->insert_id;


                }

                if($value == 'buying') {

                    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);
                    $sql = "INSERT INTO logs_buying (user, category, department, item, action, date) VALUES ('$user', '$category', '$department', '$item', '$action', NOW())";
                    $db->query($sql);
                    return $db->insert_id;


                }

            }

}

3 个答案:

答案 0 :(得分:2)

return $db->insert_id;

这是你的问题。 return语句返回函数的上下文,或者在全局情况下,完全返回PHP脚本。这意味着foreach将停止执行该函数内的任何其他PHP代码。

答案 1 :(得分:2)

这是因为你正在使用回报。来自php.net:

  

如果在函数内调用,则return语句立即结束当前函数的执行,并返回其参数作为函数调用的值。 return也结束了eval()语句或脚本文件的执行。

您的功能在点击返回时终止。如果要返回每个项目,最好将ID保存到数组中,然后在循环结束后返回数组。

答案 2 :(得分:1)

您的代码第一次到达return时,您正在退出该功能。

这是您的代码的简化版本,它使用了您的logtype与数据库中的表名相同的名称:

function saveLog($logtype, $user, $category, $department, $item, $action) {
    $logtype = 'all,buying';
    $a = explode(",",$logtype);
    $result = array();

    foreach($a as $value) {
        $db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
        $sql = "INSERT INTO logs_" . $a . " (user, category, department, item, action, date) VALUES ('$user', '$category', '$department', '$item', '$action', NOW())";
        $db->query($sql);
        $result[] = $db->insert_id;
    }
    return $result;
}