phpで生成した連想配列をjquery ajaxを使ってmysqlに反映させたい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 449
前提・実現したいこと
phpで生成した連想配列をjquery ajaxを使って、
mysqlにアップデートしたいと考えています。
具体的には「MYSQLに反映する」ボタンを押すと裏でMYSQLに反映されます。
発生している問題・エラーメッセージ
全くmysqlにアップデートされない。
様々な解説サイトを閲覧していますが、全然うまくいかない為、御教授願います。
(ひょっとしたらjsonの変換でなにかしらのミスをしているのではと予想しており、自信がありません。。)
該当のソースコード
◆input.php
<?php
$array[0]='aaa';
$array[1]='bbb';
$array_2= json_encode($array) ;
echo'<button class="update">MYSQLに反映する</button>';
?>
<style>
.update:active {opacity: 0.8;}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
// buttonがクリックされたときに実行
$(".update").click(function() {
var array_jquery="<?php echo $array_2; ?>";
var array_jquery_2 = { a: array_jquery };
$.ajax({
type: "POST",
url: "update.php",
data:{data1:array_jquery_2}
});
return false;
});
});
</script>
◆update.php
<?php
$array_jquery_3 = filter_input(INPUT_POST, 'a');
$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;
// 投票数をアップデートする
$dsn='mysql:dbname=xxx;host=localhost';
$user='yyy';
$password='zzz';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
$sql="UPDATE table_1 SET box1=?, box2=? WHERE id=?";
$stmt=$dbh->prepare($sql);
$data[0]=$array_jquery_4[0];
$data[1]=$array_jquery_4[1];
$data[2]=100;
$stmt->execute($data);
$dbh=null;
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
{data1:array_jquery_2}
これで送ったならキーはdata1
です。a
というキーは送られていません。
あと、配列受けとる際はオプションが必要です。
$array_jquery_3 = filter_input(INPUT_POST, 'a');
↓
$array_jquery_3 = filter_input(INPUT_POST, 'data1',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)
ただ、二次元配列なので、参照するのは$array_jquery_3['a']
となりますね。
ajax setのほうをdata:array_jquery_2
とすればPHPの方の調整は不要となるように思います。
いずれにしても「一気に処理を書ききる」のではなく「POSTした情報はきちんと取れているか」「DBはちゃんと接続できているか」を1つずつ確認していったほうが良いです。
問題の切り分けが面倒になります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
回答者さんからの助言ありがとうございました。
余計なダブルクォーテーションがあった為、実行出来ていないことが判明しました。
以下に修正することで、解決しました。
◆input.php
//余計なダブルクォーテーションを削除
var array_jquery="<?php echo $array_2; ?>";
↓
var array_jquery=<?php echo $array_2; ?>;
◆input.php
//わざわざdata1をキーに置かなくてもよい
data:{data1:array_jquery_2}
↓
data:array_jquery_2
◆update.php
$array_jquery_3 = filter_input(INPUT_POST, 'a');
$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;
↓
$array_jquery_3 = filter_input(INPUT_POST, 'a',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
//$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;←受ける側のデコードは不要
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/01/03 12:12
filter_inputで連想配列を処理するのってフラグ要りませんか?
2020/01/03 13:30
調整しときます
2020/01/03 23:07
MYSQLのUPDATEコマンドのところはjquery ajaxを使わずに、ただ単純にUPDATEを実行したところ、成功したので、問題はjquery ajaxで受け渡し&受け取るところなのかなと思います。
ただ、当方jqueryを学び始めたばかりということもあり、御指摘されているところが理解出来ていないところもあります。
例えば 「ajax setのほうをdata:array_jquery_2とすればPHPの方の調整は不要となるように思います。」⇒ filter_inputは必要なく、いきなりjson_decodeでデコードすればよいのでしょうか?
理解が悪くて申し訳ありません。。
◆織り込んだこと
□input.php
$.ajax({
type: "POST",
url: "update.php",
data:{data1:array_jquery_2}
});
↓
$.ajax({
type: "POST",
url: "update.php",
data:array_jquery_2
});
□update.php
$array_jquery_3 = filter_input(INPUT_POST, 'a');
↓
$array_jquery_3 = filter_input(INPUT_POST, 'data1',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)
2020/01/04 04:46
> いずれにしても「一気に処理を書ききる」のではなく「POSTした情報はきちんと取れているか」「DBはちゃんと接続できているか」を1つずつ確認していったほうが良いです。
ajaxのレスポンスをdoneやsuccessで拾えばPHP側の「出力」を確認することができます。
今の作りだともしPHP側で何かしらエラーが出ていても気づくことは出来ません。
PHPの方もtry-catchでException拾うなどはしておいたほうが良いです。