2

pgSQL のプリペアド ステートメントを紹介しながら、いくつかのクエリの結果を返すことに成功しました。ただし、いくつか質問があります。

次のクエリがあるとします。

$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();

main_products_common_dimensionsテーブルの列が であっても、character_varying使用すると同じ/正しい結果セットが返されることに気付きました

$w_ft = 36; 
...
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT);

$w_ft = "36"; 
...
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_STR);

$w_ft = "36"; 
...
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT);

$w_ft = 36; 
...
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_STR);

つまり、どのようにパラメーターをバインドし_INTたり_STR、変数 (整数または文字列) を設定したりしても、データは正しく返されます。これは正常な動作ですか?

http://php.net/manual/en/pdostatement.bindparam.phpから、パラメーターのデータ型が説明されていることがわかります

PDO::PARAM_* 定数を使用したパラメーターの明示的なデータ型。ストアド プロシージャから INOUT パラメーターを返すには、ビットごとの OR 演算子を使用して、data_type パラメーターの PDO::PARAM_INPUT_OUTPUT ビットを設定します。

「ストアド プロシージャから INOUT パラメータを返す」とはどういう意味ですか? これは関連していますか?これは、ストアド プロシージャを使用していないことを意味しますか? 長さはオプションのようですが、説明には示されていません。提供するメリットはありますか?

ご覧のとおり、私はこれにまったく慣れておらず、頭を悩ませようとしています。どうもありがとうございました

4

3 に答える 3

4

PDO::PARAM_INTPDO::PARAM_STR渡されるbindParam()と、ドライバーが自由に無視できることを示します。

PDO pg ドライバーのソース コードを見ると、特別に扱われるものを除いてPDO_PARAM_LOB、すべての型が文字列として引用されているようです (つまり、引用符の間で libpq のPQescapeStringConn関数に渡されます) 。

PDO::ATTR_EMULATE_PREPARESまた、内部で使用されるメソッドを制御する属性にも注意する必要があります。falsePQprepare()実際のクエリ外パラメータとともに使用されている場合。の場合true、パラメーター値は、パラメーター化されていない に渡される SQL に挿入されますPQexec()。技術的には、これはかなり異なるため、この属性に応じてコーナー ケースまたはエラー ケースで異なる動作が見られる場合があります。

于 2013-01-22T19:01:30.390 に答える
2
$w_ft = 36; 
...
$sth->bindParam(':w_ft', $theId, PDO::PARAM_INT);

する必要があります

$w_ft = 36; 
...
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT);
于 2013-01-22T15:44:11.757 に答える
1

これはpostgres、整数列と比較するときに整数の引用を受け入れるためです。

したがって、id 列が int の場合、これらのクエリはどちらも同じように機能します。

SELECT * FROM mytable WHERE id = 1;
SELECT * FROM mytable WHERE id = '1';

定数が行うことは、PDO::PARAM_*値に対して引用/エスケープが行われる方法を変更することであり、値のデータ型とは無関係です。PHP は、必要に応じて型変換も行います。選択PDO::PARAM_INTすると、$id の値が整数であり、整数としてエスケープする必要があることを DBMS ドライバーに伝えているため、値をクエリに入れるときに引用符が追加されません。

$id = 1;
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id");
$sth->bindParam(':id', $id, PDO::PARAM_INT);
// resulting query would be SELECT * FROM mytable WHERE id = 1;

$sometext = "hello";
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id");
$sth->bindParam(':id', $sometext, PDO::PARAM_INT);
// in this case, $sometext will be casted to an integer, that will result in (int)0
// resulting query would be SELECT * FROM mytable WHERE id = 0;

$sometext = "hello";
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id");
$sth->bindParam(':id', $sometext, PDO::PARAM_STR);
// in this case, $sometext is already a string, and strings should be quoted
// resulting query would be SELECT * FROM mytable WHERE id = 'hello';

また、 の INOUTbindParamパラメーターについては、ストアド プロシージャの INOUT または OUT パラメーターを使用しない場合 (たとえば、関数内で設定されているよりも関数呼び出しへの参照を渡す場合など) は、おそらく を使用した方がよいでしょうbindValue。関数の結果または任意の定数値をバインドする値として使用bindValueできるため、変数を配置する必要はありません。

$sth->bindValue(':something', 5);
$sth->bindValue(':something_else', $foo->bar());
于 2013-01-22T16:08:16.460 に答える