【问题标题】:Codeigniter3.0.1: Getting values from select and inputCodeigniter3.0.1:从选择和输入中获取值
【发布时间】:2016-05-10 08:57:30
【问题描述】:

我有一个“select”类别选项,用户可以从中选择不同的选项,如果用户选择“other”,则会出现一个输入字段(以便用户可以添加另一个类别)并在该类别下发布文章。
我正在获取 select 的值并检查输入是否不为空,然后更新具有 select 值的相同变量。
现在的问题是我似乎无法在“选择选项和输入”字段之间切换,如果我只是从选择选项中选择值它工作正常但是当用户选择“其他”并给出一个输入字段的新类别变量保持选择的值。
当我们尝试通过输入字段添加时出现以下错误:

错误号:1452
无法添加或更新子行:外键约束失败(ci.user_articles, CONSTRAINT article_catagory_fk FOREIGN KEY (cat_id_fk) REFERENCES catagory (cat_id) ON DELETE NO ACTION ON UPDATE CASCADE)
INSERT INTO user_articles (cat_id_fk, title, article) VALUES ('others', 'New title', 'My article is a marshmallow');

这是执行此操作的一段代码。这是我在 Model_article.php 文件中的 add_article() 函数:

public function add_article()
{
        $id = $this->input->post('hiddenValue');
        $title = $this->input->post('title');
        $catagory_id = $this->input->post('catagory_select');

        $cat = $this->input->post('cat');

        if (!isset($cat))
        {

            $cat_input = $this->input->post('cat');

            $add_catagory = "INSERT INTO catagory (`user_id_fk`,`cat_name`) VALUES ( '{$id}' ,'{$cat_input}' ) ";
            $result_catagory = $this->db->query($add_catagory);

            $retrive_catagory = "SELECT cat_id FROM catagory WHERE cat_name = '{$cat_input}' ";

            $result = $this->db->query($retrive_catagory)->row();

            $catagory_id = $result->cat_id; 

        }

        $articletext = $this->input->post('articletext',true);

        // echo $catagory_id; 
        // die();
        $sql = " INSERT INTO user_articles (`cat_id_fk`, `title`, `article`) VALUES ( '$catagory_id', '{$title}', '{$articletext}'); ";

        $result = $this->db->query($sql);
        $row = $this->db->affected_rows();

        if ($row) {
            return true;
        }
        else
        {
            echo "Couldn't perform query";
            die(mysqli_error($sql));
            return false;
        }
}

这是我的 view_addarticle.php 文件:

<div class="container">
<div class="row">
    <div class="col-xs-6">
        <?php
            // Display Result Using Ajax
            echo "<div id='result' style='display: none'>";

            echo "<div class='alert alert-success' role='alert'>Well done! You successfully read this important alert message....</div>";
            echo "</div>";
            echo "</div>";
        ?>
    </div>
    <div class="col-xs-6">
        <?php       
            echo validation_errors(); 
            echo form_open('article/submit_article'); #'add_post/submit_post'
        ?>

        <div class="form-group">
        <input type="hidden" name="hiddenValue" id="hiddenValue" value="<?php echo $session_data['id']; ?>">
            <label for="sel1">Title:</label>
                <input type="text" name="title" class="form-control" placeholder="Title of Article">
            <br>
            <!-- <label for="sel1">Select Catagory:</label> -->

          <script type="text/javascript">
                 function admSelectCheck(nameSelect)
            {
                 console.log(nameSelect);
                if(nameSelect){
                    admOptionValue = document.getElementById("admOption").value;
                    if(admOptionValue == nameSelect.value){
                        document.getElementById("admDivCheck").style.display = "block";
                    }
                    else{
                        document.getElementById("admDivCheck").style.display = "none";
                    }
                }
                else{
                    document.getElementById("admDivCheck").style.display = "none";
                }}
        </script> 


               <select name="catagory_select" class="selectpicker form-control" style=" width: 150px;" onchange='admSelectCheck(this);'> 
                <option>Select Catagory</option>  
                <?php
                    foreach ($query->result() as $key):
                ?>
                <option value="<?php echo $key->cat_id; ?>"><?php echo $key->cat_name; ?></option>
                <?php endforeach; ?>
                <option id="admOption">others</option>
              </select>

              <br>
              <div id="admDivCheck" style="display: none;">
                <input type="text" placeholder="Enter Catagory Name" class="form-control"  name="cat" id="color" style='width: 170px;'/>
                </div>
             <br>
            <label for="sel1">Article:</label>
            <textarea class="form-control" name="articletext" id="" cols="80" rows="10"></textarea>
            <br>
            <input class="btn btn-primary "  value="Submit Article" id="submit" type="submit" style="float:right;" />
            </div>
        </form>
    </div>
</div>

这是我在 Article.php 文件中的控制器函数 submit_article()

public function submit_article()
{
    $this->form_validation->set_rules('title', 'Title', 'required');
    $this->form_validation->set_rules('articletext', 'Article Text', 'required');


    if ($this->form_validation->run() === FALSE)
    {

        $this->load->view('layouts/header');
        $this->load->view('view_addarticle');
        $this->load->view('layouts/footer');
    }
    else
    {
        $title = $this->input->post('title');

        $result = $this->model_article->add_article();

        if(!$result)
        {
            echo "Coulnd't register, contact site admin help@xyz.com";
        }

        else
        {
            // echo json_encode($result);
            redirect('account');
        }
    }

}

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    在开始之前,我通常会在控制器中进行所有验证,将它们捆绑到一个数组中,然后以这种方式将它们发送到模型......

    您的错误归结为 SQL 错误...您在“ci.user_articles”表上有一个外键。类别(cat_id)表(col)中是否存在外键?您正在尝试插入一个值“其他”是否需要作为键来使用? (基于您显示的错误)。通常 ID 是数字而不是单词?

    外键意味着它需要在您正在引用的表/列中,否则它将无法插入,它是外键的用途......(仅供参考,假设您不知道这一点,受益于如果他们不这样做,其他人稍后会在谷歌上搜索。)

    关于检查字段是否有值,我建议使用如下检查:

    if(isset($this->input->post('hiddenValue')){
        $id = $this->input->post('hiddenValue')
        }
    

    这样做意味着如果用户从未实际输入任何内容,则不会发布数据。

    如果您使用查询助手/查询构建器,您将能够使用 CI 构建大部分 SQL,而不是手动构建查询,您也可以将所有内容打包到控制器中的一个数组中(我在其中执行此操作)无论如何),只需将数组传递给模型。

    使用 db builder 帮助程序也意味着您的代码是可移植的,只是想一想那个...

    【讨论】:

    • 感谢您的回答,我通过完全按照您在开始“在控制器中进行大量验证”中所说的更改逻辑解决了我的问题,并且 y 表都设置了几乎没有歧义的检索方式表格中的数据。我所做的是检查表单,如果我在输入字段中有值,如果没有,我运行一个单独的函数,其中输入没有作用。如果我捕捉到输入,我将运行一个特定于该输入值的函数,并且我现在工作得很好。
    • 很高兴答案有帮助,如果将数据发送到数组中的模型并使用 CI Query Builder,则不需要 2 个完全独立的函数,一旦掌握了它,就可以查看它,节省大量时间...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2021-06-29
    • 2015-10-19
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多