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
相关产品推荐
相关产品推荐

