代码之家  ›  专栏  ›  技术社区  ›  Marcus

代码点火器激活记录问题

  •  0
  • Marcus  · 技术社区  · 15 年前

    我正在尝试在CodeIgniter上构建我的第一个应用程序。这也是我第一次尝试尽可能地坚持OOP和MVC。到目前为止一切都还可以,但现在我正在写我的第一个模型,我遇到了一些麻烦。以下是我得到的错误:

    发生数据库错误

    错误号:1064

    您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获得在第3行“castledine”附近使用的正确语法。

    选择*来自( authors )在哪里 author =伯爵城堡

    如下所示,它与我的模型中的以下行相关:

    $this->db->get_where('authors', array('author' => $author));
    

    我不太清楚为什么会出错。是因为卡斯提尔伯爵没有在引文里吗?如果是的话,为什么我不把它们放进去?我怀疑这是问题所在,宁愿认为是我的错,但我不确定。

    我还有一个问题。标签和作者都没有插入到各自的表中。他们的insert语句被包装在一个条件中,这个条件应该确保它们不存在,但是它似乎失败了,并且从未发生过插入。我认为这是失败的,因为标签没有放到数据库中,在它抛出错误之前,它被放在author部分中。我知道如何使用纯PHP来实现这一点,但我正在尝试用纯CI活动记录的方式来实现。

    以下是我使用的语句:

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

    控制器:

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

    有人能帮我解释一下我做错了什么吗?非常感谢。

    马库斯

    2 回复  |  直到 15 年前
        1
  •  0
  •   Mitchell McKenna    15 年前

    如果您使用count_all_results(),我想您的意思是使用 num_行 ()count_all_results()将实际创建一个select count(*)查询。

    用于调试问题…
    如果要测试insert()是否有效,请使用 affected_rows() ,示例:

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

    在任何时候,您都可以输出最后一个查询的内容 last_query() ,示例:

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

    你也可以打开 Profiler 因此,通过在控制器中添加以下内容,可以看到正在运行的所有查询:

    $this->output->enable_profiler(TRUE);
    
        2
  •  0
  •   Marcus    15 年前

    我自己解决了这个问题。控制器没有真正改变,但新型号如下:

    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));
        }
    
    }
    
    推荐文章