4

这太令人费解了,我一定错过了一些简单的东西。我有一个查询来检查我插入的事务是否已经存在,以防止重复。这是代码:

function isaDupe($portableDB, $transactArray)
{
    $ref = $transactArray["reference"];
    $date = $transactArray["qdate"];
    $time =  $transactArray["time"];

  //prints the query so I can run by hand to test
    print "SELECT `counter` FROM transactions WHERE (`reference` = '$ref' AND `qdate` = '$date' AND `time` = '$time') ";

    if ($dupeSelectStmt = $portableDB->prepare("SELECT `counter` FROM transactions WHERE (`reference` = ? AND `qdate` = ? AND `time` = ?)"))
    {
        $dupeSelectStmt->bind_param('sss',$ref, $date, $time);
        $dupeSelectStmt->bind_result($counter);
        $dupeSelectStmt->execute();

        while ($dupeSelectStmt->fetch())
        {
            break;
        }

        $numRows = $portableDB->affected_rows;

        if ($numRows > 0)
            return TRUE;
        else if ($numRows == -1)
        {
            print " ERROR: ";
            print_r($portableDB->error);
            print_r($dupeSelectStmt->error);
            return FALSE;
        }
        else
            return FALSE;
    }
}

- 如果我在同一台服务器上通过 Workbench 手动运行查询,我会返回 24 行。

-- 如果我手动准备、设置和执行语句,这也是一样的。

-affected_rows 返回 -1

--如果我对语句执行 num_rows 也是一样

-Statement 或 MySQLi 对象上没有存储错误。

- 如果我在 fetch() 语句中打印,它会打印一行的数据

- 如果我将获取的行存储到一个数组中并计算结果,它是 1

- 我试过分别用每个变量运行它,同样的事情。

- 同一台服务器上的其他查询(哎呀,在同一个 MySQLi 对象上)工作正常。选择、更新和插入。

4

2 回答 2

3

答案是我忘记在 mysqlistmt::execute() 之后调用 mysqlistmt::store_result。

一旦我添加了 $dupSelectStmt->store_result(); 我能够调用 $dupSelectStmt->num_rows 和 $portableDB->affected_rows 并且它们都显示了我知道我应该看到的 24。

于 2012-09-25T15:59:40.370 回答
0

您需要使用$dupeSelectStmt->num_rows()来获取 SELECT 的结果集中的行数。您需要调用affected_rows(对于 INSERT、DELETE、UPDATE)或不在数据库句柄 ( )num_rows()上的对象,就像您当前正在做的那样。mysqli_stmt$portableDB

于 2012-09-24T17:34:17.433 回答