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 * FROM clubhouse_reservation WHERE reservation_date = '02/24/2017' AND reservation_status = 1 这就是显示的内容 是的,所以只需检查您的查询是否返回所有行?您可以使用 $checkresult->result_array(); 来检查它。 .如果它返回所有行需要检查循环。

以上是关于Codeigniter - Foreach 仅返回 1 行的主要内容,如果未能解决你的问题,请参考以下文章

使用codeigniter对查询进行foreach?

没有foreach循环的codeigniter单个结果

Codeigniter 组通过仅返回第一行

Codeigniter 服务器超时 - 在 for 循环中运行批量数据库查询

仅返回键的 PHP foreach

Foreach 循环仅针对第一组工作人员返回错误消息