Php 如何处理codeigniter中的空数组?
这是我的密码 模型 控制器Php 如何处理codeigniter中的空数组?,php,codeigniter,Php,Codeigniter,这是我的密码 模型 控制器 function show() { $this->load->model("db"); $array['data'] = $this->db->read(); $this->load->view("page", $array); } 看法 foreach($val数据){ “”.echo$val['name'];。”” “”.echo$val['address'];。”” } 在这里,当数据库中没有满足
function show() {
$this->load->model("db");
$array['data'] = $this->db->read();
$this->load->view("page", $array);
}
看法
foreach($val数据){
“”.echo$val['name'];。””
“”.echo$val['address'];。””
}
在这里,当数据库中没有满足查询中WHERE子句的记录时,模型返回null,我得到的错误是,
$data期望参数1是数组,null给定。有几种方法可以处理这种情况。但是,处理这种情况的最佳方法是什么呢?在您的模型中,尝试一下这个方法
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);
}
要在视图文件中查看结果,请执行打印($data)代码>
然后让我知道你在模型中得到了什么/结果
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);
}
要在视图文件中查看结果,请执行打印($data)代码>
然后让我知道你得到了什么/result问题是,foreach
需要数据库提供的数据,但你没有给他们任何人
因此,我将这样做:
模型
控制器
使用“始终”可防止SQL注入
模型返回结果\u数组
,或假
,以便您可以处理结果
如果查询结果只返回一行,请使用$res->row\u array()
。(像某一位成员)
您应该将模型从db
重命名为(示例)db\u model
或其他。db
将与系统方法冲突李>
从模型加载函数的方法是$this->model\u name->function\u name
,例如,它应该是$this->db\u model->read()
您应该加载模型(如果它是db\u model
),就像$this->load->model('db\u model')
中的公共函数{}
一样
问题是,foreach
需要数据库提供的数据,但您没有给他们任何人
因此,我将这样做:
模型
控制器
使用“始终”可防止SQL注入
模型返回结果\u数组
,或假
,以便您可以处理结果
如果查询结果只返回一行,请使用$res->row\u array()
。(像某一位成员)
您应该将模型从db
重命名为(示例)db\u model
或其他。db
将与系统方法冲突李>
从模型加载函数的方法是$this->model\u name->function\u name
,例如,它应该是$this->db\u model->read()
您应该加载模型(如果它是db\u model
),就像$this->load->model('db\u model')
中的公共函数{}
一样
在您的视图中,将if-than-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; ?>
在视图中,使用foreach循环放置if-than-else块。比如:
<?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; ?>
这很像本义的答案,但有点扭曲
也许您最终会希望模型能够查找除“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; ?>
“”
“”
这很像本义的答案,但有点扭曲
也许您最终会希望模型能够查找除“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; ?>
“”
“”
谢谢您的评论,但问题不在于代码。如果名称字段中有“rabin”,则返回所有数据;如果名称字段中没有“rabin”,则返回null。问题是我如何以最好的方式处理错误。@RabinLama在回答中更改了控制器。然后执行打印($data)代码>在您的视图中感谢您的评论,但问题不在于代码。如果名称字段中有“rabin”,则返回所有数据;如果名称字段中没有“rabin”,则返回null。问题是我如何以最好的方式处理错误。@RabinLama在回答中更改了控制器。然后执行打印($data)
在您的视图中,以与在PHP中检查相同的方式:如果(is_array($data)&&&$data){foreach($data……
嗯,这是处理错误的基本方法。但这是最好的方法吗?是的,是的。您的视图只需要确保提供了它需要处理的确切数据类型。如果您开始胡乱处理If($data!=FALSE){}
那么您的代码将变得越来越脆弱。想象一下,如果$this->db->read();
开始返回字符串作为可变输出的一部分或null
,那么您将不得不返回并重新计算if(){}
阻塞。但是,如果您将视图的结构设置为仅在收到预期数据类型时才执行操作,则视图将继续执行此操作。下面继续……唯一的警告是,如果出现故障,则可能会使调试根本原因变得有点棘手,但至少您的用户不会受到错误或空白屏幕的轰炸在视图中,您可以使用if($data)foreach($data as$val)
处理是否有结果。与您在PHP中检查的方法相同:if(is_array($data)&&&&$data){foreach($data……
这将是处理错误的基本方法。但这是最好的方法吗