部分代码被跳过

时间:2014-05-21 17:47:23

标签: php mysql database codeigniter

我正在尝试撰写自己的小博客。 为此,我使用CodeIgniter框架。

在我的博客文章中,我还想保存一个类别和一些关键字 我需要能够检查类别/关键字是否已经存在,如果不是,则需要创建新的类别/关键字 保存现有/新ID的ID以用于连接'表

我有以下数据库设置。

  

帖子 - ID(AI),标题,日期,内容
  类别 - id(AI),类别
   post_categories - 帖子,类别
  关键字 - id(AI),关键字
   post_keywords - 帖子,关键字
  * AI =自动增量

表posts,post_categories和post_keywords得到更新,表类别和关键字保持为空。连接表中的类别和关键字值不正确。

在对代码进行疑难解答时,我会在每个步骤中回显每个变量 出于某种原因,将跳过检查类别或关键字是否已存在的整个if / else结构。

/**
 * Insert post into database
 * Check if category already exists, if not add it
 * Check if keywords already exist, if not add them
 * Insert post-category and post-keyword links
 * @param array $data
 * @return boolean success
 */
function create($data) {
    print_r($data);

    try {
        // posts
        $this->db->insert('posts', array(
            'title' => $data['title'],
            'date' => $data['date'],
            'content' => $data['content']
        ));

        $postId = $this->db->insert_id();

        echo '<p>Inserted new post (' . $data['title'] . ') at ' . $postId . '</p>';

        // category

        $category = $data['category'];

        $query = $this->db->get_where('categories', array('category' => $category));

        $cat = 666;
        if ($this->db->count_all_results() == 1) {
            foreach ($query->result() as $row) {
                $cat = $row->id;
                echo '<p>cat = ' . $cat . '</p>';
            }
        } else {
            $this->db->insert('categories', array(
                'category' => $category
            ));
            $cat = $this->db->insert_id();
            echo '<p>cat = ' . $cat . '</p>';
        }

        echo '<p>Inserted new category (' . $category . ') at ' . $cat . '</p>';
        if($cat == 666) { echo ':('; }

        $this->db->insert('post_categories', array(
            'post' => $postId,
            'category' => $cat
        ));

        // keywords

        $keywords = $data['keywords'];

        foreach ($keywords as $keyword) {
            $query = $this->db->get_where('keywords', array('keyword' => $keyword));

            $key = 666;
            if ($this->db->count_all_results() == 1) {
                foreach ($query->result() as $row) {
                    $key = $row->id;
                    echo '<p>key = ' . $key . '</p>';
                }
            } else {
                $this->db->insert('keywords', array(
                    'keyword' => $keyword
                ));
                $key = $this->db->insert_id();
                echo '<p>key = ' . $key . '</p>';
            }

            echo '<p>Inserted new keyword (' . $keyword . ') at ' . $cat . '</p>';
            if($key == 666) { echo ':('; }

            $this->db->insert('post_keywords', array(
                'post' => $postId,
                'keyword' => $key
            ));
        }

        return true;
    } catch (Exception $e) {
        print '<p>ERROR:</p>' . $e;

        return false;
    }
}

也在我的控制器中

echo '<p>' . ($this->m_posts->create($post) ? 'no errors :)' : 'error! :(') . '</p>';

结果

Array ( [title] => Foo Bar [date] => 2014-05-22 [content] => lorum ipsum dolore si amet [category] => Category [keywords] => Array ( [0] => Some [1] => Keywords ) )
Inserted new post (Foo Bar) at 2

Inserted new category (Category) at 666
:(

Inserted new keyword (Some) at 666
:(

Inserted new keyword (Keywords) at 666    
:(

no errors :)

在我的数据库中

POSTS

stdClass Object ( [id] => 1 [title] => Title [date] => 2014-05-22 [content] => okokokokokokok ) 
stdClass Object ( [id] => 2 [title] => Foo Bar [date] => 2014-05-22 [content] => lorum ipsum dolore si amet ) 

CATEGORIES

POST_CATEGORIES

stdClass Object ( [post] => 1 [category] => 666 ) 
stdClass Object ( [post] => 2 [category] => 666 ) 

KEYWORDS

POST_KEYWORDS

stdClass Object ( [post] => 1 [keyword] => 666 ) 
stdClass Object ( [post] => 2 [keyword] => 666 ) 
stdClass Object ( [post] => 2 [keyword] => 666 ) 

注意:我使用99作为临时值来测试变量是否被填充,因为我首先认为变量的值没有离开if / else的范围。但是回显if / else中的变量值并不打印任何内容。它似乎跳过整个if / else部分。

1 个答案:

答案 0 :(得分:1)

将代码调整为:

  • 在if自己的if语句num_rows中查询
  • 如果您希望1条记录直接执行$query->row()而不是foreach循环。

    $query = $this->db->get_where('categories', array('category' => $category));
    
    $cat = 666;
    if ($query->num_rows() == 1) {
        $row = $query->row(); 
        $cat = $row->id;
        echo '<p>cat = ' . $cat . '</p>';
    } else {
        $this->db->insert('categories', array(
            'category' => $category
        ));
        $cat = $this->db->insert_id();
        echo '<p>cat = ' . $cat . '</p>';
    }