You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDO连接Firebird 2.5与PHP7.3:临时表无法正常使用问题

问题排查与解决

首先,你的代码里存在明显语法错误:$pdo->->exec多了一个箭头,应改为$pdo->exec,这会导致代码无法正常执行。如果实际运行的代码已修正该问题,再看以下核心排查点:

核心问题分析与解决方案

  • 确保临时表属于当前连接
    临时表是数据库连接级别的资源,只有创建它的连接能访问。如果LISTEREF2是在另一个PDO实例、或之前的连接会话中创建的,当前$pdo连接无法读取到数据。必须保证在同一个$pdo连接内,先创建临时表,再执行插入和查询操作。

  • 验证事务内的可见性
    虽然同事务内的操作默认应该互相可见,但可以尝试去掉事务包裹测试,或者在插入后手动提交事务($pdo->commit())再查询,排查是否因事务未提交导致的隐性问题。

  • 确认插入操作的真实性
    不要只依赖exec()返回的受影响行数,可通过执行SELECT @@ROW_COUNT来验证实际插入的行数,避免因语法隐性错误导致的返回值误导。同时开启PDO的异常错误模式,让隐性错误直接暴露:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  • 修正后的测试代码
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    $pdo->beginTransaction();
    // 先确保临时表存在(如果未提前创建)
    $pdo->exec("CREATE TEMPORARY TABLE IF NOT EXISTS LISTEREF2 (DATA VARCHAR(255))");
    // 修正后的插入语句
    $affected = $pdo->exec("INSERT INTO LISTEREF2 (DATA) VALUES ('foo1')");
    // 验证插入行数
    $stmt = $pdo->query("SELECT @@ROW_COUNT as inserted");
    $inserted = $stmt->fetch(PDO::FETCH_ASSOC);
    logIt("实际插入行数:".$inserted['inserted']);
    
    $sth = $pdo->query('SELECT r.* FROM LISTEREF2 r');
    $rowTable = $sth->fetchAll(PDO::FETCH_ASSOC);
    logIt('查询结果:'.print_r($rowTable, true));
    
    $pdo->commit();
} catch (PDOException $e) {
    $pdo->rollBack();
    logIt('错误信息:'.$e->getMessage());
}

内容的提问来源于stack exchange,提问作者ARIS Dév

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:30:54