25

Mysqlクエリに追加PDO::PARAM_INTまたは意味がありますか?PDO::PARAM_STR

$sql  = 'SELECT TagId FROM tagthread WHERE ThreadId = :ThreadId';

$stmt = $this->db->prepare($sql);
$stmt->bindParam(':ThreadId', $threadid, PDO::PARAM_INT);

$stmt->execute();
4

3 に答える 3

1

編集:依存します!以下の常識的なコメントを参照してください。

値が整数の場合は、整数として扱う必要があります。これをできるだけ多くのデータ型に適用します。

PDO::ATTR_EMULATE_PREPARES の属性を false に設定しないと、厄介なエラーが発生します。

固体の例:

$stmt = $dbh->prepare("SELECT * FROM table123 WHERE raw_field = :field LIMIT 1 OFFSET :offset;");
$stmt->bindParam(':field',  $field);
$stmt->bindParam(':offset', $offset);

if ($map_stmt->execute())
{
    $data = stmt->fetch(PDO::FETCH_ASSOC);
}
else
{
    echo 'Error :';
    echo '<pre>';
    print_r($map_stmt->errorInfo());
    print_r($map_stmt->debugDumpParams());
    echo '</pre>';
}

以下を含む厄介なエラーが返されます。

エラー コード: 1064 SQL 構文にエラーがあります。1 行目の「0」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

クエリ: SELECT * FROM table123 WHERE raw_field = 'home' LIMIT 1 OFFSET '0'

これを整数として扱うと、文字列が削除されてしまいます (例: ' ')。

$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);

手短に:

選んで!厳密なデータかどうか..

于 2016-05-06T15:36:53.227 に答える
-4

PDO でサポートされているすべてのドライバーについてはわかりませんが、mysql の場合、PDO::PARAM_INTほとんどの場合使用しなくても問題ありません。

bindParamしたがって、多数の呼び出しでコードを肥大化させても意味がありません。原則として、変数を に直接送信するだけですexecute()

$sql  = 'SELECT TagId FROM tagthread WHERE ThreadId = ?';
$stmt = $this->db->prepare($sql);
$stmt->execute([$threadid]);

ここで、$threadid変数は文字列として静かにバインドされますが、mysql がそれをデータベースに格納されている整数値と比較する単一の問題は発生しません。実際には、誰もがこのように行っており、何の問題もありません。

句の文字列型 bindnig の問題はLIMIT、エミュレーション モードを OFF に切り替えることで簡単に解決できます。

PDO::PARAM_INT value をキャストしないことに注意してください。このモードを使用して文字列型の値をバインドしようとしている場合、明示的に type を に設定しても、文字列としてバインドされPDO::PARAM_INTます。このモードは、実際には整数値にのみ適用されます。

ただし、整数を明示的にバインドしたいエッジケースはほとんどありません。

  • BIGINTまたはのような特殊なカラム タイプは、BOOLEAN正確なタイプのオペランドをバインドする必要があります (BIGINT 値を PDO::PARAM_INT にバインドするには、mysqlnd ベースのインストールが必要であることに注意してください)。
  • 一部の DBA は、重要なクエリ プランを使用した複雑なクエリは、不適切なオペランド タイプの影響を受ける可能性があると主張しています。まだ誰も検証可能な例を提供していませんが

他のすべての問題は緩い型付けに共通しており、mysql も PDO バインディングもそれらに特別な影響を与えません。

また、起こりうる問題を回避するために、データに適した列タイプを選択する必要があります。たとえば、大きな整数の場合は を使用する必要がありますがBIGINT、価格のようなデータの場合は にする必要がありますDECIMAL。そして、比較の問題は1つもありません。

于 2013-11-03T09:14:23.780 に答える