gpt4 book ai didi

php - CodeIgniter 插入了两次相同的条目。在某些情况下

转载 作者:行者123 更新时间:2023-11-29 06:44:07 25 4
gpt4 key购买 nike

我想弄清楚为什么 Codeigniter 在我的数据库中插入同一行 2 次。我正在使用 PDO 作为 mySQL 的接口(interface)。我正在调试它,我确定下面的函数没有被执行两次。它发生在特定情况下,如果两个 foreache 没有运行,因为数组为空,但如果其中一个运行,则不会发生错误。

`

public function save_all() //save all information with the launched flag FALSE
{
include(database_vars_url());
try
{
$this->add_new_skills();

if(!isset($_SESSION))
{
session_start();
}
$email = $_SESSION["email"];
$sql = "INSERT INTO $tbl_name_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, '$this->title', '$this->overview', '$this->description', '$this->category',
(SELECT customer_id FROM $tbl_name_customer WHERE user_id =
(SELECT user_id FROM $tbl_name_user WHERE user_email='$email')), '$this->prize', 0, '$this->contest_period',
'$this->project_period', -1, -1, -1, NULL, DEFAULT, NULL, -1, -1, DEFAULT); ";

foreach ($this->addon as $value)
{
$sql = $sql . "INSERT INTO $tbl_rel_contest_addon (add_contest_id, add_addon_id)
VALUES ((SELECT contest_id FROM $tbl_name_contest WHERE contest_title = '$this->title'
AND contest_overview = '$this->overview' AND contest_prize = '$this->prize'),
(SELECT addon_id FROM $tbl_name_addon WHERE addon_name = '$value')); ";
}

foreach ($this->skills as $value)
{
$sql = $sql . "INSERT INTO $tbl_rel_contest_skill (required_contest_id, required_skill_id)
VALUES ((SELECT contest_id FROM $tbl_name_contest WHERE contest_title = '$this->title'
AND contest_overview = '$this->overview' AND contest_prize = '$this->prize'),
(SELECT skill_id FROM $tbl_name_skill WHERE skill_name = '$value')); ";
}
echo $sql;
return $this->db->query($sql);
}
catch(Exception $e)
{
echo $e->getMessage();
}
return 0;
}

这里我有一个 mySQL 日志,前两个 SELECTS 被“$this->add_new_skills();”调用在函数 save_all() 的开头。这些 SELECT 也应该只是一个。此命令 SELECT SELECT,INSERT INSERT,证明函数 save_all() 没有被调用两次,如果它被调用两次,则顺序将是 SELECT INSERT 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_driver中的_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;
}

收件人:

    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;
}

测试 $sql 中是否包含“SELECT”的部分无法正常工作,因此当我尝试插入时,“$result_id->execute()”被调用了两次。

关于php - CodeIgniter 插入了两次相同的条目。在某些情况下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19707273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com