【问题标题】:Why is my gallery view page throwing up an error?为什么我的画廊查看页面会出现错误?
【发布时间】:2012-12-18 01:09:19
【问题描述】:

我目前正在使用 codeigniter 开发交互式配置文件中的画廊,每个用户都可以上传他们自己的图像部分。目前我的视图页面正在抛出一条消息:未定义的变量:图像。尽管我的模型中已经有一个 get_images 函数,但我的视图中还有一个 if 语句,因此如果尚未上传任何图像,它将理解不要尝试显示图像。我该如何解决这个问题?我还尝试将上传的任何图像存储在图库数据库中,以便在每个用户的名称旁边显示他们上传的任何图像。到目前为止,这是我的代码:

控制器:

class Gallery extends CI_Controller {



function __construct()
{
    // Call the parent construct
    parent::__construct();

    $this->load->model("profiles");
    $this->load->model("gal_model");
    $this->load->helper(array('form', 'url'));

    $this->gallery_path = 'web-project-jb/assets/gallery';
    $this->gallery_path_url = base_url().'web-project-jb/assets/gallery/';

}

function upload()
{

    $config = array(

            'allowed_types' =>'gif|jpg|jpeg|png',
            'upload_path' => $this->gallery_path,
            'max_size' => 10000,
            'max_width' => 1024,
            'max_height' => 768);

    $this->load->library('upload', $config);

    $image_data = $this->upload->data();

    $config = array(
            'source_image'  => $image_data["full_path"],
            'new_image'     => $this->gallery_path. '/thumbs',
            'maintain_ration'   => true,
            'width' => 150,
            'height' => 100


    );


    $this->load->library("image_lib", $config);
    $this->image_lib->resize();

    $username = $this->session->userdata('username');

    if ( ! $this->upload->do_upload())
    {
        $error = array('error' => $this->upload->display_errors());

        $username = $this->session->userdata('username');


        $viewData['username'] = $username;

        $this->load->view('shared/header');
        $this->load->view('gallery/galtitle', $viewData);
        $this->load->view('shared/nav');
        $this->load->view('gallery/galview', $error, $viewData, array('error' => ' ' ));
        $this->load->view('shared/footer');



    }
    else
    {
        $file_data  = $this->upload->data();

        $image = $this->gallery_path.$file_data['file_name'];

        $data['image'] = $this->gallery_path.$file_data['file_name'];

        $this->username = $this->session->userdata('username');

        $this->gal_model->putGalleryImage($username, $image);

        $this->session->set_userdata($image);

        $viewData['username'] = $username;
        $data['gal_model'] = $this->gal_model->get_images($username);



        $username = $this->session->userdata('username');

        $this->load->view('shared/header');
        $this->load->view('gallery/galtitle', $viewData);
        $this->load->view('shared/nav');
        $this->load->view('gallery/galview', $data, $viewData);
        $this->load->view('shared/footer');


    }
}

function index()
{

    $username = $this->session->userdata('username');

    $this->load->library('upload');

    $data['profileimages'] = $this->gal_model->get_images($username);

    $file_data = $this->upload->data();

    $file_data['file_name'] = $this->gal_model->get_images($username);

    $image = $this->gallery_path.$file_data['file_name'];

    $data['image'] = $file_data['file_name'];


    $viewData['username'] = $username;


    $this->load->view('shared/header');
    $this->load->view('gallery/galtitle', $viewData);
    $this->load->view('shared/nav');
    $this->load->view('gallery/galview', $viewData, $data, array('error' => ' ' ));
    $this->load->view('shared/footer');

}

 }

型号:

 class Gal_model extends CI_Model
{
var $gallery_path;
var $gallery_path_url;

function Gal_model()
{
    parent::__construct();

    $this->gallery_path = 'web-project-jb/assets/gallery';
    $this->gallery_path_url = base_url().'web-project-jb/assets/gallery/';
}   


function exists($username)
{
    $this->db->select('*')->from("gallery")->where('user', $username);
    $query = $this->db->get();

    if ($query->num_rows() > 0)
    {

        return true;
        /*
         echo "user $user exists!";
        $row = $query->row();
        echo " and his profileimage is $row->profileimage";
        */
    }

    else

    {

        return false;
        //echo "no such user as $user!";
    }

}



function putGalleryImage($username, $image)
{


    $record = array('user' => $username, 'galleryimage' => $image);
    $this->session->set_userdata($image);
    if ($this->exists($username))
    {
        $this->db->where('user', $username)->update('gallery', $record);


    }
    else
    {
        $this->db->where('user', $username)->insert('gallery', $record);

    }


}


function get_images($username)
{

    $this->db->select('*')->from('gal_model')->where('user', $username);

    $files = scandir($this->gallery_path);
    $files = array_diff($files, array('.', '..', 'thumbs'));

    $images = array();

    foreach ($files as $file){
        $images[] = array(
            'url'   => $this->gallery_path_url.$file,
            'thumb_url' => $this->gallery_path_url.'thumbs/'.$file


                );

    }

    return $images;
}

  }

查看:

 <?php if ( is_array($images) && (count($images)>0) ):
   foreach($images as $image): ?>
   <div class="thumb">
       <a href="<?php echo $image['url']; ?>">
          <img src ="<?php echo $image['thumb_url']; ?>"/>
       </a>  
       <br>
   </div>
<?php endforeach; else:  ?>
    <div id = "blank_gallery">Please upload an Image</div>
<?php endif; ?>

再次感谢大家的帮助

【问题讨论】:

    标签: php codeigniter gallery


    【解决方案1】:

    如果我在这里错了,请纠正我,但您似乎从未将 $images 分配给视图。您将$image$profileimages 分配给index(),但我没有看到$images

    【讨论】:

    • 感谢您指出这一点 Kai 我把它放在我的 index() - $images = $this->session->userdata('images'); $data['images'] = $images;
    • @Hannah_B - 您是否尝试过 var_dump($images) 以确保数组中有任何内容?另外,我不会将图像数组存储在会话中。我会把它留给模型来处理。如果您担心不必要的查询,您可以缓存画廊并将纯文本分配给基于用户 ID 的文件名。
    • 当你说把它留给模型时,这是否意味着我应该在我的 get_images 函数中通过 $images 作为另一个带有 $username 的变量? var dump 显示我刚刚上传的图片名称,但是没有上传到屏幕上
    • 我的意思是使用您拥有的方法:get_images 而不是依赖会话变量。但是,您需要根据自己的需要进行修改。从技术上讲,您可以在会话中存储这样的内容,但会话应仅用于小型通用支持数据或闪存消息,如表单成功或失败消息等。这只是不切实际。没有人打电话给互联网警察或其他任何事情,但从逻辑上讲,完全使用您提供的方法更有意义......
    • ... 而且您的上传脚本中有很多冗余。这是会话 flashdata 有意义的情况。 $this->session->set_flashdata('item', 'value'); ellislab.com/codeigniter/user-guide/libraries/sessions.html - 您的上传方法应该只处理上传、设置 flashdata 并将用户发送到 index 方法。在索引中,如果上传成功,它会调用应该按预期显示的用户图像
    【解决方案2】:

    您应该将您的 if 在您的视图中更改为

    if(isset($images) && is_array($images)) 
    

    这样,如果 $images in undefined 它不会抛出错误,它会一起跳过所有错误

    【讨论】:

    • 和计数 && !empty($images) 除了所有这些都应该在控制器中完成,而不是在视图中有长的条件链
    • 这两个条件不需要 count 和 !empty ... 如果 count == 0 则 isset 将返回 false,如果它是空的,如 !empty($images) 则 isset 将返回错误的。这 2 个是您唯一需要的 2 个。是的,逻辑应该在控制器中,但是在将视图显示给用户之前,总是会在视图中进行一些错误检查,作为故障保护。对不起,我的错误,当我写这个回复时,我在想别的东西。是的,您也可以在 if 语句中添加计数。我仍然坚持我的回应,即在执行代码之前添加最终的回退检查以防万一
    • 正确,因为 foreach 将捕获缺少计数检查,因此您是对的,条件中不需要计数。但是 isset 和 is_array 都将为空数组返回 true。除非填充,否则我倾向于将其分配为 false。所以我的条件是 if($images){ ... } 但这些做法都不是特别错误的,所以这是一种偏好。
    • 谢谢大家的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2021-08-10
    • 2021-11-06
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多