【发布时间】:2018-03-04 04:06:34
【问题描述】:
我目前正在使用 PDO 对 MySQL 表进行选择,并让它打印结果,这在终端中是正确的。
我正在尝试对其应用“while”循环,以从 odbc 数据库中选择记录,其中第一个查询中的 order_id 等于第二个查询中的 invnoc。我认为我的问题是我如何调用order_id 并执行 DB2 部分中的语句。
如果我运行这个:
$ordStatSql = 'SELECT order_id, order_status, is_placement, date_updated
FROM order_status';
try{
$ordStat = $MysqlConn->prepare($ordStatSql);
$result = $ordStat->execute();
}
catch(PDOException $ex)
{
echo "QUERY FAILED!: " .$ex->getMessage();
}
while($row = $ordStat->fetch(PDO::FETCH_ASSOC))
{
echo $row['order_id'] . $row['order_status'] . $row['is_placement'] . $row['date_updated'] . "\n";
}
它运行良好,没有错误,并且打印出我预期的每一行。
但完整的脚本:
$ordStatSql = 'SELECT order_id, order_status, is_placement, date_updated
FROM order_status';
try{
$ordStat = $MysqlConn->prepare($ordStatSql);
$result = $ordStat->execute();
}
catch(PDOException $ex)
{
echo "QUERY FAILED!: " .$ex->getMessage();
}
while($row = $ordStat->fetch(PDO::FETCH_ASSOC))
{
echo $row['order_id'] . $row['order_status'] . $row['is_placement'] . $row['date_updated'] . "\n";
$detailStatCheck = '
SELECT
invnoc as INVOICE,
fstatc as STATUS,
cstnoc AS DEALER,
framec AS FRAME,
covr1c AS COVER,
colr1c AS COLOR ,
extd2d AS SHIPDATE,
orqtyc AS QUANTITY
FROM GPORPCFL
WHERE invnoc IN ?
ORDER BY invnoc asc
';
try{
$detailCheck = $DB2conn->prepare($detailStatCheck);
$detailRslt = $detailCheck->execute(['order_id']);
$count2 = $detailCheck->rowcount();
}
catch(PDOException $ex)
{
echo "QUERY FAILED!: " .$ex->getMessage();
}
}
echo "Matches:" . $count2
它打印相同的 order_id 数字,显然需要更长的时间,但匹配显示 -1。我知道它正在拉匹配,因为我手动运行它并且它匹配每条记录。我想知道是我循环不正确还是归结为 PDO 错误。
非常感谢任何帮助。
【问题讨论】:
-
如果您不需要 IN,请尝试使用
WHERE invnoc IN (?)'或WHERE invnoc = ?而不是WHERE invnoc IN ?。这看起来也不对$detailCheck->execute(['order_id']);,我相信应该是$detailCheck->execute([$row['order_id']]); -
嗯,我做了这些更改,但我仍然得到 Matches: -1 ,但没有错误;我只是无法验证它是否匹配
-
为了测试的目的,您可以硬编码
$detailCheck->execute(['1234']);,前提是您确定此订单 ID 存在并且它总是会返回一些结果。您之前是否遇到过任何错误? -
rowCount()不能可靠地用于使用 ODBC 进行的SELECT查询。尝试做SELECT COUNT(*) FROM GPORPCFL WHERE invnoc = ? ORDER BY invnoc asc然后$count2 = $detailCheck->fetch()[0]; -
@ishegg 我在下面应用了 Bamar 的第二个解决方案,并用您的计数语法对其进行了修改,看起来它返回了正确的数字。所以它工作正常,我只是没有将它格式化为正确转储?