0

我是 PDO 的新手,并且已经成功地将我网站的大部分插入和更新转换为 PDO 事务,每个事务都在一个可集中访问的函数中,以实现最大程度的重用。我真的很想对SELECT语句做同样的事情,但这似乎更难!

我期望做的是:

function getProdDetails2SaveInInvoice($data) {

    global $dbh;

    try {
        $sth=$dbh->prepare("
        SELECT
            AES_DECRYPT(?, '".DBKEY,"'),
            AES_DECRYPT(?, '".DBKEY,"'),
            AES_DECRYPT(?, '".DBKEY,"')
         FROM
            products
        WHERE
            ? ? ?
    ");

        $sth->execute($data);
        $sth->fetch(PDO::FETCH_OBJ);

        return $sth;
    }

    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(
            'alt_id',           /* field 1                  */
            'prod_name',        /* field 2                  */
            'prod_desc',        /* field 3                  */
            'prod_id',          /* where                    */
            '=',                /* operator                 */
            $prodid         /* comparison               */
        );
        $rs = getProdDetails2SaveInInvoice($data);

不幸的是,这不起作用并返回错误,

错误:“在非对象上调用成员函数 execute()”。

我可以确认$dbh数据库连接正在工作,因为它与用于插入和更新的连接相同。

4

1 回答 1

1

您不能绑定字段名称。假设 DBKEY 是一个常量,您的查询应该如下所示:

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

和 $data 像这样:

$data = array(
            DBKEY, 
            DBKEY, 
            DBKEY,
            $prodid
        );
于 2012-12-05T13:23:18.290 回答