0

PHP PDO を使用してクエリを構造化するこれら 2 つの方法は、どちらも同じデータを返すことに気付きました。

//prepare with $dbh->prepare
$w_ft = "36"; 
$sth = $dbh->prepare("SELECT * FROM main_products_common_dimensions WHERE w_ft = :w_ft");
$sth->bindParam(':w_ft', $theId, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll(); //PHP array of data


//prepare with pg_prepare()
$result = pg_prepare($con, "my_query", 'SELECT * FROM main_products_common_dimensions WHERE w_ft = $1');
$result = pg_execute($con, "my_query", array("48")); //A query result resource on success or FALSE on failure.
while ($row = pg_fetch_assoc($result)){
    echo $row['w_ft'] . "<BR>"; 
}

http://php.net/manual/en/function.pg-execute.phpで、2 番目の方法が「成功した場合はクエリ結果リソース、失敗した場合は FALSE」を返すことを読みました。そこで、pg_fetch_assoc() を使用して反復処理を試みました。pg_それは機能しますが、残りのSQL関数と一緒に廃止されていませんか? クエリの結果を確認するために、PDO で何かを使用する必要がありますか?

このため、私は PDO を使用している間は最初の方法を使用する傾向があります。これは標準ですか?

私の質問は、複数の値をいずれかの方法に送信する方法です。準備済みステートメントに配列を送信しようとすると、どちらの方法も機能しません

$w_ft = array("48", "36"); 


$result = pg_execute($con, "my_query", array("48", "36"));

このようにして、複数の値をクエリに送信できたと思いました。これどうやってするの?

ありがとうございました

4

2 に答える 2

1

実行配列を間違っているようです。後続の実行ではなく、1 回の実行のみの値を取ります。
したがって、値の数はプレースホルダーの数と同じにする必要があります。
だからそうなるのです

$sql = 'SELECT * FROM table WHERE w_ft = $1 OR w_ft = $2 OR w_ft = $3'

あなたのためのarray("48", "36", "12")

私は PG ユーザーではないので、いくつかの構文を混乱させる可能性があります。

于 2013-01-22T16:24:50.653 に答える
0

PDO は、PHP 用の不可知論的データベース アクセス API です。これは、データベースが何であれ、同じオブジェクトとメソッドを使用してクエリを実行し、結果を取得できることを意味します。PDO は、PHP におけるデータベース抽象化レイヤーへの第一歩でした。

pg_* API は、残念ながら非推奨になる予定はなく、Postgres 専用です。また、PDO に実装されていない関数 (バイナリ エスケープやイベント通知関数など) も含まれています。

PDO と専用ライブラリのどちらを選択するかは、多くの場合、コントローラー コードで使用するモデル マネージャーの選択によって隠されます。ORM (Doctrine、Propel など) のような抽象化レイヤー上のオブジェクト リレーショナル マッパー、または Pomm のような Postgresql 専用のオブジェクト モデル マネージャー (OMM) のいずれかです。

どちらの方法でも、ステートメントを準備したり、列の種類や結果のカーソルを管理したりする必要はありません (ちなみに、を使用PDO::fetch_all()するとすべての結果がメモリにダンプされます)、データベース層がそれを処理します。上記のクエリは次のように記述されます。

// Using Pomm
// SELECT * FROM main_products_common_dimensions WHERE w_ft = ?
// Returns a MainProductsCommonDimensions instance

$object = $connection
    ->getMapFor('\Database\Schema\MainProductsCommonDimensions')
    ->findWhere('w_ft = ?', array(48))
    ->current(); // fetch only the first result.

ORM と OMM の両方が便利なクエリ ビルダーを提案していることに注意してください。

$where = \Pomm\Query\Where::createWhere('w_ft = ?', array(48))
    ->orWhere('w_ft = ?', array(12))
    ->orWhere('w_ft = ?', array(66));

// which is pretty much the same as
$where = \Pomm\Query\Where::createIn('w_ft', array(48, 12, 66));

// SELECT * FROM main_products_common_dimensions WHERE w_ft IN (?, ?, ?);
$collection = $connection
    ->getMapFor('\Database\Schema\MainProductsCommonDimensions')
    ->findWhere($where); // Return an Iterable cursor over results

// display 48, 12 and 66 fetching one result at the time in memory:
foreach($collection as $object)
{
    printf("W_FT = '%d'.\n", $object['w_ft']);
}

PDO の上でこれらのレイヤーを使用すると、多くの利点が得られます。主な利点は、奇妙な API を処理する代わりに、必要なものに集中できることです (はい、PDO は PHP のほとんどすべてのライブラリと同様に奇妙です)。さらに、PDO は単なるアクセス レイヤーであるため、結果は文字列の配列 (バイナリかどうかに関係なく) として返されます。Postgres のブール値は 't' と 'f' であるため、使用するには PHP の適切なブール (sic) 型に変換する必要があります。ORM と OMM はそのような変換メカニズムを提案しており、Postgres 専用の Pomm は配列、HStore、LTree、幾何学的および複合型の変換などもサポートしています。

于 2013-01-24T09:55:30.620 に答える