Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter正在插入两次相同的条目。在某些情况下_Php_Mysql_Codeigniter_Pdo - Fatal编程技术网

Php CodeIgniter正在插入两次相同的条目。在某些情况下

Php CodeIgniter正在插入两次相同的条目。在某些情况下,php,mysql,codeigniter,pdo,Php,Mysql,Codeigniter,Pdo,我试图弄明白为什么Codeigniter在我的数据库中插入了两次相同的行。我使用PDO作为mySQL的接口。我正在调试它,我确信下面的函数不会被执行两次。在特定情况下,如果两个foreache由于数组为空而未运行,则会发生此错误,但如果其中一个运行,则不会发生此错误 ` 这里我有一个mySQL的日志,前两个选项在函数save_all()的开头被“$this->add_new_skills();”调用。这些选择应该也是一个。这个顺序SELECT、INSERT证明函数save_all()没有被调用两

我试图弄明白为什么Codeigniter在我的数据库中插入了两次相同的行。我使用PDO作为mySQL的接口。我正在调试它,我确信下面的函数不会被执行两次。在特定情况下,如果两个foreache由于数组为空而未运行,则会发生此错误,但如果其中一个运行,则不会发生此错误

`

这里我有一个mySQL的日志,前两个选项在函数save_all()的开头被“$this->add_new_skills();”调用。这些选择应该也是一个。这个顺序SELECT、INSERT证明函数save_all()没有被调用两次,如果被调用两次,则顺序将是SELECT INSERT

138 Connect root@localhost on repsero
138 Query SELECT skill_name FROM skill WHERE skill_status=2
138 Query SELECT skill_name FROM skill WHERE skill_status=2
138 Quit
139 Connect root@localhost on repsero
139 Quit
140 Connect root@localhost on repsero
140 Query INSERT INTO contest (user_id, contest_title, contest_overview, contest_description, contest_category, contest_holder, contest_prize, contest_stage, contest_duration, contest_proj_duration, contest_level, contest_finalist, contest_winner, contest_create, contest_launched, contest_edit, contest_edit_id, contest_status, contest_delete) VALUES (0, 'Contest Name', 'Overview of the contest Overview of the contest Overview of the contest Overview of the contest Overview of the contest Overview of the contest ', 'Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description ', 'SEO', (SELECT customer_id FROM customer WHERE user_id = (SELECT user_id FROM user WHERE user_email='customer@repsero.com')), '300', 0, '5','1', -1, -1, -1, NULL, DEFAULT, NULL, -1, -1, DEFAULT) 
140 Query INSERT INTO contest (user_id, contest_title, contest_overview, contest_description, contest_category, contest_holder, contest_prize, contest_stage, contest_duration, contest_proj_duration, contest_level, contest_finalist, contest_winner, contest_create, contest_launched, contest_edit, contest_edit_id, contest_status, contest_delete) VALUES (0, 'Contest Name', 'Overview of the contest Overview of the contest Overview of the contest Overview of the contest Overview of the contest Overview of the contest ', 'Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description Description ', 'SEO',(SELECT customer_id FROM customer WHERE user_id = (SELECT user_id FROM user WHERE user_email='customer@repsero.com')), '300', 0, '5', '1', -1, -1, -1, NULL, DEFAULT, NULL, -1, -1, DEFAULT)
140 Quit

我发现codeigniter系统中CI_DB_pdo_驱动程序中的_execute()函数工作不正常,可能是因为php版本。无论如何,我将CodeIgniter的代码更改为:

    function _execute($sql)
{
    $sql = $this->_prep_query($sql);
    $result_id = $this->conn_id->prepare($sql);
    $result_id->execute();

    if (is_object($result_id))
    {
        if (is_numeric(stripos($sql, 'SELECT')))
        {
            $this->affect_rows = count($result_id->fetchAll());
            $result_id->execute();
        }
        else
        {
            $this->affect_rows = $result_id->rowCount();
        }
    }
    else
    {
        $this->affect_rows = 0;
    }

    return $result_id;
}
致:


测试$sql中是否包含“SELECT”的部分不起作用,因此当我尝试插入“$result\u id->execute()”时,被调用了两次。

CodeIgniter不是问题所在,它一定是您的代码。您确定没有多次触发
save_all()
?这是基本的调试。学习调试自己的代码。可以使用日志消息检查代码是否执行两次。您好,谢谢您的回答。我确信save_all()只执行了一次。我用日志/转储检查了它。要么是您的
foreach
循环同时放入两个查询,要么是您多次调用
save\u all()
。大多数情况下,这是额外的HTTP请求。检查你的嗅探器+1这个问题困扰了我好长时间了,我正在用select做一个插入。我将此问题称为CodeIgniter错误,因为CI对其进行编程以检查它是否是select语句的方式是查看查询中是否出现select。因为我在执行insert select,所以它从select语句返回了0个受影响的行,而不是insert返回的1个受影响的行。实际上,我不知道如果是select查询,为什么CodeIgniter会调用“execute()”函数两次。它缺乏数据管理。是的,正如您所说,最好不要同时混合许多查询,codeigniter很容易丢失:(
    function _execute($sql)
{
    $sql = $this->_prep_query($sql);
    $result_id = $this->conn_id->prepare($sql);
    $result_id->execute();

    if (is_object($result_id))
    {
        if (is_numeric(stripos($sql, 'SELECT')))
        {
            $this->affect_rows = count($result_id->fetchAll());
            $result_id->execute();
        }
        else
        {
            $this->affect_rows = $result_id->rowCount();
        }
    }
    else
    {
        $this->affect_rows = 0;
    }

    return $result_id;
}
    function _execute($sql)
{
    $sql = $this->_prep_query($sql);
    $result_id = $this->conn_id->prepare($sql);
    $result_id->execute();

    if (is_object($result_id))
    {
        if (preg_match('/^\s*"?(SELECT)\s+/i', $sql))
        {
            $this->affect_rows = count($result_id->fetchAll());
            $result_id->execute();
        }
        else
        {
            $this->affect_rows = $result_id->rowCount();
        }
    }
    else
    {
        $this->affect_rows = 0;
    }

    return $result_id;
}