Я пытаюсь понять, почему Codeigniter вставляет в 2 раза одну и ту же строку в моей базе данных. Я использую PDO в качестве интерфейса для mySQL. Я отлаживал его, и я уверен, что функция ниже не выполняется два раза. Это происходит в конкретном случае, если два 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
Ну, я узнал, что функция _execute () в CI_DB_pdo_driver внутри системы codeigniter работает неправильно, возможно, это из-за версии 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; }
TO:
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» внутри нее, не работает, поэтому, когда я попытался ввести INSERT, «$ result_id-> execute ()« вызывается два раза.