71450


**前提・実現したいこと**

PHPで店舗検索の機能が以前実装されており、今回バージョンが上がったローカル環境下で動くか確認したところ、  
下記のエラーが発生しております。  
エラーがどこで起きているのか、教えていただきたいです。

**発生しているエラーメッセージ**

[code]

    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 
    check the manual that corresponds to your MariaDB server version for the right syntax to use 
    near ''0', '20'' at line 1
    
[/code]

**該当のソースコード**

[code]

        /**
         * お店情報を取得
         *
         * @param  Nagi_DB $db     データベースオブジェクト
         * @param  integer $start  開始
         * @param  integer $length 取得数
         * @param  array   $cond   取得条件
         * @return array お店情報を格納した配列
         * @throws データベースとのやり取りに失敗
         */
        public static function get($db, $start, $length, $cond = array())
        {
            try {
                $params = array();
                $table = ABAHOUSE_Shop_DB::getTableName(self::$_language, 'shop');
                $sql = 'SELECT DISTINCT * FROM `' . $table . '` ';
                if ($cond) {
                    $sql .= 'WHERE ';
                    $where = '';
                    foreach ($cond as $k => $t) {
                        if ($where) {
                            $where .= 'AND ';
                        }
                        if ($k === 'area') {
                            if (!is_array($t)) {
                                $where .= '`area_id` = ? ';
                                $params[] = ABAHOUSE_Shop_Area::getId($db, $t);
                            } else
                            {
                                $tmp = '';
                                foreach ((array)$t as $v) {
                                    $tmp .= '?,';
                                    $params[] = $v;
                                }
                                $where .= '`area_id` IN (' . trim($tmp, ',') . ') ';
                            }
                        }
                        if ($k === 'genre') {
                            $where .= 'FIND_IN_SET(?, `kind`) ';
                            $params[] = $t;
                        }
                        if ($k === 'shop') {
                            $where .= '(FIND_IN_SET(?, `category`) OR FIND_IN_SET(?, `shop_brand`)) ';
                            $params[] = $t;
                            $params[] = $t;
                        }
                        if ($k === 'brand') {
                            $where .= '(`category` LIKE ? OR `brand` LIKE ?) ';
                            $params[] = '%' . $t . '%';
                            $params[] = '%' . $t . '%';
                        }
                    }
                    $sql .= $where;
                }
                $params[] = $start;
                $params[] = $length;
    
                $sql .= 'ORDER BY `area_id` LIMIT ?, ?';
    
                $stmt = $db->prepare($sql);
                $stmt->execute($params);
                $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
                $result = array();
                if ($rows) {
                    foreach ($rows as $row) {
                        $shop = new ABAHOUSE_Shop();
                        $shop->name      = $row['name'];
                        $shop->address   = $row['address'];
                        $shop->map       = $row['map'];
                        $shop->tel       = $row['tel'];
                        //$shop->blog      = $row['blog'];
                        $shop->blog      = $row['blog'] ? explode(',', $row['blog']) : null;
                        $shop->site      = $row['site'];
                        $shop->hours     = $row['hours'];
                        $shop->shopBrand = explode(',', $row['shop_brand']);
                        $shop->kind      = explode(',', $row['kind']);
                        $shop->brand     = explode(',', $row['brand']);
                        $shop->category  = explode(',', $row['category']);
                        $result[] = $shop;
                    }
                }
                return $result;
            }
            catch (PDOException $e) {
                throw $e;
            }
        }
    
[/code]

**試したこと**

以前の環境下では問題なく、動いていますので、環境が変わったことによるコードの修正が必要のようです。  
また、DBをMariaDBからMySQLに変更しましたが、同様にエラーが発生しました。

**補足情報**

以前の環境

  * apache 2.2
  * PHP 5.1.6
  * mysql 不明
  * Linux (CentOS6.7)

現在のローカル環境

  * apache 2.4.46
  * PHP 7.4.11
  * MariaDB 10.4.14
  * Windows (XAMPP3.2.4)

※同様の質問を [teratail](https://teratail.com/questions/299421)
にてしております。そちらで解決しましたら、こちらでも共有いたします。


CC BY-SA 4.0
2020-10-21T07:30:29.517
71381
2020-10-23T05:38:30.383
2020-10-23T05:38:30.383
3060
42407
question
php linux mysql mariadb
SQLSTATE[42000]のSQL構文エラーが発生する


$db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);  
をtry文の先頭に配置したところ、動くようになりました。


CC BY-SA 4.0
2020-10-23T05:27:34.917
71450
2020-10-23T05:27:34.917
42407
71381
answer