0

現在、PDO をコードに組み込んでいますが、以前は快適に作業できたのと同じタスクを達成するのが難しいと感じています。私は何かが欠けているかもしれないと感じています。誰かが次のコードに関するガイダンスを提供してもらえますか?

まず、PDO を使用するように変換した次の関数があります。

public function fetchBgnew($whr, $limit){

            $db = Core::getInstance();              
            $res = $db->dbh->prepare("SELECT p.id,p.bg,p.bg_desc,p.bg_id,p.user_id, p.pl_id,p.domainurl,p.type,p.price FROM ".USERS_BG." as p left join ".USERS." as u on p.user_id=u.id WHERE u.status !=0 and :whr :limit");
            $res->execute(array(':whr'=>$whr,':limit'=>$limit));                
            $res->fetchAll(PDO::FETCH_ASSOC);

            $cnt = $db->dbh->prepare("SELECT p.id FROM ".USERS_BG." as p left join ".USERS." as u on p.user_id=u.id WHERE u.status !=0 and :whr");
            $cnt->execute(array(':whr'=>$whr));             
            $cnt->rowCount();


            return $result = array("data"=>$res, "count"=>$cnt);
        }

次に、関数を呼び出したいのですが、以前に使用していたコードでは、次のように文字列ステートメント全体が使用されていました。

  $bgdataarr = $bgObj->fetchBgnew(" p.pl_id IN (".@implode(',',$barr).") and p.status =1 order by p.id desc", " LIMIT $limit_start,$page_records");

私は約 3 日間 PDO を使用してきましたが、準備する文字列ステートメントを渡すことができないか、少なくとも方法がわからないという印象を受けています。

1.2番目に述べた関数呼び出しを変換する適切な方法は何ですか?

2.以前のように、任意の引数を渡すことができるように関数を変換することは可能ですか?

4

1 に答える 1

1

コメントで述べたように、column:valueのペアを含む配列を取得して、それをPDOStatementパラメーターとして渡すことはできません。

あなたがしなければならないことは、ステートメント全体を動的に作成することです。

次の配列があると仮定します。

$whr = array('username' => '12345', 'password' => 'lorem ipsum');

そして、あなたはこのように見えるあなたの声明を持っています:

$stmt = $pdo->prepare("SELECT * FROM users WHERE :whr");

配列をパラメーターにバインドすると、無効なSQLが生成されます(配列を内包したため、結果が文字列になると仮定します)。

あなたがしなければならないことは、ステートメント全体を動的に作成することです。

$query[] = "SELECT * FROM users WHERE";

foreach($whr as $column => $value)
{
    $query[] = "$column = :$column";
}

$stmt = $pdo->prepare(implode(' AND ', $query));

// Naturally, you'll have to bind parameters somehow as well
foreach($whr as $column => $value)
{
    $stmt->bindValue($column, $value);
}

$stmt->execute();
于 2012-12-12T15:07:27.457 に答える