Php whileloop在获取两个表值时不正确

Php whileloop在获取两个表值时不正确,php,php-5.5,Php,Php 5.5,我有两个表,我想获取两个表值,这段代码应该工作正常,但count=2表示循环运行2次,返回2次的输出,像count=3表示循环运行3次返回输出3次,我犯了什么错误 输出 相同的ans,但我会来两次,如何解决此问题 1)您必须使用第一次查询收集emp\u id 2) 然后通过执行WHERE IN() 3) 将所有任务收集到阵列 4) 您可以输出json\u encode一次,否则json无效 <?php session_start(); include('dbconfig.php');

我有两个表,我想获取两个表值,这段代码应该工作正常,但count=2表示循环运行2次,返回2次的输出,像count=3表示循环运行3次返回输出3次,我犯了什么错误


输出

相同的ans,但我会来两次,如何解决此问题

1)您必须使用第一次查询收集
emp\u id

2) 然后通过执行
WHERE IN()

3) 将所有任务收集到阵列

4) 您可以输出
json\u encode
一次,否则json无效

<?php
session_start();
include('dbconfig.php');
if(empty($_SESSION['email'])){
    header('Location:login.php');
}

header('Content-Type: text/javascript; charset=utf8');


$dapartment = $_POST['department'];

$q = "SELECT * FROM task_employee WHERE emp_designation='".mysql_real_escape_string($dapartment)."'";
$q = mysql_query($q);
$taskEmployees = array(); 
while($taskEmployee = mysql_fetch_assoc($q)) {
    $taskEmployees[$taskEmployee['emp_id']] = $taskEmployee;
}
$empIds = array_keys($taskEmployees);

$tasks = array();

if(!empty($empIds)) {
  // this query tells mysql to return tasks of assigned users 
  $q = "SELECT * FROM task WHERE t_assign_to IN (".implode(',', $empIds).")";
  $q = mysql_query($q) or die(mysql_error());

  //  generating array of tasks associated by emp_id (t_assign_to field)
  while($task = mysql_fetch_assoc($q)) {
      $tasks[] = array(
        'task' => $task,
        'task_employee' => $taskEmployees[$task['t_assign_to']]
      );
  }
}

echo json_encode(array(
    'status'    => (empty($empIds))? 'not found' : 'success',
    'count'     => sizeof($tasks),
    'data'      => $tasks
));       

正如@Wobbles提到的那样。可以使用连接

session_start();
include('dbconfig.php');
if(empty($_SESSION['email'])){
  header('Location:login.php');
}

$dapartment = $_POST['department'];

$q = mysql_query("SELECT * FROM task_employee te, task t WHERE te.emp_designation='$dapartment' AND te.emp_id = t.t_assign_to");
$data = array();
while($r = mysql_fetch_assoc($q)){
    $data[] = $r;
}   

$return = array(
  'status' => ((empty($data))?'not found':'success'), 
  'count' => sizeof($data), 
  'data' => $data
);

header('Content-Type: text/javascript; charset=utf8');
echo json_encode($return);

有关更多信息,请查看

,只需使用内部联接,就不必迭代员工id

SELECT *
FROM task_employee
INNER JOIN task
ON task_employee.emp_id=task.t_assign_to
ORDER BY task_employee.emp_id;

您不必使用联接。您可以在一个查询中从两个表中进行选择

<?php
    session_start();
    include('dbconfig.php');

    if(empty($_SESSION['email'])){
      header('Location:login.php');
    }

    $dapartment = mysql_real_escape_string($_POST['department']);
    $sql = mysql_query("SELECT * FROM task_employee, task WHERE task_employee.emp_designation='$dapartment' AND task_employee.t_assign_to = task.emp_id");
    if(false == $sql){
        die('Invalid query: ' . mysql_error());
     }

     $count = mysql_num_rows($sql);
     $data = [];
     while($row=mysql_fetch_assoc($sql)){
          $data[] = $row;
     }

     if (count($data) <= 0){
          $return = array('status'=>'not found','count'=>$count,'data'=>$data);
     }
     else{
          $return = array('status'=>'success','count'=>$count,'data'=>$data);
     }
     echo json_encode($return);
?>


您到底面临什么问题?为什么不在此处使用联接查询而不是嵌套循环?@TirthPatel您错了!有php5 mysqlnd扩展来保持对旧代码的支持。必须同意大多数应用程序中的此类代码不仅仅是PDO。@Wobbles告诉此解决方案,如何编写联接查询。请参阅
task
表中的
id
=>1个数据出现2次?获取类似警告的错误:mysql\u fetch\u assoc()希望参数1是资源,第20行的/home/srisanka/public_html/cupid/TV/php/department-check.php中给出的布尔值
{“status”:“success”,“count”:0,“data”:[]}只需复制并粘贴代码,但我仍然收到相同的错误未知列'AE098',其中的子句'AE098是emp_id或t_assign__è你没有告诉任何人你有varchar类型的emp_id。现在它被修复了。这不起作用,因为@yuvi有一对多的数据结构。join将在一对一的情况下提供帮助。我知道,但在这个答案中,您将得到一个巨大的数据响应,所有数据都在一行中。这不是最优的。在大多数框架中,当模型得到相关的东西时,有一个急切的加载原则。因为,在DB表中有超过1个数据,具有相同的ID@yuvi'My task Table总共有3行,所以您的代码将返回3行times@yuvi它将一次返回3行。
警告:mysql_num_rows()希望参数1是资源,第10行的/home/srisanka/public\u html/cupid/TV/php/department-check.php中给出的布尔值警告:mysql\u fetch\u assoc()期望参数1是资源,第12行的/home/srisanka/public\u html/cupid/TV/php/department-check.php中给出的布尔值
{“状态”:“未找到”,“计数”:null,“数据”:[]您可以使用mysql\u error()找出错误。我用错误检查更新了我的答案,以便您可以找到问题。
SELECT *
FROM task_employee
INNER JOIN task
ON task_employee.emp_id=task.t_assign_to
ORDER BY task_employee.emp_id;
<?php
    session_start();
    include('dbconfig.php');

    if(empty($_SESSION['email'])){
      header('Location:login.php');
    }

    $dapartment = mysql_real_escape_string($_POST['department']);
    $sql = mysql_query("SELECT * FROM task_employee, task WHERE task_employee.emp_designation='$dapartment' AND task_employee.t_assign_to = task.emp_id");
    if(false == $sql){
        die('Invalid query: ' . mysql_error());
     }

     $count = mysql_num_rows($sql);
     $data = [];
     while($row=mysql_fetch_assoc($sql)){
          $data[] = $row;
     }

     if (count($data) <= 0){
          $return = array('status'=>'not found','count'=>$count,'data'=>$data);
     }
     else{
          $return = array('status'=>'success','count'=>$count,'data'=>$data);
     }
     echo json_encode($return);
?>