SQLServerにprepareで検索するには? - PHPプロ!Q&A掲示板

2835

  • 0P

SQLServerにprepareで検索するには?

質問日時 / 2010年8月7日 10:16    回答数 / 9件

Questioner:  phpsuki  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

  1. $stmt    = odbc_prepare($conn, 'SELECT * FROM TBL WHERE COL1 = ?');
  2. $success = odbc_execute($stmt, array($a));

環境はPHP5です。
SQLServerに接続して上記のプログラムを実行すると、テーブルの列より文字数が多い場合
22001 文字列の右側が切り捨てられたエラーメッセージが表示されます。

ライブラリの変更も含めて回避する方法はあるのでしょうか。

よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix>テーブルの列より文字数が多い場合 SQL文に渡す前
 ┗A01-1phpsuki返信ありがとうございます。 検索画面で名前を打ち
  ┣A01-1-1shimix>やまだ→山田の変換を可能にするために input要素
  ┗A01-1-2pannna# prepareというより仕様の問題ですね 苗字や名前
   ┗A01-1-2-1phpsuki返信ありがとうございます。 入力項目最大文字数>D
    ┗A01-1-2-1-1pannna>入力項目最大文字数>DBの列サイズの >状態に問題が
     ┗A01-1-2-1-1-1phpsuki>そうではなく、入力文字の文字列長のチェックをすれ
      ┗A01-1-2-1-1-1-1pannna>なるほど、検索画面でチェックするという概念自体が
       ┗A01-1-2-1-1-1-1-1phpsuki返信遅くなってすいません。 あれから色々な書籍な

回答一覧

並び替え:

A01
answerershimix [8月7日 20:03] (最終編集:8月7日 20:11)

>テーブルの列より文字数が多い場合

SQL文に渡す前にチェックすべきことだと思いますけど・・。


(蛇足)
ちなみに。odbc_errormsgでの確認はされていると思うので「エラー表示が困る」というだけなら、エラー表示は制御できると思いますけど。ODBCのエラーメッセージはerror_reportingやdisplay_errorsでも制御できないんでしたっけ?

この意見に回答する

ツリーへ TOPへ

A01-1
replyerphpsuki [8月7日 21:43]

返信ありがとうございます。

検索画面で名前を打ち込むとき、
テーブルサイズは2ですけど、
やまだ→山田の変換を可能にするために
多めに文字数が打ち込めるようになっています。
多めに打ち込んで検索をかけると右側の文字列が切られてしまいます。

日本語変換で文字数が変わるので多めに入力欄を取る画面構成に問題が
あるのでしょうか、画面仕様の作成の経験がないのでご指摘いただければと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [8月7日 22:20]

>やまだ→山田の変換を可能にするために

input要素の入力サイズは「変換後」のサイズでは?まぁ、そうであろうとなかろうと(input要素から何がPOSTされても)受け取ったスクリプトでサイズチェックしていないというのは問題だと思います。

#input要素にどう書いていようが、受け取った内容はチェックすべきです。


(以下蛇足ですが・・)
どういう列なのかわかりませんが、原則2文字でも列サイズまで2というのはどうなんでしょう。varcharにして文字数を多少増やしておいた方がいいのでは?

#もちろんサイズに余裕があるからスクリプトでノーチェックでいいということではありません。

この意見に回答する

ツリーへ TOPへ

A01-1-2
replyerpannna [8月8日 12:23] (最終編集:8月8日 12:23)

# prepareというより仕様の問題ですね

苗字や名前などは人によって文字列の長さが違うので、それを見越した設計をすべきです。
通常はvarcharで10~20バイトくらいとるものではないでしょうか?

また、shimixさんもレスしていますが、受け取り側で何のチェックもしていないというのは大問題です。
今回のようにDBにデータを登録する際にエラーが発生するような部分なら尚更ですが、
入力値の妥当性、文字列長、必須の有無だけでもチェックするのを忘れないようにして下さい。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1
replyerphpsuki [8月8日 21:27]

返信ありがとうございます。

入力項目最大文字数>DBの列サイズの
状態に問題があるということでしょうか。

画面の作りとしては、
DBを10文字など多めに確保しておいて
苗字だけで10文字使うことはないので
漢字への変換前のサイズで10文字でも
十分なサイズということでしょうか。
(prepareの問題が起きない)

現在、検索画面でも住所と名前が入力できて
登録でも住所と名前を入力する画面を作っています。
登録画面はPHPとJavaScriptで制限、チェックをかけて
検索画面はhtmlでの文字すう制限のみ加えようと考えています。

以上、よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1 参考になった
replyerpannna [8月9日 00:55] (最終編集:8月9日 00:58)

>入力項目最大文字数>DBの列サイズの
>状態に問題があるということでしょうか。
>
>画面の作りとしては、
>DBを10文字など多めに確保しておいて
>苗字だけで10文字使うことはないので
>漢字への変換前のサイズで10文字でも
>十分なサイズということでしょうか。
>(prepareの問題が起きない)

そうではなく、入力文字の文字列長のチェックをすれば解決しますよね?
まず第一にそういったチェックをしていないというのが問題なわけです。
prepareで問題が起きるとか以前の話で、やるべきことをやっていないために
発生しているだけだということを認識して下さい。

フロント側でjavascript等で制限をかけているからサーバ側で何もしなくていい、
というのは大きな間違いです。

# ちょっと気になったのですが、苗字が全角3文字の人は登録できないシステムなんですか?

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1-1
replyerphpsuki [8月9日 23:54]

>そうではなく、入力文字の文字列長のチェックをすれば解決しますよね?
なるほど、検索画面でチェックするという概念自体がなかったので
とても勉強になりました。

># ちょっと気になったのですが、苗字が全角3文字の人は登録できないシステムなんですか?
仮のテーブルを作って試作してる検索する画面を作っている段階なのですが
すでに現在詰まっています。
多めに領域を取ることを教えていただいたので、多めにサイズをとっていくつもりです。
昔、半角数字のコードで検索する画面を作っただけなので、
他の人が躓かないようなところでかなり躓いています。

細かい話になりますが、
エラー表示はどういった表現になるのでしょうか。
「プログラマー相手なら、xバイト(varchar(x))以下にしてください。」で
わかりますが、住所などは半角全角を織り交ぜるので、
何文字まで打てるというのが断定しづらいと思うのですが・・。

shimixさん、pannnaさんに丁寧に教えていただいて
とても助かっております。
参考になったボタンに今まで気づかなかったのであらためて、
お礼をいわせていただきます。
ありがとうございます。

以上、よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1-1-1 満足
replyerpannna [8月10日 01:05] (最終編集:8月10日 01:20)

>なるほど、検索画面でチェックするという概念自体がなかったので
>とても勉強になりました。

「検索画面だから」ではなく、ユーザの入力が存在するものは全てチェックすべきです。
チェックロジックなんて簡単に出来るものを疎かにして不具合を出すより、
システム全体のポリシーとしてもきちんとしたほうがいいことは間違いありません。

また、検索時に使うキーワードを完全一致で検索するんでしょうか?
何らかのコードならまだしも、苗字や住所などを完全一致で検索させるのはシステム的に
どうなんでしょう。ユーザから「使いにくい」という意見しか出ないように思えますが…
通常そういったものは前方一致または部分一致で検索を行うことがほとんどです。
完全一致での検索の場合、基本的に検索結果の該当件数は0または1件になるかと思いますが、
検索するためのシステムとしてそれが正しい姿ですか?
正直、他人の住所を正確に入力しないと検索結果に出ませんよ、なんて言われたら
二度とそのシステム使いません。

エラーメッセージについては「XX文字以内で入力して下さい」とでもしておけばいいかと。
検索画面で文字数制限をかけるのは正直ナンセンスかと思いますが、
ユーザにプログラマ寄りなエラーメッセージを表示するのはおかしいです
(クリティカルエラーなどは、ユーザに見せるのは分かりやすいメッセージで、
プログラマ寄りなエラーメッセージはエラーログなどに出力すべきです)。
全角と半角の違いが分かる人がエンドユーザなら、「全角XX文字または半角XX文字」とか
出してもいいと思います。

個人的な感想ですが、ちゃんと設計してからシステム化していないような印象を受けます。
自分がこうあるべきと思い込んで作るシステムは間違いなく失敗作になります。
仕事でやられるのであれば、きちんと仕様書や設計書を書いて、上長なりエンドユーザなりに
レビュー&フィードバックを受けてからシステムを作るべきです。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1-1-1-1
replyerphpsuki [8月17日 21:54]

返信遅くなってすいません。

あれから色々な書籍などで、
DB系のアプリケーションを基本から勉強しています。

またわからないことがありましたら、
質問させていただくかもしれませんが
よろしくお願いします。

prepareの疑問については、新たな課題をいただくと形では
ありますが、解決しましたので「満足をした」をつけさせていただきました。
ありがとうございます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)