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行分のデータが出力されます

-フェッチした行を配列に格納して結果をカウントすると、1になります。

-同じことを、各変数で個別に実行してみました。

-同じサーバー(つまり、同じMySQLiオブジェクト)上の他のクエリは正常に機能しています。SELECTS、UPDATES、およびINSERTS。

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 に答える