0

以下のコードを使用すると、「未定義のメソッドstdClass :: fetchObject()を呼び出す」というエラーが発生します。

function getProdDetails2SaveInInvoice($data) {

    global $dbh;

    try {
        $sth=$dbh->prepare("
        SELECT
            AES_DECRYPT('alt_id', ?),
            AES_DECRYPT('prod_name', ?),
            AES_DECRYPT('prod_desc', ?)
         FROM
            products
        WHERE
        prod_id = ?
    ");

        $sth->execute($data);
        $rs = $sth->query(PDO::FETCH_ASSOC);

        return $rs;
    }

    catch(PDOException $e) {
        echo  "Something went wrong. Please report this error.\n";
        file_put_contents(
            $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
            "\n\nScript name : ".SCRIPT."\nFunction name : ".__FUNCTION__."\n".
            $e->getMessage(), FILE_APPEND);

        throw new failedTransaction();
    }
}

$data = array(
    DBKEY,                  /* field 1                  */
    DBKEY,                  /* field 2                  */
    DBKEY,                  /* field 3                  */
    $prodid             /* comparison               */
);
$rs = getProdDetails2SaveInInvoice($data);

while ($row = $rs->fetchObject()) {
    echo $row->prod_name;
}

残念ながら、これは機能せず、上記のエラーを返します。

$ dbhデータベース接続が機能していることを確認できます。これは、挿入と更新で機能しているのと同じ接続であるためです。ありがとう。

アップデート

これは、以下の提案に基づいてコードを修正した方法ですが、それでも何も返されません。

try {
    $dbh    = new PDO("mysql:host=".CO_DB_HOST.";dbname=".CO_DB_NAME, CO_DB_UNAME, CO_DB_PWORD);

    $dbh    ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch(PDOException $e) {
    echo $e->getMessage();
}

function getProdDetails2SaveInInvoice($data) {

    global $dbh;

    try {
        $sth=$dbh->prepare("
        SELECT
            AES_DECRYPT('alt_id', ?),
            AES_DECRYPT('prod_name', ?),
            AES_DECRYPT('prod_desc', ?)
         FROM
            products
        WHERE
            prod_id = ?
    ");

        $sth->execute($data);

        while ($row = $sth->fetchObject()) {
            // PROCESS ROW
            $rs = array($row->alt_id, $row->prod_name, $row->prod_desc);
        }
        return $rs;
    }

    catch(PDOException $e) {
        echo  "Something went wrong. Please report this error.\n";
        file_put_contents(
            $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
            "\n\nScript name : ".SCRIPT."\nFunction name : ".__FUNCTION__."\n".
            $e->getMessage(), FILE_APPEND);

        throw new failedTransaction();
    }
}

// Fetch additional info from invoice_products.
$data = array(
    DBKEY,                  /* field 1                  */
    DBKEY,                  /* field 2                  */
    DBKEY,                  /* field 3                  */
    $prodid                 /* comparison               */
);
$rs = getProdDetails2SaveInInvoice($data);

print_r($rs);

'where'引数(19)をハードコーディングしても、結果は取得されません。ストリーミングできるようにオブジェクトで結果を取得するのが理想的だと思いますが、今は箱に入っていても嬉しいです!

データはデータベースに確実に存在し、従来のクエリを使用してプルできます。

これは、print_r($ rs)の出力です。

配列([0] => [1] => [2] =>)

4

1 に答える 1

2

プリペアドステートメントをループするのではなく、プリペアドステートメントを呼び出す必要がありますquery。プリペアドステートメントの基本的な使用法は次のとおりです。

$sth = $dbh->prepare("YOUR QUERY");
$sth->execute();
$results = array();
while ($row = $sth->fetchObject()) {
    $results[] = array(
        'alt_id' => $row->alt_id,
        'prod_name' => $row->prod_name,
        'prod_desc' => $row->prod_desc
    );
}

return $result;

$sth->fetchAll()別の方法として、クエリの結果であるすべての行を含む配列を返すを使用することもできます。PDOStatement:: fetchAll()を参照してください。

于 2012-12-05T23:06:08.393 に答える