5945


UNIONを使ったSELECT文で、プレースホルダーを使用すると、syntaxエラーになってしまいます。

プレースホルダーを使わない、以下のコードではエラーがでません。

[code]

      function getContents($page)
      {
        $limit = 3;
        $offset = $limit * $page - $limit;
    
        $sql = "(SELECT * FROM casper LIMIT 3 OFFSET 0) UNION ALL
                (SELECT * FROM gasper LIMIT 3 OFFSET 0) UNION ALL
                (SELECT * FROM jasper LIMIT 3 OFFSET 0) UNION ALL
                (SELECT * FROM masper LIMIT 3 OFFSET 0) UNION ALL
                (SELECT * FROM rasper LIMIT 3 OFFSET 0)
                ORDER BY title ASC";
    
        $stmt = $this->dbh->prepare($sql);
    
        $stmt->execute();
    
        return $stmt->fetchAll();
      }
    
[/code]

しかし、以下のコードはエラーになります。

[code]

      function getContents($page)
      {
        $limit = 3;
        $offset = $limit * $page - $limit;
    
        $sql = "(SELECT * FROM casper LIMIT :limit OFFSET :offset) UNION ALL
                (SELECT * FROM gasper LIMIT :limit OFFSET :offset) UNION ALL
                (SELECT * FROM jasper LIMIT :limit OFFSET :offset) UNION ALL
                (SELECT * FROM masper LIMIT :limit OFFSET :offset) UNION ALL
                (SELECT * FROM rasper LIMIT :limit OFFSET :offset)
                ORDER BY title ASC";
    
      　    $stmt = $this->dbh->prepare($sql);
    
        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();
    
        return $stmt->fetchAll();
      }
    
[/code]

エラー内容は以下です。

[code]

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3' OFFSET '0') UNION ALL
                (SELECT * FROM jasper LIMIT '3' OFFSET '0' at line 2' in /var/www/html/class/Jk.php:51
    Stack trace:
    #0 /var/www/html/class/Jk.php(51): PDOStatement->execute()
    #1 /var/www/html/index.php(5): Jk->getVideos(1)
    #2 {main}
      thrown in /var/www/html/class/Jk.php on line 51
    
[/code]

プレースホルダーを使っても、結果的にはプレースホルダーを使わず、値を直接している方法と同じになるはずだと思うのですが、なぜエラーになるのでしょうか？

環境に以下になります。

CentOS 6.6  
PHP 5.3.3  
MySQL 5.1.73

よろしくお願いします。


CC BY-SA 3.0
2015-02-04T06:42:11.580
5925
2015-02-04T11:11:07.053
question
php mysql
UNIONを使ったSELECT文で、プレースホルダーを使用すると、syntaxエラーになってしまいます。


エラーになるのはメッセージにある実SQLの

> SELECT * FROM jasper LIMIT '3' OFFSET '0'

に含まれる`LIMIT`および`OFFSET`での文字列型からの暗黙変換が許可されていないからです。

なのでheliac2001さんの言うように`intval($limit)`とか`(int)$limit`で明示的に変換すれば数値扱いになるかもしれません。


CC BY-SA 3.0
2015-02-04T11:11:07.053
5945
2015-02-04T11:11:07.053
5750
5925
answer