Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP&;共点火器_Php_Mysql_Activerecord_Codeigniter - Fatal编程技术网

如何使用PHP&;共点火器

如何使用PHP&;共点火器,php,mysql,activerecord,codeigniter,Php,Mysql,Activerecord,Codeigniter,我正试图弄清楚如何在我的第一个CI应用程序(也是有史以来唯一的第二个PHP应用程序)中编写语句,但我被卡住了 我有一个连接表,用于保存各自表中的book_id和user_id。我想找出谁读过一本书,并将其回溯出来,但我需要有意义的格式。以下是查询: $readQuery = $this->db->get_where('books_users', array('book_id' => $isbn)); 这是我对一个人的逻辑 // Get my user info $user =

我正试图弄清楚如何在我的第一个CI应用程序(也是有史以来唯一的第二个PHP应用程序)中编写语句,但我被卡住了

我有一个连接表,用于保存各自表中的book_id和user_id。我想找出谁读过一本书,并将其回溯出来,但我需要有意义的格式。以下是查询:

$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));
这是我对一个人的逻辑

// Get my user info
$user = $this->ion_auth->get_user();
// Tell me who has read it.
$this->db->select('user_id');
$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));
// If only one person has read it
if ($readQuery->num_rows() == 1) {
    $readResult = $readQuery->row();
    // And if that person was me...
    if ($readResult->user_id == $user->id) {
        $message = 'You have read this.';
    // If it was someone else...
    } else {
        $reader = $this->ion_auth->get_user($readResult->user_id);
        $message = "$reader->first_name $reader->last_name has read this";
    }
// If two people have read it
}
所以如果只有一个人读过我就好了。但是当两个人读过它时,我希望它说“名字一和名字二读过这个。”如果登录的人没有读过它。如果他们是两个人中的一个,应该说“你和两个名字读过这个”

等等,3-5分钟。如果有3-5个人读过,选项将是“说出一个人、说出两个人和说出三个人读过这个”或“你、说出两个人和说出三个人读过这个”

如果是6个或更多,它应该只说出其中两个的名字,即“你,说出两个,还有5个人读过这个。”

我考虑为每个实例执行一个条件,然后将所有用户推送到一个数组中。然后我可以使用in_array()来查看登录用户是否已读取并尝试报告,但我只是在处理逻辑时遇到了一些问题

有没有更简单的方法

先谢谢你,
Marcus

我要说的是,对范围使用switch语句。你必须做一些杂技来处理是否包含“你”的问题。下面的代码未经测试,但给出了总体思路

$message = "";
$readers = array();
$me_included = 0; // Counter increment if you're included in the reader list

$this->db->select('user_id');
$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));      
foreach ($readQuery->result() as $row) {
  if ($row->user_id == $user->id) {
    $message = "You";
    $me_included = 1;
  } else {
    $readers[] = $this->ion_auth->get_user($row->user_id);
  }
}

$reader_count = $sizeof($readers) + $me_included;
switch(TRUE) 
{
  // One reader, not you
  case( ($reader_count == 1) && ($me_included == 0) ):
    $message .= $readers[0]->first_name . " " . $readers[0]->last_name . " has read this.";
    break;
  // Only you
  case( ($reader_count == 1) && ($me_included == 1) ):
    $message .= " have read this.";
    break;
  // Two readers
  case( ($reader_count == 2) ):
    for ($i = 0; $i <= sizeof($readers); $i++) {
      if ($i == sizeof($readers)) {
        $message .= " and ";
      }
      $message .= $readers[i]->first_name . " " . $readers[i]->last_name;
    }
    $message .= " have read this.";
    break;
  case( ($reader_count > 3) && ($reader_count < 6) ):
    if ($me_included) {
      $message .= ", ";
    }
    for ($i = 0; $i <= sizeof($readers); $i++) {
      if ($i == sizeof($readers)) {
        $message .= " and ";
      }
      $message .= $readers[i]->first_name . " " . $readers[i]->last_name;
      if ($i != sizeof($readers)) {
        $message .= ", ";
      } else {
        $message .= " have read this.";
      }
    }
    break;
  case( ($reader_count > 6) ):
    if ($me_included) {
      $message .= ", " . $readers[0]->first_name . " " . $readers[0]->last_name . " and " . ($reader_count - 2) . " others have read this.";
    } else {
    for ($i = 0; $i <= 1; $i++) {
      $message .= $readers[0]->first_name . " " . $readers[0]->last_name . ", " . $readers[1]->first_name . " " . $readers[1]->last_name . " and " . ($reader_count - 2) . " others have read this.";
    }
    break;
  }
$message=”“;
$readers=array();
$me_include=0;//如果您包含在读卡器列表中,则计数器递增
$this->db->select('user_id');
$readQuery=$this->db->get_-where('books_-users',数组('book_-id'=>$isbn));
foreach($readQuery->result()作为$row){
如果($row->user\u id==$user->id){
$message=“您”;
包括$me_=1;
}否则{
$readers[]=$this->ion\u auth->get\u user($row->user\u id);
}
}
$reader\u count=$sizeof($readers)+$me\u包括在内;
开关(真)
{
//一个读者,不是你
案例($reader_count==1)和($me_include==0)):
$message.=$readers[0]->first\u name.““$readers[0]->last\u name.”已阅读此内容;
打破
//只有你
案例($reader_count==1)和($me_include==1)):
$message.=“您已经读过了。”;
打破
//两个读者
大小写($reader_count==2)):
对于($i=0;$i first\u name.“”。$readers[i]->last\u name;
}
$message.=“您已经读过了。”;
打破
案例($reader_count>3)和($reader_count<6)):
如果(包括我){
$message.=“,”;
}
对于($i=0;$i first\u name.“”。$readers[i]->last\u name;
如果($i!=sizeof($readers)){
$message.=“,”;
}否则{
$message.=“您已经读过了。”;
}
}
打破
案例($reader_count>6)):
如果(包括我){
$message.=“,”$readers[0]->first_name。“$readers[0]->last_name.”和“$reader_count-2.”其他人已经阅读了此内容。“”;
}否则{
对于($i=0;$i first_name.“$readers[0]->last_name.”、“$readers[1]->first_name.”、“$readers[1]->last_name.”、“$readers[1]->last_name.”和“$reader_count-2.”其他人都读过这篇文章。”;
}
打破
}
$users=array();
while($row)
{
如果(当前用户)
{
数组\u unshift($users,'You')
}
其他的
{
$users[]=行[名称]
}
}
$count=$max=count($users);
如果($max>=6)
{
$max=2;
}
$str='';
对于($i=0;$i=6)
{
$str.='和'$count-2.'其他'
}

这应该会对你有所帮助。这几乎是伪代码,但逻辑是用来实现你想要的(我相信)。如果你只是显示一些用户,你显然不想获取所有的行,但这很容易实现。

实际上我们可以在一些地方对此进行优化。

1) 在初始查询中,与用户表进行联接,这样我们就不必仅为每个名称再次查询多次:

$readers = $this->db->select('id', 'first_name', 'last_name')->from('books_users')->join('users', 'books_users.id =users.id', 'left')->where('book_id' => $isbn);
2) 此外,通过执行单独的查询,我们可以避免迭代整个(可能较大)结果集以查看您是否读取它:

$you_read = $this->db->get_where('books_users', array('book_id' => $isbn, 'user_id' => $user->id));

为了完整起见,这里是我使用的最后一段代码。希望它对某些人有用

    // Find out who has read this book
    // Get the users
    $current_user = $this->ion_auth->get_user();
    $users = $this->ion_auth->get_users();
    // Get the readers
    $this->db->select('user_id');
    $query = $this->db->get_where('books_users', array('book_id' => $isbn));
    // If there were results
    $readers = array();
    if ($query->num_rows() > 0) {
        foreach ($users as $user) {
            if ($current_user->id == $user->id) {
                array_unshift($readers, 'You');
            } else {
                $readers[] = $user->first_name . ' ' . $user->last_name;
            }
            $count = $max = count($readers);
            if ($max >= 6) {
                $max = 2;
            }
            $message = '';
            for ($i = 0; $i < $max; $i++) {
                $message .= ($message == '' ? '' : ($i == ($count - 1) && ($count < 6) ? ' and ' : ', ')) . $readers[$i];
            }
            if ($count >= 6) {
                $message .= ' and ' . ($count - 2) . ' others';
            }
            $message .= ($count == 1 && !$current_user->id ? ' has ' : ' have ') . 'read this.';
        }
    } else {
        $message = '<a href="' . base_url() . 'books/' . $bookResult->filename . '">Be the first to read this.</a>';
    }
//找出谁读过这本书
//获取用户
$current_user=$this->ion_auth->get_user();
$users=$this->ion\u auth->get\u users();
//吸引读者
$this->db->select('user_id');
$query=$this->db->get_-where('books_-users',数组('book_-id'=>$isbn));
//如果有结果
$readers=array();
如果($query->num\u rows()>0){
foreach($users作为$user){
如果($current_user->id==$user->id){
数组_unshift($readers,'You');
}否则{
$readers[]=$user->first\u name.'.$user->last\u name;
}
$count=$max=count($readers);
如果($max>=6){
$max=2;
}
$message='';
对于($i=0;$i<$max;$i++){
$message.=($message=''?'':($i==($count-1)和($count<6)?和“:”)。$readers[$i];
}
如果($count>=6){
$message.='和'。($count-2)。'其他';
}
$message.=($count==1&&!$current_user->id?'has':'have')。'readthis';
}
}否则{
$message='';
}

我更喜欢这个设置-它看起来更干净-但我无法在我的场景中实现它。我的大部分困惑来自这一行:$str.=($str=''?:($I==$count-1&&&$count<6''和':',')。$users[$I];有什么建议吗?我对三元语句不太在行,也不明白我在第一个语句的引号里放了什么。三元语句只是为了连接-所以如果str为空,不要追加任何内容,否则追加结果(如果我们是str的结尾,并且我们的值小于6,则追加和其他)
    // Find out who has read this book
    // Get the users
    $current_user = $this->ion_auth->get_user();
    $users = $this->ion_auth->get_users();
    // Get the readers
    $this->db->select('user_id');
    $query = $this->db->get_where('books_users', array('book_id' => $isbn));
    // If there were results
    $readers = array();
    if ($query->num_rows() > 0) {
        foreach ($users as $user) {
            if ($current_user->id == $user->id) {
                array_unshift($readers, 'You');
            } else {
                $readers[] = $user->first_name . ' ' . $user->last_name;
            }
            $count = $max = count($readers);
            if ($max >= 6) {
                $max = 2;
            }
            $message = '';
            for ($i = 0; $i < $max; $i++) {
                $message .= ($message == '' ? '' : ($i == ($count - 1) && ($count < 6) ? ' and ' : ', ')) . $readers[$i];
            }
            if ($count >= 6) {
                $message .= ' and ' . ($count - 2) . ' others';
            }
            $message .= ($count == 1 && !$current_user->id ? ' has ' : ' have ') . 'read this.';
        }
    } else {
        $message = '<a href="' . base_url() . 'books/' . $bookResult->filename . '">Be the first to read this.</a>';
    }