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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4829閲覧

【contact_form7】DBにラジオボタンの値がインサートされない

uznetro

総合スコア12

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/11/16 08:11

編集2015/11/17 01:30

wordpressプラグインのcntact_form7で送信した値をDBに保存したい為、
ネットの情報を参考に、下記の様な形で実装しました。

テキストのフォーム部分は、DBにインサートされるのですが、
複数要素を持つ”ラジオボタン/チェックボックス”がうまくいきません。

初心者の為、説明/情報不足があるかと思いますが、
ご教授宜しくお願いします。

▼環境
wordpress バージョン:4.3
contact_form7バージョン:4.3
MySQL バージョン:5.0.95

【出力されたHTMLソース】

HTML

1<div role="form" class="wpcf7" id="wpcf7-f141-o1" lang="ja" dir="ltr"> 2 <div class="screen-reader-response"></div> 3 <form action="/wordpress/form/poll/#wpcf7-f141-o1" method="post" class="wpcf7-form" novalidate="novalidate"> 4 <div style="display: none;"> 5 <input type="hidden" name="_wpcf7" value="141" /> 6 <input type="hidden" name="_wpcf7_version" value="4.3" /> 7 <input type="hidden" name="_wpcf7_locale" value="ja" /> 8 <input type="hidden" name="_wpcf7_unit_tag" value="wpcf7-f141-o1" /> 9 <input type="hidden" name="_wpnonce" value="d41c7e5b6b" /> 10 </div> 11 12 <div class="formGroup"> 13 <p>お名前 (必須)<br /> 14 <span class="wpcf7-form-control-wrap name"><input type="text" name="name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" /></span> 15 </p> 16 <p>メールアドレス (必須)<br /> 17 <span class="wpcf7-form-control-wrap mail"><input type="email" name="mail" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-email wpcf7-validates-as-required wpcf7-validates-as-email" aria-required="true" aria-invalid="false" /></span> 18 </p> 19 <p>ラジオアイテム<br /> 20 <span class="wpcf7-form-control-wrap item"><span class="wpcf7-form-control wpcf7-radio"><span class="wpcf7-list-item first"><input type="radio" name="item" value="itemA" />&nbsp;<span class="wpcf7-list-item-label">itemA</span></span><span class="wpcf7-list-item last"><input type="radio" name="item" value="itemB" />&nbsp;<span class="wpcf7-list-item-label">itemB</span></span></span></span> 21 </p> 22 <p> 23 <input type="submit" value="送信" class="wpcf7-form-control wpcf7-submit"/> 24 </p> 25 </div> 26 <div class="wpcf7-response-output wpcf7-display-none"></div> 27 </form> 28</div>

【contact_form7設定画面のソース】

<div class="formGroup"> <p>お名前 (必須)<br /> [text* name] </p> <p>メールアドレス (必須)<br /> [email* mail] </p> <p>ラジオアイテム<br /> [radio item "itemA" "itemB"] </p> </div> <p> [acceptance acceptance] 規約に同意する </p> <p>[submit "送信"]</p>

【fuction.php】

PHP

1/** Contact-form7 insert DB [function.php] 2*****************************************************/ 3function contactform7_before_send_mail( $form_to_DB ) { 4 5 global $wpdb; 6 7 $form_to_DB = WPCF7_Submission::get_instance(); 8 9 if ( $form_to_DB ) { 10 $formData = $form_to_DB->get_posted_data(); 11 } 12 13 $name =$formData['name']; 14 $mail =$formData['mail']; 15 $item =$formData['item']; //radio button 16 $wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail), array( '%s','%s' ) ); 17 18 //下記はダメでした。JSONエラーがでて、DBにインサートされません。 19 //JSON.parse: unexpected character at line 1 column 1 of the JSON data 20 //$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail,'item' => $item), array( '%s','%s','%s' ) ); 21 22} 23remove_all_filters ('wpcf7_before_send_mail'); 24add_action( 'wpcf7_before_send_mail', 'contactform7_before_send_mail' );

sql

1CREATE TABLE IF NOT EXISTS `wp_cf7db` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `item` varchar(50) DEFAULT NULL, 4 `name` varchar(50) DEFAULT NULL, 5 `mail` varchar(255) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7)

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

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

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

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

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

guest

回答2

0

自己解決

以下要件を満たした、 Contact Form7のデータベース保存版の自己解決です。
・応募データの保存
・重複投票なし(DB側で処理)
・各フォームバリテーションチェック(JSで簡易バリテーション)

PHP

1function contactform7_before_send_mail( $form_to_DB ) { 2 global $wpdb; 3 $form_to_DB = WPCF7_Submission::get_instance(); 4 if ( $form_to_DB ) { 5 $formData = $form_to_DB-&gt;get_posted_data(); 6} 7 8// 以下コメントは$formDataの検証 9// foreach ($formData as $key =&gt; $val) { 10// $fmail .= $key.":".$val.";"; 11// } 12// さらに配列の中身を確認する 13// foreach($formData as $key =&gt; $val) { 14// foreach($val as $k =&gt; $v) { 15// $mail .= $k.":".$v; 16// } 17// } 18 19$item =$formData['item'][0]; 20$name =$formData['name']; 21$mail =$formData['mail']; 22 23$wpdb-&gt;insert ( 'wp_cf7db', array('item' =&gt; $item,'name' =&gt; $name,'mail' =&gt; $mail), array( '%s' ) ); 24} 25remove_all_filters ('wpcf7_before_send_mail'); 26add_action( 'wpcf7_before_send_mail', 'contactform7_before_send_mail' );

投稿2016/07/15 01:16

uznetro

総合スコア12

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

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

0

insertメソッドに値を渡していないことが原因ではないでしょうか?

php

1$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail), array( '%s','%s','%s' ) );

php

1$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail, 'item' => $item), array( '%s','%s','%s' ) );

に変更して、試してみてください。

投稿2015/11/16 13:34

KiyoshiMotoki

総合スコア4791

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

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

uznetro

2015/11/17 01:23

ご意見有難うございます。 一番初めにitemの値は渡してやってみました。がダメでした。 'item' => hogeの様に固定値を渡すと入るのですが・・・
KiyoshiMotoki

2015/11/17 09:49

返信ありがとうございます。 > 'item' => hogeの様に固定値を渡すと入るのですが・・・ ということは、変数$item の値がおかしいように思われます。 が、MySQLへのインサート処理でJSONのパースエラーが発生するというのはちょっと考えづらいです。 おそらく、別のエラーが発生しているのではないでしょうか? ソースコードに以下の修正を加えて、出力されたメッセージを追記していただけますか? 1. contactform7_before_send_mailメソッドの先頭に以下の2行を追加 ini_set('display_errors', 1); error_reporting(E_ALL); 2. if文を抜けた後に以下の1行を追加 var_dump($formData);
uznetro

2015/11/18 03:15

var_dampを条件分の後に記述すると、出力結果は無かったです。 contact_form7が確認画面を持っていないので、入力画面で$formDataの値を確認する事は可能なのでしょうか??
KiyoshiMotoki

2015/11/18 05:19 編集

> var_dampを条件分の後に記述すると、出力結果は無かったです。 では、ログファイルに書き出すなどして確認してみましょう。 var_dump($formData) の代わりに var_export($formData, true) とすれば、var_dumpで出力されるのと同じフォーマットで変数$formData の内容を PHPプログラム内で受け取ることができます。 http://php.net/manual/ja/function.var-export.php > 入力画面で$formDataの値を確認する事は可能なのでしょうか?? 申し訳ありませんが、Wordpressは不勉強なので、何とも言えないです。。 あと、 > 1. contactform7_before_send_mailメソッドの先頭に以下の2行を追加 の結果はいかがでしたか? PHP のログファイルなどに、何か記録されていませんか? いずれにせよ、 ・変数$formData の値 ・どこで、どのようなエラーが発生しているか を詳細に確かめてみることが、問題解決の最も近道になると思います。
uznetro

2015/11/18 07:30

> contactform7_before_send_mailメソッドの先頭に以下の2行を追加 はい!記述しています。 > var_export($formData, true)とすれば やはりfunction内では何も出力されません。 下記の様に、変数定義しても値を受け取れなかったです。 function抜ければ結果が出るのですが。 $item= array('aaa', 'bbb'); var_dump($item);
KiyoshiMotoki

2015/11/18 08:29

> はい!記述しています。 その結果、何か出力されたかを教えて下さい。 > やはりfunction内では何も出力されません。 var_export($item, true) は、var_dumpで出力される文字列を戻り値として返す関数です。 ですので、例えば $exported = var_export($formData, true); file_put_contents('/tmp/export.log', $exported, FILE_APPEND); とすれば、"/tmp/export.log"というファイルに$formDataの内容が出力されます。 http://php.net/manual/ja/function.file-put-contents.php 出力するファイルは、ご自分の環境で開くことのできるものに適宜変更して下さい。 > function抜ければ結果が出るのですが。 どういう意味ですか? 具体的に説明して下さい。
uznetro

2015/11/19 00:08 編集

> function抜ければ結果が出るのですが。 function contactform7_before_send_mail( $form_to_DB ) { この中での処理(ご指示頂いたデバック関数や確認用に記述した変数など)が動かないということです。 } ただし、メール送信すると配列型のフォームアイテム以外はDBに値が入る為、 下記の様にすると、fmailフィールドにitemの配列が渡されている事が確認できました。 foreach($formData as $key => $val) { foreach($val as $k => $v) { $fmail .= $k.":".$v; } } 結論となりますが、ラジオボタンでの値はDBにインサートできたので、 その他フォームアイテムで確認してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問