Second EDIT - Found the Problem, and answered it as well.
First Edit - added my Post_model.php file as well for clearer explanation of my code.
I am trying to redirect a Blogs slug to a separate page where I can show the entire blogs content.
here's an example slug
http://localhost/aag/posts/test-one
Here's the Posts controller
<?php
class Posts extends CI_Controller {
public function index(){
// Shows a blog listing
}
public function view($slug = NULL){
$data['post'] = $this->post_model->get_posts($slug);
if(empty($data['post'])){
show_404();
}
$data['title'] = $data['post']['title'];
$this->load->view('templates/header');
$this->load->view('posts/view', $data);
$this->load->view('templates/footer');
}
}
The posts/view.php file
<h2><?php echo $post['title']; ?></h2>
<small class="post-date">Created on <?php echo $post['created_at']?></small><br>
<div class="post-body">
<?php echo $post['body']; ?>
</div>
the Post_model.php
class Post_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = FALSE)
{
if ($slug === FALSE) {
$query = $this->db->get('posts');
return $query->result_array();
}
$query = $this->db->get_where('posts', array('slug' => '$slug'));
return $query->row_array();
}
}
routes.php
$route['posts/(:any)'] = 'posts/view/$1';
$route['posts'] = 'posts/index';
$route['(:any)'] = 'pages/view/$1';
Okay, so years of writing mysqli queries made me do this mistake. In my Post_model.php I am getting the data where (DB column field) slug should match the $slug that gets passed in, but I surrounded the slugs inside single quotes that was causing the error. Here's the working code now.
class Post_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = NULL)
{
if ($slug === NULL) {
$query = $this->db->get('posts');
return $query->result_array();
}
$query = $this->db->get_where('posts', array('slug' => $slug));
return $query->row_array();
}
}
TLDR: Don't encapsulate your passed in arguments inside quotes.
Related
I'm following the Codeigniter tutorial: http://localhost:8080/myproject/user_guide/tutorial/news_section.html
When i point my browser to http://localhost:8080/myproject/news as the tutorial indicates at the final of the section, "Point your browser to your document root, followed by index.php/news and watch your news page." appears a blank page.
I tried to point to localhost:8080/index.php/news or /myproject/news but occurs the same problem.
Also i tried to set in autoload.php the next: $autoload['libraries'] = array('database');
as is indicated in codeigniter news section tutorial not working but not solve, so i leave it like this: $autoload['libraries'] = array('');
This is the routes:
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
The News.php:
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item']))
{
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
}
the view.php:
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
and the News_model.php:
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' =>
$slug));
return $query->row_array();
}
}
I expect to watch the news page
I'm trying to load a specific page within a controller. I followed the Codeigniter tutorial and the main pages work but the individual page (loaded with view) doesn't load according to the given slug.
blog.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Blog extends CI_Controller {
/**
* Index Page for this controller.
*
* Maps to the following URL
* http://example.com/index.php/index
* - or -
* http://example.com/index.php/Index/index
* - or -
*/
function __construct()
{
parent::__construct();
$this->load->model('blog_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['post'] = $this->blog_model->get_posts();
$data['title'] = 'Blog archive';
$this->load->view('header', $data);
$this->load->view('blog', $data);
$this->load->view('footer', $data);
}
public function view($slug = NULL)
{
$data['post'] = $this->blog_model->get_posts($slug);
if (empty($data['post']))
{
show_404();
}
$data['title'] = $data['post']['title'];
$this->load->view('header', $data);
$this->load->view('post', $data);
$this->load->view('footer', $data);
}
}
blog_model.php
<?php
class Blog_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = FALSE)
{
if ($slug === FALSE)
{
$this->db->select('*');
$this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
$query = $this->db->get();
return $query->result_array();
}
$this->db->select('*');
// $this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
// $this->db->where('slug', $slug);
$query = $this->db->get_where('blog_posts', array('slug' => $slug));
return $query->row_array();
}
}
As you can see I tried a few combinations because I'm not sure it's retrieving the table in get_posts when slug is not false.
try like this
call url_helper helper in __construct like following
$this->load->helper('url');
Now, update the routes.php like following
If your URL like
http://www.example.com/blog/view/slug
Your ruote should be like this
$route['blog/view/(:any)'] = 'blog/view/$1';
If your URL like
http://www.example.com/view/slug
Your ruote should be like this
$route['view/(:any)'] = 'blog/view/$1';
And, your get_posts model function repeating queries, use it simply like below
public function get_posts($slug = FALSE){
$this->db->select('*');
$this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
if($slug){
$this->db->where(compact('slug'));
}
$query = $this->db->get();
return ($query->num_rows() > 1) ? $query->result_array() : $query->row_array();
}
In the end I solved it by modifying the routes:
At first I had:
$route['default_controller'] = 'Index';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['blog'] = 'blog';
$route['blog/(:any)'] = 'blog/$1';
So I changed it to:
$route['default_controller'] = 'Index';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['blog'] = 'blog';
$route['blog/(:any)'] = 'blog/view/$1';
And changed the method name in blog.php from blog to view. "view" looks more standard than "blog" so I left it that way. In 'blog/view/$1' represents the controller, view the method and of course $1 is the first param. Actually if I try Blog/view/hello-world it works too.
so I believe I have it right (im new to active records).
the problem I am having I keep getting error
Message: Call to a member function getbank() on a non-object
My code is simple
Controller
class Profile extends CI_Controller
{
function index()
{
$data = array();
if($query = $this->profile_model->getbank())
{
$data['records'] = $query;
}
$this->load->view('profile_view', $data);
}
}
model
class Profile_model extends CI_Model {
function getbank()
{
$query = $this->db->get('bank');
return $query->results();
}
Its so simple, I cant see a error, thank you.
Try this
Controller
class Profile extends CI_Controller
{
function index()
{
$data = array();
$this->load->model('profile_model'); # Added
$query = $this->profile_model->getbank(); # Changed
if(!empty($query)) # Changed
{
$data['records'] = $query;
}
$this->load->view('profile_view', $data);
}
}
Model
class Profile_model extends CI_Model {
public function getbank() # Changed
{
$query = $this->db->get('bank');
return $query->result(); # Changed
}
}
Update
Simple answer, thanks to all those who tried helping. I had the model file name with a small letter not a capital.
Eg profile_model.php
should be Profile_model.php
However, this solution is elegant and simple, so it improved my code so il accept this one.
It may be because you didn't load your model?
Try changing your controller to:
class Profile extends CI_Controller
{
function index()
{
$data = array();
$this->load->model('Profile_model');
if($query = $this->Profile_model->getbank())
{
$data['records'] = $query;
}
$this->load->view('profile_view', $data);
}
}
My small project with CodeIgniter (wich is only to get familiar with it. It's actually like their tutorial's example) it stoped working, giving me no output or errors even that in the index.php is set to developement...
So I tried to debug it myself with some echo's
And I found that here stops logging
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
echo 'This is echoed';
$this->load->model('news_model');
echo 'This wont be echoed';
}
/*(class continues)*/
}
And my news_model.php looks like this:
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news'{});
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
public function set_news()
{
$this->load->helper('url');
$slug = url_title($this->input->post('title'), 'dash', TRUE);
$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'text' => $this->input->post('text')
);
return $this->db->insert('news', $data);
}
}
Any idea what I'm doing wrong?
-EDIT-
public function __construct()
{
echo '__construct()';
$this->load->database();
echo 'after__construct()';
}
None of them are echoed...
find 1
$this->db->get('news'{}); // try to del {}
first parameters is table name
The second and third parameters enable you to set a limit and offset clause
Original codeignitor tutorial has this:
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news'); // <----------------------------
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
I am building my first CodeIgniter website and I am conquering a problem that seems to be hard to solve..
When I click on a article to read it I keep getting a 404 page. ( not found )
the link that I get is as follows
index.php/articles/articlename
In my controller I have the following for the view part
public function view($slug) {
$data['article_item'] = $this->articles_model->get_article($slug);
if (empty($data['article_item']))
{
show_404();
}
$data['title'] = $data['article_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('articles/view', $data);
$this->load->view('templates/side', $data);
$this->load->view('templates/footer');
}
As you see it has to include the view.php in the articles directory
In my router I have the following
$route['articles/(:any)'] = 'articles/view/$1';
$route['articles/create'] = 'articles/create';
$route['(:any)'] = 'pages/view/$1';
$route['gallery'] = 'gallery';
$route['articles'] = 'articles';
$route['default_controller'] = 'home';
$route['404_override'] = '';
Just to be sure I have posted every relevant stuff here is the link that I create
Read more
and the model
<?php
class Articles_model extends CI_Model {
public function __construct() {
$this->load->database();
}
public function get_article($slug = FALSE) {
if ($slug === FALSE) {
$query = $this->db->get('articles');
return $query->result_array();
}
$query = $this->db->get_where('articles', array('slug' => $slug));
return $query->row_array();
}
}
I hope someone can tell me what I'm doing wrong here..
You are missing the function name in your link.
Your URL should be: index.php/articles/view/articlename
The first part in your URL after index.php is the name of your Class and the second part is the name of your function and then your input values