使用PDO执行基于另一个查询结果的查询的函数

时间:2018-03-04 04:06:35

标签: php mysql pdo odbc

我目前正在使用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错误。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的查询工作正常(除了其他答案/评论所说的)。您的问题实际上是在ODBC数据库的rowCount()查询上使用SELECT。来自the manual

  

使用odbc_num_rows()确定SELECT之后可用的行数将返回-1并包含许多驱动程序。

因此,如果您需要计数,则需要选择COUNT(*)作为字段,然后查看值:

while($row = $ordStat->fetch(PDO::FETCH_ASSOC))
{
    echo $row['order_id'] . $row['order_status'] . $row['is_placement'] . $row['date_updated'] . "\n";

    $detailStatCheck = '
        SELECT 
            COUNT(*)
        FROM GPORPCFL
        WHERE invnoc = ?
    ';

    try {
        $detailCheck = $DB2conn->prepare($detailStatCheck);
        $detailRslt = $detailCheck->execute(['order_id']);
        $count2 = $detailCheck->fetch()[0]; // <---- correct count
    }
        catch(PDOException $ex)
    {
        echo "QUERY FAILED!: " .$ex->getMessage();
    }
}