2012-01-06 112 views
0

试图让INNER JOIN工作让我疯狂,所以我非常希望有人能帮助我。INNER JOIN不能使用PHP PDO MySQL

我有一个数据库中的两个表:

BranchEmployees 
DepartmentEmployees 

两个表有一栏叫EmpID,所以我可以跟踪哪些员工被分配到哪个部门,哪个分支。我正在制作一份报告,查找哪些员工被分配到指定的部门和分支,排除其他所有员工,因此INNER JOIN查询似乎是合乎逻辑的解决方案,但我们无法使其工作。我们不断收到致命错误:

Fatal error: Call to a member function fetchAll() on a non-object in ... 

$query="SELECT DepartmentEmployees.EmpID FROM DepartmentEmployees INNER JOIN BranchEmployees ON DepartmentEmployees.EmpID=BranchEmployees.EmpID"; 

$connect=$cdb->query($query); 
$EmployeeList[$m]=$connect->fetchAll(PDO::FETCH_ASSOC); 

尝试使用INNER JOIN表时它在共享服务器上是否有关系?我不认为它应该来自我所能读的,但你永远不知道。

+1

哪里'fetchAll'打电话? – 2012-01-06 00:57:14

回答

1
<?php 
try { 
    $db = new PDO("mysql:host=localhost;dbname=yourDBName", 'root', 'pass', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

    $sql = 'SELECT de.EmpID FROM DepartmentEmployees as de INNER JOIN BranchEmployees as be ON de.EmpID = be.EmpID'; 

    $sth = $db->query($sql); 
} 
catch(PDOException $e) { 
    # There was an error, die 
    die('There was an error.'); 
} 

$sth->setFetchMode(PDO::FETCH_ASSOC); 
$result = $sth->fetchAll(); 

var_dump($result); 
?> 

刚改变这条线为db连接,查询应该工作;

$db = new PDO("mysql:host=localhost;dbname=yourDBName", 'root', 'pass', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

我希望这有助于。

+0

感谢您的尝试,但它在$ db-> setAttribute行上产生致命错误: 致命错误:调用成员函数setAttribute()在/ hermes/bosweb26a/b1552中的非对象 – 2012-01-06 15:36:39

+0

它的声音像你的PDO模块没有加载! – ManseUK 2012-01-06 15:43:20

+0

这意味着你没有连接到数据库。寻找PHP警告和错误;仔细检查你的主机,数据库,用户和传递;确保你的mysql服务器甚至在外部端口上监听;确保你之间没有防火墙。 – 2012-01-06 15:44:47

0

我的预感:有一个gazillion员工,fetchAll()超过了一些内存阈值。你的SQL查询将得到每一个department_employee < - > branch_employee映射,但只有empid字段,这似乎不是很有用。那是你要的吗?

我喜欢诊断SQL问题时,做的第一件事就是格式化SQL是可读的:

SELECT DepartmentEmployees.EmpID 
     FROM DepartmentEmployees 
INNER JOIN BranchEmployees 
     ON DepartmentEmployees.EmpID=BranchEmployees.EmpID 

现在,直接对数据库启动一个MySQL客户端(也就是不通过PHP)和确认你会得到你期望的结果。

如果查询在PHP PDO之外工作(它应该,如果表和字段名是正确的),那么它必须是该包装器的问题。你可以发布堆栈跟踪吗?

此外,进行测试,试图限制结果集,看看它是否修复它(不知道什么限制PDO语法,但在MySQL这将是“LIMIT 30”)

+0

没有限制的“PDO语法”,它只会附加到查询字符串。 – 2012-01-06 01:20:32

+0

感谢您的试用,但每张表(20岁以下)只有少数记录。 – 2012-01-06 15:37:44

0

听起来好像你的PDO模块安装不正确我们你的PDO结构工作不正常。

使用phpinfo()检查的第一个问题和第二如下:

try { 
    $dbh = new PDO($dsn, $user, $password); // init your connection here 
} catch (PDOException $e) { 
    die ('Connection failed: ' . $e->getMessage()); 
}