所以这些是我的代码。
模型
function read() {
$sql= "SELECT * from table WHERE name = 'rabin'";
$query = $this->db->query($sql);
$res = $query->result_array();
return $res;
}
控制器
function show() {
$this->load->model("db");
$array['data'] = $this->db->read();
$this->load->view("page", $array);
}
视图
foreach($data as $val) {
"<p>" . echo $val['name']; . "</p>"
"<p>" . echo $val['address']; . "</p>"
}
这里,当数据库中没有满足查询中WHERE子句的记录时,模型返回null,我收到错误$data expects parameter 1 to be array, null given
。有几种方法可以解决这种情况。但是,处理这种情况的最佳方法是什么?
答案 0 :(得分:2)
问题是数据库提供的foreach
需要数据,但你没有给任何人。
所以我会这样做:
function read() {
$this->db->where('name', 'rabin');
$res = $this->db->get('table');
return ($res->num_rows() > 0) ? $query->result_array() : false;
}
function show() {
// $this->(model_name)->(function);
$result = $this->db_model->read();
if ( $result ) {
// if there has data returns, load view
$array['data'] = $result;
$this->load->view('page', $array);
}
else {
// otherwise, show errors.
// you can handle by yourself
echo "no result!";
}
}
SQL Injection
。result_array
或false
,以便您可以处理结果。$res->row_array()
。 (就像某个成员一样)。db
重命名为(示例)db_model
或其他。 db
将与系统方法冲突。 $this->model_name->function_name
,例如,它应该是$this->db_model->read()
。db_model
),例如$this->load->model('db_model')
中的public function __construct() { }
。答案 1 :(得分:1)
在你的模特中试试这个
function read() {
$this->db->select()->from('table')->where('name', 'rabin');
$sql_stmt = $this->db->get();
return $sql_stmt->result();
}
然后检查你是否得到了结果 - 在你的控制器中,
function show() {
$this->load->model("db");
$array= array( 'data' => $this->db->read());
$this->load->view("page", $array);
}
要在视图文件中查看结果,请执行print_r($data);
然后让我知道你得到的结果
答案 2 :(得分:1)
在你的视图中,if if else阻止了foreach循环。类似的东西:
<?php if ($data != FALSE): ?>
<?php
foreach($data as $val)
{
"<p>" . echo $val['name']; . "</p>"
"<p>" . echo $val['address']; . "</p>"
}
?>
<?php else: ?>
<?php echo "There is no demanded data."; ?>
<?php endif; ?>
答案 3 :(得分:1)
这很像Benyi的答案,有点扭曲。
可能你最终希望模型能够找到“rabin”以外的名字。因此,这显示了如何通过将值传递给模型来实现这一点。此外,此模型方法始终返回对控制器有用的内容。
function read($name)
{
$noRecords[] = array('name' => "No Results!", 'address' => "");
if(empty($name))
{
return $noRecords;
}
//Such a simple query does not require Query Builder which adds a
//lot of extra processing to get to the same place as this query statement
$sql = "SELECT * from table WHERE name = ?";
//This is a "bound" query that will escape the input to guard against injection attacks
$query = $this->db->query($sql, array($name));
$res = $query->result_array();
if($res->num_rows() > 0)
{
return $query->result_array();
}
else
{
// send the controller an array containing a little something to explain what happened
return $noRecords;
}
//the above if/else could also be expressed with this ternary
// return $res->num_rows() > 0 ? $query->result_array() : $noRecords;
}
控制器现在非常轻便。
function show()
{
$name = 'rabin'; //some data for the model
$array['data'] = $this->db_model->read($name);
$this->load->view('page', $array);
}
您的观点也大大简化了
<?php foreach($data as $val): ?>
<p><?php echo $val['name']; ?>"</p>"
<p><?php echo $val['address']; ?>"</p>"
<?php endforeach; ?>