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();
編集:依存します!以下の常識的なコメントを参照してください。
値が整数の場合は、整数として扱う必要があります。これをできるだけ多くのデータ型に適用します。
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);
手短に:
選んで!厳密なデータかどうか..
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 ベースのインストールが必要であることに注意してください)。他のすべての問題は緩い型付けに共通しており、mysql も PDO バインディングもそれらに特別な影響を与えません。
また、起こりうる問題を回避するために、データに適した列タイプを選択する必要があります。たとえば、大きな整数の場合は を使用する必要がありますがBIGINT
、価格のようなデータの場合は にする必要がありますDECIMAL
。そして、比較の問題は1つもありません。