如何执行插入查询,然后使用CodeIgniter的ActiverEcord在相关表上插入查询? 我正在尝试在CodeIgniter上构建我的第一个应用程序。这也是我第一次试图尽可能地坚持OOP和MVC。到目前为止一切都还不错,但是现在我试图写我的第一个M ...

问题描述 投票:0回答:1

Error编号:1064

您的SQL语法中有错误;检查与您的MySQL Server版本相对应的手册,以获取正确的语法

选择 *从(

authors
)中
author

= earlecastledine

如下所示,这与我的模型中的以下行有关:
$this->db->get_where('authors', array('author' => $author));

我不太确定为什么会丢弃错误。是因为Earle Castledine不在报价中吗?如果是这样,为什么CI不把它们放在那里?我怀疑这是问题,而是认为这是我的错,但我不确定。 我也有另一个问题。标签和作者都没有插入各自的表格中。他们的插入语句包裹在一个应该确保它们还不存在的条件下,但似乎是失败的,插入永远不会发生。我认为这是失败的,因为标签没有放入数据库中,并且在作者部分抛弃错误之前就在作者部分中倒下。我知道如何使用纯PHP做到这一点,但我正在尝试以纯CI ActivereCord的方式进行操作。

正在使用的是我正在使用的陈述:
 if ($this->db->count_all_results() == 0)

我正在使用它,而不是我通常使用的内容:

if (mysql_num_rows() == 0)
我做错了吗?
我的模型和控制器(只有重要的功能)是我所能做的。
模型:

function new_book($book, $tags, $authors, $read) { // Write book details to books table $this->db->insert('books', $book); // Write tags to tag table and set junction foreach ($tags as $tag) { // Check to see if the tag is already in the 'tags' table $this->db->get_where('tags', array('tag' => $tag)); // trying to use this like mysql_num_rows() if ($this->db->count_all_results() == 0) { // Put it there $this->db->insert('tags', $tag); } // Set the junction // I only need the id, so... $this->db->select('id'); // SELECT id FROM tags WHERE tag = $tag $query = $this->db->get_where('tags', array('tag' => $tag)); // INSERT INTO books_tags (book_id, tag_id) VALUES ($book['isbn'], $query->id) $this->db->insert('books_tags', array('book_id' => $book['isbn'], 'tag_id' => $query->id)); } // Write authors to author table and set junction // Same internal comments apply from tags above foreach ($authors as $author) { $this->db->get_where('authors', array('author' => $author)); if ($this->db->count_all_results() == 0) { $this->db->insert('authors', $author); } $this->db->select('id'); $query = $this->db->get_where('authors', array('author' => $author)); $this->db->insert('authors_books', array('book_id' => $book['isbn'], 'author_id' => $query)); } // If the user checked that they've read the book if (!empty($read)) { // Get their user id $user = $this->ion_auth->get_user(); // INSERT INTO books_users (book_id, tag_id) VALUES ($book['isbn'], $user->id) $this->db->insert('books_users', array('book_id' => $book['isbn'], 'user_id' => $user->id)); } }

Controller:

function confirm() { // Make sure they got here by form result, send 'em packing if not $submit = $this->input->post('details'); if (empty($submit)) { redirect('add'); } // Set up form validation $this->load->library('form_validation'); $this->form_validation->set_error_delimiters('<h3 class="error">', ' Also, you&rsquo;ll need to choose your file again.</h3>'); $this->form_validation->set_rules('isbn','ISBN-10','trim|required|exact_length[10]|alpha_numeric|unique[books.isbn]'); $this->form_validation->set_rules('title','title','required'); $this->form_validation->set_rules('tags','tags','required'); // Set up upload $config['upload_path'] = './books/'; $config['allowed_types'] = 'pdf|chm'; $this->load->library('upload', $config); // If they failed validation or couldn't upload the file if ($this->form_validation->run() == FALSE || $this->upload->do_upload('file') == FALSE) { // Get the book from Amazon $bookSearch = new Amazon(); try { $amazon = $bookSearch->getItemByAsin($this->input->post('isbn')); } catch (Exception $e) { echo $e->getMessage(); } // Send them back to the form $data['image'] = $amazon->Items->Item->LargeImage->URL; $data['content'] = 'add/details'; $data['error'] = $this->upload->display_errors('<h3 class="error">','</h3>'); $this->load->view('global/template', $data); // If they did everything right } else { // Get the book from Amazon $bookSearch = new Amazon(); try { $amazon = $bookSearch->getItemByAsin($this->input->post('isbn')); } catch (Exception $e) { echo $e->getMessage(); } // Grab the file info $file = $this->upload->data(); // Prep the data for the books table $book = array( 'isbn' => $this->input->post('isbn'), 'title' => mysql_real_escape_string($this->input->post('title')), 'date' => $amazon->Items->Item->ItemAttributes->PublicationDate, 'publisher' => mysql_real_escape_string($amazon->Items->Item->ItemAttributes->Publisher), 'pages' => $amazon->Items->Item->ItemAttributes->NumberOfPages, 'review' => mysql_real_escape_string($amazon->Items->Item->EditorialReviews->EditorialReview->Content), 'image' => mysql_real_escape_string($amazon->Items->Item->LargeImage->URL), 'thumb' => mysql_real_escape_string($amazon->Items->Item->SmallImage->URL), 'filename' => $file['file_name'] ); // Get the tags, explode by comma or space $tags = preg_split("/[\s,]+/", $this->input->post('tags')); // Get the authors $authors = array(); foreach ($amazon->Items->Item->ItemAttributes->Author as $author) { array_push($authors, $author); } // Find out whether they've read it $read = $this->input->post('read'); // Send it up to the database $this->load->model('add_model', 'add'); $this->add->new_book($book, $tags, $authors, $read); // For now... Later I'll load a view echo 'Success'; } }

	

在哪里使用count_all_results(),我认为您的意思是使用

num_rows
()。 count_all_results()实际上将创建一个选择count(*)查询。

用于调试您的问题...

如果要测试插入()是否有效,请使用

afted_rows()

,示例:

var_dump($this->db->affected_rows());

在任何一点上,您都可以输出使用
last_query()

,示例的最后一个查询:

var_dump($this->db->last_query());
php codeigniter activerecord model transactions
1个回答
0
投票
-Profiler

,因此您可以通过在控制器中添加所有查询正在运行的所有查询: $this->output->enable_profiler(TRUE);


我设法自己弄清楚了。控制器并没有真正改变,但这是新模型: function new_book($book, $tags, $authors, $read) { // Write book details to books table $this->db->insert('books', $book); // Write tags to tag table and set junction foreach ($tags as $tag) { // Check to see if the tag is already in the 'tags' table $query = $this->db->get_where('tags', array('tag' => $tag)); // trying to use this like mysql_num_rows() if ($query->num_rows() == 0) { // Put it there $this->db->insert('tags', array('tag' => $tag)); } // Set the junction // I only need the id, so... $this->db->select('id'); // SELECT id FROM tags WHERE tag = $tag $query = $this->db->get_where('tags', array('tag' => $tag)); $result = $query->row(); // INSERT INTO books_tags (book_id, tag_id) VALUES ($book['isbn'], $query->id) $this->db->insert('books_tags', array('book_id' => $book['isbn'], 'tag_id' => $result->id)); } // Write authors to author table and set junction // Same internal comments apply from tags above foreach ($authors as $author) { $query = $this->db->get_where('authors', array('author' => mysql_real_escape_string($author))); if ($query->num_rows() == 0) { $this->db->insert('authors', array('author' => mysql_real_escape_string($author))); } $this->db->select('id'); $query = $this->db->get_where('authors', array('author' => mysql_real_escape_string($author))); $result = $query->row(); $this->db->insert('authors_books', array('book_id' => $book['isbn'], 'author_id' => $result->id)); } // If the user checked that they've read the book if (!empty($read)) { // Get their user id $user = $this->ion_auth->get_user(); // INSERT INTO books_users (book_id, tag_id) VALUES ($book['isbn'], $user->id) $this->db->insert('books_users', array('book_id' => $book['isbn'], 'user_id' => $user->id)); } }

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.