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

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

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

JSONP(JSON with padding)は、JSONを使用した関数呼び出しのための仕組み。クロスドメインでのデータの受け渡しが可能です。JavaScriptからクロスドメインで容易にデータを扱うことができます。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

Q&A

解決済

1回答

1618閲覧

python cgi でmysql内の値を取得し、表示したい

okayu_

総合スコア10

JSONP

JSONP(JSON with padding)は、JSONを使用した関数呼び出しのための仕組み。クロスドメインでのデータの受け渡しが可能です。JavaScriptからクロスドメインで容易にデータを扱うことができます。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

0グッド

0クリップ

投稿2018/09/18 04:00

前提・実現したいこと

検索窓に特定の値を入力すると、作成済mysqlDBを見に行き、該当する値をとってきて表示するwebアプリを作りたい。
cgiプログラムにはpythonを使います。
xamppからappacheでサーバー起動しています。
現在は
http://creatornote.blog87.fc2.com/blog-entry-31.html
を参考に、jsからpythonにgetで送って、jsonpで値を返してきています。

検索窓への入力を「つー」にすれば単に「かー」と返すプログラムは動作するのですが(pythonファイル56行目)、
特定の入力に対して、mysqlを検索した結果を返して、表示することができません。(pythonファイル54行目)
この場合、500 Internal Server Errorなどは起こらず、送信ボタンを押しても何の反応もありません。
特定の入力(下記サンプルでは「60」)があれば、mysqlを検索した結果を返せるようにしたいです。

発生している問題・エラーメッセージ

入力「つー」・・・出力「かー」
入力「60」・・・反応なし
入力「上記2つ以外」・・・「よくわかりません」

イメージ説明
イメージ説明

反応がない

該当のソースコード

python

1#! C:/Users/username/python.exe 2# -*- coding: utf-8 -*- 3 4#GETメソッドでデータを受けとるおまじない 5import os 6import cgi 7#文字化け防止 8import sys 9import io 10sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 11 12#pymysql.cursorsのモジュールまでのパスを追加 13sys.path.append("c:\users\username\appdata\local\programs\python\python37\lib\site-packages") 14# DBconモジュール読み込み 15import pymysql.cursors 16 17if 'QUERY_STRING' in os.environ: 18 query = cgi.parse_qs(os.environ['QUERY_STRING']) 19else: 20 query = {} 21#おまじない ここまで 22 23a = str(query['a'][0]) #データaを文字列として読み込む 24ka = 'かー' 25no = 'よくわかりません' 26# MySQLに接続する 27 28connection = pymysql.connect(host='localhost', 29 user='user', 30 password='password', 31 db='dbname', 32 charset='utf8', 33 # cursorclassを指定することで 34 # Select結果をtupleではなくdictionaryで受け取れる 35 cursorclass=pymysql.cursors.DictCursor) 36 37# SQLを実行する(age=60のnameを取り出す。テストのためage=60は固定) 38with connection.cursor() as cursor: 39 sql = "SELECT name FROM tb1 WHERE age = 60" 40 cursor.execute(sql) 41 42 # Select結果を取り出す 43 results = cursor.fetchall() 44 45#文字列型に 46results = str(results) 47 48#出力 49print ('Content-Type:application/json; charset=UTF-8') 50print ('') 51 52#「60」と入力があれば、mysqlを検索した結果resultsを返す 53#「つー」と入力があれば、「かー」と返す 54if '60' in a: 55 print ("callback({'answer':'%s'});"%("あなた:"+a+"<br>bot:"+results)) 56if 'つー' in a: 57 print ("callback({'answer':'%s'});"%("あなた:"+a+"<br>bot:"+ka)) 58else: 59 print ("callback({'answer':'%s'});"%("あなた:"+a+"<br>bot:"+no))

html

1<!DOCTYPE html> 2<html> 3<head> 4<title>test</title> 5<meta http-equiv="content-type" charset="UTF-8"> 6<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 7<!-- jquery呼び出し --> 8<script type="text/javascript"> 9 10 11 function callback(json) { 12 $("#result").append("<br>"+json.answer); 13 } 14 15 function send() { 16 var s = document.createElement('script'); 17 a = document.form1.a.value; 18  param = "?a="+a 19 s.src = '/dashboard/cgi-bin/test.py'+param; 20 document.body.appendChild(s); 21 return false; 22 } 23</script> 24</head> 25<body> 26<form name="form1" onsubmit="return send()"> 27 <input type="text" name="a" value="わからないことを聞いてね"> 28 <input type="submit" value="送信" /> 29</form> 30<div id="result"></div> 31</body> 32</html>

試したこと

python-mysql間の接続ができていないのかと思いましたが、
ターミナルから直接pythonプログラムを起動すると、DB内の値をとってくることができたので、原因は別にあるのかなと。。。

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

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

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

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

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

morinatsu

2018/09/27 15:41

Apacheのログはごらんになりましたでしょうか。
guest

回答1

0

自己解決

results = results[2:6]

上記のようにDBから取得した文字列を指定するとブラウザ上に表示できました。
「{」「’」「:」のどれかが表示できない原因かと思われます。

投稿2018/09/28 05:33

okayu_

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問