PHP Mysqli语句返回单行,-1行受影响,没有错误

时间:2012-09-24 17:22:59

标签: php mysqli

这太令人困惑了,我必须遗漏一些简单的东西。我有一个查询,检查我正在插入的事务是否已经存在,以防止重复。这是代码:

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()语句中添加了一个print,它会打印一行的数据

- 如果我将获取的行存储到数组中并计算结果,则为1

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

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

2 个答案:

答案 0 :(得分:3)

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

我添加了$ dupSelectStmt-> store_result();我能够拨打$ dupSelectStmt-> num_rows和$ portableDB-> affected_rows,他们都显示了我知道应该看到的24个。

答案 1 :(得分:0)

您需要使用$dupeSelectStmt->num_rows()来获取SELECT结果集中的行数。您需要在affected_rows对象上调用num_rows()(对于INSERT,DELETE,UPDATE)或mysqli_stmt,而不是在数据库句柄($portableDB)上,因为您正在进行