【问题标题】:INNER JOIN not working with PHP PDO MySQLINNER JOIN 不适用于 PHP PDO MySQL
【发布时间】:2012-02-03 20:13:31
【问题描述】:

试图让 INNER JOIN 工作让我发疯了,所以我非常希望有人能在这里帮助我。

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

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 表时,它在共享服务器上是否重要?我不认为它应该从我能读到的,但你永远不知道。

【问题讨论】:

  • fetchAll 电话在哪里?

标签: php pdo inner-join


【解决方案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 = new PDO("mysql:host=localhost;dbname=yourDBName", 'root', 'pass', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") );

我希望这会有所帮助。

【讨论】:

  • 感谢您的尝试,但它会导致 $db->setAttribute 行出现致命错误:致命错误:在 /hermes/bosweb26a 中的非对象上调用成员函数 setAttribute() /b1552
  • 听起来你的 PDO 模块没有加载!
  • 这意味着您没有连接到数据库。查找 PHP 警告和错误;仔细检查您的主机、数据库、用户和通行证;确保您的 mysql 服务器甚至正在侦听外部端口;确保你们之间没有防火墙。
  • 主要应用!这对我来说很愚蠢。复制现有数据库连接代码,因此数据库句柄命名不同。此代码现在可以使用。非常感谢大家。
【解决方案2】:

我的预感:有大量员工,而 fetchAll() 超出了某个内存阈值。您的 SQL 查询将获取每个部门_employeebranch_employee 映射,但只有 EmpID 字段,这似乎不是很有用。这就是你想要的吗?

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

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

现在,直接针对数据库启动 MySQL 客户端(即不通过 PHP)并确认您获得了预期的结果。

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

另外,为了测试,尝试限制结果集并查看它是否修复它(不确定 LIMIT 的 PDO 语法是什么,但在 MySQL 中它会是 'LIMIT 30')

【讨论】:

  • 限制没有“PDO 语法”,它只是附加到查询字符串。
  • 感谢您的尝试,但每个表中只有少数记录(20 条以下)。
【解决方案3】:

听起来您的 PDO 模块安装不正确,我们的 PDO 构建工作不正常。

使用phpinfo() 检查第一个问题,然后检查第二个问题:

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

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2015-11-29
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2023-01-31
    • 2023-03-12
    相关资源
    最近更新 更多