【问题标题】:whilelopp not properly while fetching two table valueswhilelopp 在获取两个表值时不正确
【发布时间】:2016-04-14 13:53:25
【问题描述】:

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


输出

{  
   "status":"success",
   "count":2,
   "data":[  
      {  
         "id":"1",
         "t_id":"STV1",
         "t_title":"Horoscope Uploading",
         "t_project":"1",
         "t_sub_project":"Sub-project",
         "t_desc":"cfdgdgdcf",
         "t_priority":"Urgent",
         "t_assign_to":"AE098",
         "t_assign_on":"2016-04-13 12:03:49",
         "t_started_on":"2016-04-14 05:30 PM",
         "t_due_on":"2016-04-22 05:30 PM",
         "t_complete_percentage":"100",
         "t_est_hours":"35",
         "t_worked":"10 Hours",
         "t_comment":"dfhfghfgfsfhfgh",
         "t_created_on":"2016-04-13 12:03:49",
         "t_edited_on":"2016-04-14 07:01:06",
         "t_status":"3",
         "t_delete_on":"0"
      }
   ]
}{  
   "status":"success",
   "count":2,
   "data":[  
      {  
         "id":"1",
         "t_id":"STV1",
         "t_title":"Horoscope Uploading",
         "t_project":"1",
         "t_sub_project":"Sub-project",
         "t_desc":"cfdgdgdcf",
         "t_priority":"Urgent",
         "t_assign_to":"AE098",
         "t_assign_on":"2016-04-13 12:03:49",
         "t_started_on":"2016-04-14 05:30 PM",
         "t_due_on":"2016-04-22 05:30 PM",
         "t_complete_percentage":"100",
         "t_est_hours":"35",
         "t_worked":"10 Hours",
         "t_comment":"dfhfghfgfsfhfgh",
         "t_created_on":"2016-04-13 12:03:49",
         "t_edited_on":"2016-04-14 07:01:06",
         "t_status":"3",
         "t_delete_on":"0"
      }
   ]
}

同样的答案,但我会来两次,如何解决这个问题

<?php
	session_start();
	include('dbconfig.php');
	if(empty($_SESSION['email'])){
	  header('Location:login.php');
	}
	$dapartment = $_POST['department'];
	$sql = mysql_query("SELECT * FROM task_employee WHERE emp_designation='$dapartment'");
	$count=mysql_num_rows($sql);
	$return = array();
	while($r=mysql_fetch_assoc($sql)){
		$emp_id=$r['emp_id'];
		if($count > 0){
		$mysql = mysql_query("SELECT * FROM task WHERE t_assign_to='$emp_id'");
		 while($row= mysql_fetch_assoc($mysql)){
		 	$data[] = $row;
			}
			$return=array('status'=>'success','count'=>$count,'data'=>$data);
			echo json_encode($return);
		}else{
			 $return=array('status'=>'not found','count'=>$count,'data'=>$data);
			 echo json_encode($return);
		}
	}	
?>

【问题讨论】:

  • 你到底面临什么问题?
  • 你为什么不在这里使用连接查询而不是嵌套循环?
  • @TirthPatel 你错了!有 php5-mysqlnd 扩展来保持对旧代码的支持。必须同意大多数应用程序中的此类代码不仅仅是 PDO。
  • @Wobbles 告诉这个解决方案,如何编写连接查询。
  • 查看task 表,其中id=>1 数据存在2 次?

标签: php php-5.5


【解决方案1】:

正如@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);

欲了解更多信息,请查看mysql-using-joins

【讨论】:

  • 这行不通,因为@yuvi 具有一对多的数据结构。加入将有助于一对一的情况。
  • 我知道,但是在这个答案中,您将获得一个巨大的数据响应,其中所有数据都在一行中。这不是最佳的。在大多数框架中,当 Model 获取相关的东西时,都有预先加载的原则。
  • 因为,您的 DB 表中存在多个具有相同 ID @yuvi'的数据
【解决方案2】:

只需使用内部连接,因此您不必迭代员工 ID

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

【讨论】:

  • 我的任务表总共有 3 行,所以你的代码将返回 3 次
  • @yuvi 会返回 3 行一次。
【解决方案3】:

1) 您必须使用第一个查询收集emp_ids

2) 然后通过WHERE IN ()获取所有任务

3) 将所有任务收集到数组中

4) 你可以输出一次json_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
));       

在 JS 中你会像这样使用它们(这是为了不合并字段名称):

for(var r in records) {
  var record = records[r];
  console.log(record.task, record.taks_employee);
}

【讨论】:

  • 得到这样的错误 警告:mysql_fetch_assoc() 期望参数 1 是资源,在 /home/srisanka/public_html/cupid/TV/php/ 中给出的布尔值department-check.php20 行
    {"status":"success","count":0,"data":[]}
  • 只需复制并粘贴您的代码,但我仍然遇到同样的错误
  • 未知列'AE098'在'where子句'
  • AE098 是 emp_id 或 t_assign_to
  • 您没有告诉任何人您的 emp_id 为 varchar 类型。现在它已经修复了。
【解决方案4】:

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

<?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);
?>

【讨论】:


  • 警告:mysql_num_rows() 期望参数 1 是资源,在 /home/srisanka/public_html/cupid/TV/php/ 中给出的布尔值department-check.php10 行

    警告:mysql_fetch_assoc() 期望参数 1 是资源,布尔值在 10
    b>/home/srisanka/public_html/cupid/TV/php/department-check.php 第 12 行
    {"status":"not found","count ":null,"data":[]}
  • 您可以使用 mysql_error() 来查找错误。我通过错误检查更新了我的答案,以便您找到问题。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
相关资源
最近更新 更多