Codeigniter - Foreach 仅返回 1 行
Posted
技术标签:
【中文标题】Codeigniter - Foreach 仅返回 1 行【英文标题】:Codeigniter - Foreach returning only 1 row 【发布时间】:2017-07-15 04:11:34 【问题描述】:对不起,如果这个问题可能很愚蠢,但我对编程比较陌生。我的网站中有一个预订功能,我创建了自己的表单验证 (MY_Form_validation) 来检查一天中的特定时间是否占用了一个时段。用户选择他们想要开始预订的时间以及他们想要结束预订的时间,如下所示。
基本上,预订时间为上午 10:00 至凌晨 1:00。在表格中,小时的值如下:10:00 = '10', 11:00 = '11', 12:00 = '12', 1:00 = '13', 2:00 = ' 14' ... 1:00 = '25'
我创建了一个数组,该数组将在预留时间时用作开关。我所做的是创建一个 foreach 来获取具有特定日期的所有行,并创建一个 while 循环来“切换”数组以模拟一个小时的占用时间。发生的情况是 foreach 循环只读取第一行,因此数组只被第一行修改,而不是其他行。
例子:(参考上面的sql表) 如果我保留开始值为 17 和结束值为 19 的小时数,则验证有效并返回“时间表已被预订”消息,因为它是第一行。但是,如果我保留起始值为 11 且结束值为 14(第二行)的小时数,则验证不起作用,并且保留通过。 我该如何正确地做到这一点?非常感谢!
表单验证函数:
function unique_reserve_clubhouse()
$reservedate = $this->CI->input->post('datepick');
$reservestart = $this->CI->input->post('reservestart');
$reserveend = $this->CI->input->post('reserveend');
$checkstart = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_start' => $reservestart, 'reservation_status' => 1), 1);
$checkresult = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_status' => 1));
$resultreserve = $checkresult->result();
$tdX = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foreach($resultreserve as $result)
while($result->reservation_start < $result->reservation_end)
$tdX[$result->reservation_start] = 1;
$result->reservation_start++;
if($checkstart->num_rows() > 0 || $tdX[$reservestart] == 1 || $tdX[$reserveend] == 1)
$this->set_message('unique_reserve_clubhouse', 'This time schedule is already booked.');
return FALSE;
return TRUE;
【问题讨论】:
现在修复它,愚蠢的错误。我将查询结果限制为仅 1 行,并没有注意到它。谢谢大家。 【参考方案1】:试试这个查看多行
function unique_reserve_clubhouse()
$reservedate = $this->CI->input->post('datepick');
$reservestart = $this->CI->input->post('reservestart');
$reserveend = $this->CI->input->post('reserveend');
$checkstart = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_start' => $reservestart, 'reservation_status' => 1), 1);
$checkresult = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_status' => 1), 1);
$resultreserve = $checkresult->result();
$tdX = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foreach($resultreserve as $key => $value)
echo $key.''.$value; //Here i have put echo so that you can check it here only.
if($checkstart->num_rows() > 0 || $tdX[$reservestart] == 1 || $tdX[$reserveend] == 1)
$this->set_message('unique_reserve_clubhouse', 'This time schedule is already booked.');
return FALSE;
return TRUE;
【讨论】:
我尝试用上面的代码替换我的代码,它仍然可以通过:/【参考方案2】:试试这个方法:
$condition = "reservation_date ='" .$reservedate . "'";
$this -> db -> select('*');
$this -> db -> from('clubhouse_reservation');
$this -> db -> where($condition);
foreach( $query -> result() as $record)
if($record->reservation_start >= $reservestart && $record->reservation_end <= reserveend)
//Has someone reserved
break;
【讨论】:
尝试了上面的代码,预订仍然通过:/【参考方案3】:1) 你能检查一下你的查询结果集吗?需要使用 result_array() 检查结果集查询到底返回了什么(是返回所有行还是只返回 1 行)。如果可以在查询语句之后添加有关您的查询的更多详细信息。
echo $this->CI->last_query();死;
它会给你准确的查询。使用 Query,您会知道哪里出错了。
2) 如果它返回所有行,那么你需要检查你的 foreach 循环和
【讨论】:
SELECT * FROMclubhouse_reservation
WHERE reservation_date
= '02/24/2017' AND reservation_status
= 1 这就是显示的内容
是的,所以只需检查您的查询是否返回所有行?您可以使用 $checkresult->result_array(); 来检查它。 .如果它返回所有行需要检查循环。以上是关于Codeigniter - Foreach 仅返回 1 行的主要内容,如果未能解决你的问题,请参考以下文章