72673


すでに開発が完了し運用がされている既存サービスの、改良版の開発に途中から参加しています。ローカルPCで開発環境を整えるため、FuelPHPで作成された既存サービスのソースコードをcloneし、windows機上にインストールしたVirtual
box + vagrantを用いて以下の仮想環境を整えました。

  * CentOS 7.4
  * Apache 2.4.6
  * PHP 7.3.22
  * Microsoft SQL server 2017

DBとの接続のため、仮想環境上にmicrosoftのODBC driver 17 for SQL
serverをインストールしています。また、既存サービスの開発環境で使用されていた、DBのテストデータ (.bacpacファイル) を受け取り、SQL
Server Management Studioからデータのインポートを行いまいた。

以上のように開発環境を整えた後、`http://192.168.33.10`にアクセスしてフロントページの表示を確認できています。そこから、サービスの管理者画面に遷移するためログインを行ったところ、以下のようなエラーが出て画面遷移が完了しません。なお、遷移後の画面は、管理しているユーザのデータ一覧のようなものをDBから読み込んで表示する画面となっています。

[code]

    Fuel\Core\Database_Exception [ 42S22 (207) ]:
    SQLSTATE[42S22]: Column not found: 207 [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'N'. (SQLExecute[207] at /builddir/build/BUILD/php-7.3.22/ext/pdo_odbc/odbc_stmt.c:259) with query: "SELECT t0.id AS t0_c0, t0.grouping_id AS t0_c1, t0.watcher_id AS t0_c2,... (以下同じように続くので中略)...t2.updated_at AS t2_c15 FROM grouping_watchers AS t0 LEFT JOIN groupings AS t1 ON (t0.grouping_id = t1.id) LEFT JOIN watchers AS t2 ON (t0.watcher_id = t2.id) WHERE t2.account_id = N"
    
[/code]

エラーの中身が長くなってしまい恐縮ですが、要するに`Invalid column name
'N'`というエラーだと思っています。SQLserverでは日本語文字のインサートの際、'N'を頭に付けるということはわかりましたが、実際どうすればこのエラーが解消するのかわかりかねています。

参考:  
[SQLServerに日本語データをInsertすると文字化けする。](https://kitigai.hatenablog.com/entry/2018/05/27/010440)

情報が少なく答えにくい質問となってしまっているかもしれませんが、何か少しでもヒントになることや試してみるとよいこと等ご教示いただけると嬉しいです。よろしくお願いします。


CC BY-SA 4.0
2020-09-22T14:59:25.247
70610
2022-04-25T07:01:50.193
2020-09-23T00:03:19.900
3060
41964
question
sql-server
SQLserverからのデータ取得で「Invalid column name 'N'」になる


エラーメッセージを適当に折り返してみると

>
[code]

>     "SELECT t0.id AS t0_c0, t0.grouping_id AS t0_c1, t0.watcher_id AS
> t0_c2,... (以下同じように続くので中略)...t2.updated_at AS t2_c15
>      FROM grouping_watchers AS t0
>      LEFT JOIN groupings AS t1 ON (t0.grouping_id = t1.id)
>      LEFT JOIN watchers AS t2 ON (t0.watcher_id = t2.id)
>      WHERE t2.account_id = N"
>  
[/code]

と `""` で括られているのでSQL文が `N`
で終わっているように見受けられます。そもそもですが、日本語に関係なく、これは意図したSQL文なのでしょうか？

一般的には変数部分には[プリペアドステートメント](https://www.php.net/manual/ja/pdo.prepared-
statements.php)を使用するため、SQL文に`N`プレフィックスを付けるか悩むべきではありません。


CC BY-SA 4.0
2020-09-23T02:27:24.723
70616
2020-09-23T02:27:24.723
4236
70610
answer


PHP を使っているという事なので以下の点を確認してみてください。

１）該当SQL を作成する部分は 文字列連結で 連結して作っていませんか？

PHP でも

[code]

    $sth = $dbh->prepare('SELECT *
        FROM grouping_watchers
        WHERE WHERE account_id = ?');
    
[/code]

のように ? を使ってパラメータ化する事をお勧めします。  
発生した事象を見ると、SQL インジェクションの脆弱性があるように思えます。

２）既存サービスのソースコードをclone  
git の場合 改行コード を CRLF 自動変換の設定があるので  
Linux 上で動作させるアプリの改行コードが 間違って CRLF に  
なっていた・・ という事があるかもしれません。

改行コードが違っていても動く場合は動くのですが、時々 動かない場合があるので・・。

この 2点を 確認してみてください。


CC BY-SA 4.0
2020-12-15T11:24:05.480
72673
2020-12-15T11:24:05.480
18851
70610
answer