\r\n\r\n\r\n\r\n\r\n◆update.php\r\nquery('SET NAMES utf8');\r\n$sql=\"UPDATE table_1 SET box1=?, box2=? WHERE id=?\";\r\n\t\r\n$stmt=$dbh->prepare($sql);\r\n$data[0]=$array_jquery_4[0];\r\n$data[1]=$array_jquery_4[1];\r\n$data[2]=100;\r\n\r\n$stmt->execute($data);\r\n$dbh=null;\r\n\r\n?>\r\n```","answerCount":2,"upvoteCount":0,"datePublished":"2020-01-02T18:38:57.711Z","dateModified":"2020-01-02T18:38:57.711Z","acceptedAnswer":{"@type":"Answer","text":"回答者さんからの助言ありがとうございました。\r\n\r\n余計なダブルクォーテーションがあった為、実行出来ていないことが判明しました。\r\n以下に修正することで、解決しました。\r\n\r\n```php\r\n◆input.php\r\n//余計なダブルクォーテーションを削除\r\nvar array_jquery=\"\";\r\n↓\r\nvar array_jquery=;\r\n```\r\n\r\n\r\n```php\r\n◆input.php\r\n//わざわざdata1をキーに置かなくてもよい\r\ndata:{data1:array_jquery_2}\r\n↓\r\ndata:array_jquery_2\r\n```\r\n\r\n```php\r\n◆update.php\r\n$array_jquery_3 = filter_input(INPUT_POST, 'a');\r\n$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;\r\n↓\r\n$array_jquery_3 = filter_input(INPUT_POST, 'a',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);\r\n//$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;←受ける側のデコードは不要\r\n```","dateModified":"2020-01-04T17:24:43.206Z","datePublished":"2020-01-04T17:24:43.206Z","upvoteCount":0,"url":"https://teratail.com/questions/233010#reply-339866"},"suggestedAnswer":[{"@type":"Answer","text":"> {data1:array_jquery_2}\r\n\r\nこれで送ったならキーは`data1`です。`a`というキーは送られていません。\r\nあと、配列受けとる際はオプションが必要です。\r\n```php\r\n$array_jquery_3 = filter_input(INPUT_POST, 'a');\r\n\r\n↓\r\n\r\n$array_jquery_3 = filter_input(INPUT_POST, 'data1',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)\r\n```\r\n\r\nただ、二次元配列なので、参照するのは`$array_jquery_3['a']`となりますね。\r\najax setのほうを`data:array_jquery_2`とすればPHPの方の調整は不要となるように思います。\r\n\r\nいずれにしても「一気に処理を書ききる」のではなく「POSTした情報はきちんと取れているか」「DBはちゃんと接続できているか」を1つずつ確認していったほうが良いです。\r\n問題の切り分けが面倒になります。","dateModified":"2020-01-03T04:38:35.697Z","datePublished":"2020-01-02T23:15:16.506Z","upvoteCount":2,"url":"https://teratail.com/questions/233010#reply-339552","comment":[{"@type":"Comment","text":"To: m.ts10806さん\r\nfilter_inputで連想配列を処理するのってフラグ要りませんか?","datePublished":"2020-01-03T03:12:39.184Z","dateModified":"2020-01-03T03:12:39.184Z"},{"@type":"Comment","text":"あ、そうですね。\r\n調整しときます","datePublished":"2020-01-03T04:30:37.906Z","dateModified":"2020-01-03T04:30:37.906Z"},{"@type":"Comment","text":"回答頂いたことを織り込んでみましたが、MYSQLに反映されませんでした。\r\n\r\nMYSQLのUPDATEコマンドのところはjquery ajaxを使わずに、ただ単純にUPDATEを実行したところ、成功したので、問題はjquery ajaxで受け渡し&受け取るところなのかなと思います。\r\n\r\nただ、当方jqueryを学び始めたばかりということもあり、御指摘されているところが理解出来ていないところもあります。\r\n例えば 「ajax setのほうをdata:array_jquery_2とすればPHPの方の調整は不要となるように思います。」⇒ filter_inputは必要なく、いきなりjson_decodeでデコードすればよいのでしょうか?\r\n理解が悪くて申し訳ありません。。\r\n\r\n◆織り込んだこと\r\n□input.php\r\n$.ajax({\r\n            type: \"POST\",\r\n            url: \"update.php\",\r\n            data:{data1:array_jquery_2}\r\n        });\r\n↓\r\n$.ajax({\r\n            type: \"POST\",\r\n            url: \"update.php\",\r\n            data:array_jquery_2\r\n        });\r\n\r\n\r\n□update.php\r\n$array_jquery_3 = filter_input(INPUT_POST, 'a');\r\n↓\r\n$array_jquery_3 = filter_input(INPUT_POST, 'data1',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)","datePublished":"2020-01-03T14:07:35.402Z","dateModified":"2020-01-03T14:07:35.402Z"},{"@type":"Comment","text":"下記は確認したのでしょうか。\r\n> いずれにしても「一気に処理を書ききる」のではなく「POSTした情報はきちんと取れているか」「DBはちゃんと接続できているか」を1つずつ確認していったほうが良いです。\r\n\r\najaxのレスポンスをdoneやsuccessで拾えばPHP側の「出力」を確認することができます。\r\n今の作りだともしPHP側で何かしらエラーが出ていても気づくことは出来ません。\r\nPHPの方もtry-catchでException拾うなどはしておいたほうが良いです。","datePublished":"2020-01-03T19:46:41.355Z","dateModified":"2020-01-03T19:46:41.355Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/MySQL","name":"MySQLに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/233010","name":"phpで生成した連想配列をjquery ajaxを使ってmysqlに反映させたい"}}]}}}
###前提・実現したいこと
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;
?>
{data1:array_jquery_2}
これで送ったならキーはdata1です。aというキーは送られていません。
あと、配列受けとる際はオプションが必要です。
php
1$array_jquery_3 = filter_input(INPUT_POST, 'a');
2
3↓
4
5$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つずつ確認していったほうが良いです。
問題の切り分けが面倒になります。
 自己解決
自己解決
回答者さんからの助言ありがとうございました。
余計なダブルクォーテーションがあった為、実行出来ていないことが判明しました。
以下に修正することで、解決しました。
php
1◆input.php
2//余計なダブルクォーテーションを削除
3var array_jquery="<?php echo $array_2; ?>";
4↓
5var array_jquery=<?php echo $array_2; ?>;
php
1◆input.php
2//わざわざdata1をキーに置かなくてもよい
3data:{data1:array_jquery_2}
4↓
5data:array_jquery_2
php
1◆update.php
2$array_jquery_3 = filter_input(INPUT_POST, 'a');
3$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;
4↓
5$array_jquery_3 = filter_input(INPUT_POST, 'a',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
6//$array_jquery_4 = json_decode( $array_jquery_3 , true ) ;←受ける側のデコードは不要
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

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

テンプレート機能で
簡単に質問をまとめる
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/03 03:12
2020/01/03 04:30
2020/01/03 14:07
2020/01/03 19:46