質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

262閲覧

Python if文が想定通りにならない

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/12 07:23

前提・実現したいこと

プログラミング全般的に初心者で、Pythonを勉強し始めて1か月くらいのぺーぺーです。
Djangoでウェブアプリケーションを試しに作っていて、内容はSQLServerに格納されたデータをHTMLで表示させるものです。
データベースからデータの取得、表示、1項目だけ検索までは行けました。
が、4つあるフォームの中でどれか一つだけ入力されてたら、その項目のSQL文を実行させるというif文がうまく動かなくて躓いています。
最初の表示は下のelseまで行って表示、ごはんの項目を入力するときちんと抽出して表示されるんですが、おかず以降の項目を入力しても最初のif文の処理が通ってしまい、きちんと抽出されません。

該当のソースコード

views.py(一部) def order(request): ggohan = request.GET.get('gohan') ookazu = request.GET.get('okazu') jjuice = request.GET.get('juice') dday = request.GET.get('day') if ggohan is not None: #ごはん検索 sql = "SELECT ごはん, おかず, のみもの, 日付 FROM メニュー表 WHERE ごはん LIKE " sql = sql + "'%" + ggohan + "%'" elif ookazu is not None: #おかず検索 sql = "SELECT ごはん, おかず, のみもの, 日付 FROM メニュー表 WHERE おかず LIKE " sql = sql + "'%" + ookazu + "%'" elif jjuice is not None: # のみもの検索 sql = "SELECT ごはん, おかず, のみもの, 日付 FROM メニュー表 WHERE のみもの LIKE " sql = sql + "'" + jjuice + "%'" elif dday is not None: #日付検索 sql = "SELECT ごはん, おかず, のみもの, 日付 FROM メニュー表 WHERE 日付 LIKE " sql = sql + "'%" + dday + "%'" else: #全て未入力で全件表示 sql = "SELECT ごはん, おかず, のみもの, 日付 FROM メニュー表 ORDER BY 日付 DESC" posts = DB.DBConnect(sql) return render( request, "menu/bangohan.html", { 'title' : "メニュー表", 'posts' : posts, }, )
bangohan.html {% extends "menu/layout.html" %} {% block content %} <FORM name="form1" method="get"> {% csrf_token %} <h3>メニュー検索</h3> <table> <tr> <td width=80 >ごはん</td> <td width=200><input type="text" name="gohan" size=20 value=""></td> <td width=80 >おかず</td> <td width=200><input type="text" name="okazu" size=20 value=""></td> </tr> <tr> <td width=80 >のみもの</td> <td width=200><input type="text" name="juice" size=30 value=""></td> <td width=80 >日付</td> <td width=200><input type="text" name="day" size=30 value=""></td> </tr> <tr> <td colspan="4"> <center> <input type="submit" name="KENSAKU" value="検索"> <input type="reset" value="リセット"> </center> </td> </tr> </table> </FORM> <table> <tr> <td>ごはん</td> <td>おかず</td> <td>のみもの</td> <td>日付</td> </tr> {% for post in posts %} <tr> <td> {{ post.0 }} </td> <td> {{ post.1 }} </td> <td> {{ post.2 }} </td> <td> {{ post.3 }} </td> </tr> {% endfor %} </table> {% endblock %}

試したこと

ggohan = request.GET.get('gohan')のところでフォームが未入力でも変数に空白?が入ってif文が通ってしまうのかなーって疑っているんですが、改善案が浮かびません。。。
(and検索はまだ途上でイメージが浮かんでないので後回しにしました。)

補足情報(FW/ツールのバージョンなど)

使用環境:VisualStudio2017 Professional
使用したプロジェクト:Django Web プロジェクト
使用したブラウザ:Googlechrome

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

引用テキストフォームが未入力でも変数に空白?が入ってif文が通ってしまうのかなーって疑っているんですが、改善案が浮かびません。。。

Noneと空白の両方が返ってきているのかデバッグすれば分かるのでは?

すでに回答あるようですがせっかく書いたのでご参考までに。
Noneでも空白でもFalseとなれば良いと思います。

test = [None,'',1] for x in test: if x is not None: print(x,True) else: print(x,False)

None False
True
1 True

for x in test: if x != None and x != '': print(x,True) else: print(x,False)

None False
False
1 True

投稿2018/10/12 08:08

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/14 23:38

>if x != None and x != '': の部分を参考に、 if ggohan != "" and ggohan != None: と入れたら想定通りになりました。ありがとうございます!空白やNoneだけじゃなくて両方入れるのは盲点でした。。
guest

0

ggohan = request.GET.get('gohan')のところでフォームが未入力でも変数に空白?が入ってif文が通ってしまうのかなーって疑っているんですが、改善案が浮かびません。。。

ggohan is not NoneのようにNoneと比較するのではなく、ggohan != ""のように空白文字と比較するようにしたらどうでしょうか?

だけど

ちゃんとしたアプリケーションを作るつもりなら、GETで送られてきた文字列をそのまま結合してSQLを組み立てるようなマネはやめましょう。セキュリティ上の問題があります。

フォームクラスを書けば値の受け取りにGETを使わなくても良いし、ORM使わないとインジェクションし放題です。

参考:
[第42回] SQLインジェクションのおさらい | データベース・セキュリティナビ

新しくて体系的な本を買って勉強することをおすすめします。

#そもそも、初心者がいきなりウェブアプリケーション作ろうとするのがチャレンジャーすぎるのだが・・・

投稿2018/10/12 07:43

編集2018/10/12 07:52
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/14 23:33

ありがとうございます。ggohan != ""もやってみたのですが、エラーが出てしまって、opyonさんのを参考に、ggohan != "" and ggohan != None と二つ入れたら想定通りになりました! セキュリティなども勿論大切な事なのは理解していますが、今の段階では、プログラムの動きを把握するところから始めています。参考、ありがとごうございます。ウェブアプリケーションを選んだ理由としては、社内で使うならブラウザから出来るモノの方が利用者にとって楽だったので。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問