読者です 読者をやめる 読者になる 読者になる

【PHP】PDOの型指定

PHP

PDOでプリペアードステートメントを使ってDB操作をしていて、
OFFSET と LIMIT に値をバインドできなかった。
エラーになる。

$sql = "SELECT * FROM test LIMIT :limit OFFSET :offset";

$db = $this->connectDb();
$stmt = $db->prepare($sql);
$stmt->bindValue(':offset', $_offset);
$stmt->bindValue(':limit', $_limit);

if(!$stmt->execute()){
    echo 'error';   //ここでエラーになる。
}

$results = array();
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
    $results[] = $result;
}

これは PDO::bindValue() でバインドする値に対して型を明示的に指定してないのが
原因だった。

なので以下のように指定する。

$stmt->bindValue(':offset', (int)$_offset, PDO::PARAM_INT);
$stmt->bindValue(':limit', (int)$_limit, PDO::PARAM_INT);

型の定数は以下に載っている。
http://php.net/manual/ja/pdo.constants.php

さらに、変数もキャストした方がいい。