Php 联接查询中的PDO异常
我整个上午都在做这个,我不明白为什么它不起作用Php 联接查询中的PDO异常,php,pdo,odbc,Php,Pdo,Odbc,我整个上午都在做这个,我不明白为什么它不起作用 $spn = '20275096'; $dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)}; Dbq=".realpath('exported/test1.mdb')."; Uid=Admin"); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $
$spn = '20275096';
$dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)}; Dbq=".realpath('exported/test1.mdb')."; Uid=Admin");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare(" SELECT Cup_PartUpdateCommodityID FROM Cup_PartUpdateCommodity
INNER JOIN Cup_PartUpdateInfo ON
[Cup_PartUpdateCommodity].Cup_PartUpdateCommodityID = [Cup_PartUpdateInfo].Cup_PartUpdateCommodityID
INNER JOIN Cup_PartUpdate ON
[Cup_PartUpdateInfo].Cup_PartUpdateID = [Cup_PartUpdate].Cup_PartUpdateID
WHERE [Cup_PartUpdate].PartNum = :partnum ");
$stmt->bindParam(':partnum', $spn);
$stmt->execute();
$row = $stmt->fetch();
echo $row['Cup_PartUpdateCommodityID'];
它抛出以下错误:
致命错误:未捕获的异常“PDOException”带有消息
'SQLSTATE[42000]:语法错误或访问冲突:-3100
[Microsoft][ODBC Microsoft Access驱动程序]语法错误(缺少
查询表达式中的运算符)
“[Cup\u PartUpdateCommodity].Cup\u PartUpdateCommodityID”=
[Cup\u PartUpdateInfo].Cup\u PartUpdateCommodityID内部联接
在[Cup\u PartUpdateInfo].Cup\u PartUpdateID上更新Cup\u PartUpdate=
[Cup\u PartUpdate].Cup\u PartUpdateID'。(SQLExecute[-3100]at
c:\sites\myproject\test.php:31中的ext\pdo_odbc\odbc_stmt.c:254)”
堆叠
跟踪:#0 C:\sites\myproject\test.php(31):PDOStatement->execute()#1
{main}在第31行的C:\sites\myproject\test.php中抛出
注意:上面的代码将在期望$spn作为参数的函数中执行。现在我正在为$spn设置一个默认值。有人吗?终于找到了基于的解决方案 事实证明,MS Access的连接需要这样做:
A JOIN (
B JOIN C ON <condition_BC>
) ON <condition_AB>
我知道Access会以意想不到的方式做一些事情—您需要在表名周围加上方括号吗?如果不需要的话,我建议把它们拿出来。我两种方法都试过了,结果都一样。值得一试。在这种情况下,您可以在调试时尝试简化语句吗?保留其中一个内部连接并移除另一个,看看是否有效?
A JOIN B ON <condition_AB>
JOIN C ON <condition_BC>
$dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)}; Dbq=".realpath('exported/test1.mdb')."; Uid=Admin");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare(" SELECT * FROM Cup_PartUpdateCommodity
LEFT JOIN (
Cup_PartUpdateInfo LEFT JOIN Cup_PartUpdate ON Cup_PartUpdateInfo.Cup_PartUpdateID = Cup_PartUpdate.Cup_PartUpdateID
) ON Cup_PartUpdateCommodity.Cup_PartUpdateCommodityID = Cup_PartUpdateInfo.Cup_PartUpdateCommodityID
WHERE Cup_PartUpdate.PartNum = :partnum ");
$stmt->bindParam(':partnum', $spn);
$stmt->execute();
$row = $stmt->fetch();
echo $row['Cup_PartUpdateCommodityID'];