PHPファイルで処理した後の戻り値がjqueryで正常に受け取れない
jqueryのajax()メソッドでPHPファイルに通信を行い、
「いいねボタンを押すとDBへレコードを挿入、さらに処理した後にいいねの数を表示する」
「既にいいねをした状態でボタンを押すと、いいね状態を解除(DBのいいねレコードを削除、解除後のいいね数を表示)する」
という機能を作成中です。
参考記事:https://qiita.com/kgkgon/items/4ea0675afde639e6d540
上記記事を元に実装しているのですが、いいねの数の表示が想定通りにいきません。
発生している問題・エラーメッセージ
「いいね0 の状態でボタンを押す」 → 「いいね01 に変化」
「いいね1 の状態でボタンを押す」 → 「いいね10 に変化」
「いいね2 の状態でボタンを押す」 → 「いいね11 に変化」
いいねボタンのあるビューファイル mypage.php
いいねボタンが押された時のjquery footer.php
Ajax通信を受け取り、処理するファイル ajaxNice.php
おそらく、この3つのファイルのどれかに問題があると思うので、下記コードと試した事を拝読して意見をいただけますと幸いです。
mypage.php いいねボタンの箇所のみ抜粋 <i class="fas fa fa-dumbbell js-click-nice <?php if(isNice($_SESSION['user_id'], $val['id'])){ echo 'active'; } ?>" aria-hidden= "true" data-recordid = "<?php echo sanitize($val['id']); ?>" > </i> <span><?php echo $dbNiceNum; ?></span>
footer.php
1 var $nice = $('.js-click-nice') || null, 2 niceRecordId; 3 login_flg = <?php (!empty($_SESSION['user_id'])) ? true : false; ?> 4 5 $nice.on('click' ,function(e){ 6 if(login_flg){ 7 8 e.stopPropagation(); 9 var $this = $(this); 10 niceRecordId = $this.data('recordid') || null; 11 niceCounter = $this.next('span') || null; 12 13 console.log(niceRecordId); 14 15 if(niceRecordId !== undefined && niceRecordId !== null){ 16 17 $.ajax({ 18 type: 'POST', 19 url: 'ajaxNice.php', 20 data: { recordId : niceRecordId} 21 22 }).done(function(data){ 23 //いいね総数を表示 24 niceCounter.text(data); 25 //$thisのclassをtoggleclassで付け外しおする 26 $this.toggleClass('active'); 27 //成功したことをコンソール表示。本番では削除 28 console.log('Ajax Success'); 29 console.log( data ); 30 //失敗した時の処理 31 }).fail(function(){ 32 console.log('Ajax Error'); 33 }); 34 } 35 36 } 37 });
ajaxNice.php <?php require('function.php'); debug('Ajax.phpの処理を開始'); debugLogStart(); // Ajax処理 //postがあり、ユーザーIDがあり、ログインしている場合 if(isset($_POST['recordId'])){ debug('POST送信があります。'); $todo_id = $_POST['recordId']; debug('レコードID:'.$todo_id); try { $dbh = dbConnect(); $sql = 'SELECT * FROM nice WHERE todo_id = :todo_id AND user_id = :u_id'; $data = array(':u_id' => $_SESSION['user_id'], ':todo_id' => $todo_id ); $stmt = queryPost($dbh, $sql, $data); $result = $stmt->rowCount(); debug('登録数'.print_r($result)); //レコードが1件でもある場合 if(!empty($result)){ debug('niceONの状態でボタンが押されたので、niceをOFFにします'); //レコードを削除する $sql = 'DELETE FROM nice WHERE todo_id = :todo_id AND user_id = :u_id'; $data = array(':u_id' => $_SESSION['user_id'] ,':todo_id' => $todo_id); $stmt = queryPost($dbh, $sql, $data); echo getNiceNum($todo_id); } else { debug('niceOFF状態でボタンが押されたので、niceONにします'); //レコードを挿入する $sql = 'INSERT INTO nice (user_id, todo_id, create_date) VALUES (:u_id, :todo_id, :create_date)'; $data = array(':u_id' => $_SESSION['user_id'], ':todo_id' => $todo_id, ':create_date' => date('Y-m-d H:i:s')); $stmt = queryPost($dbh, $sql, $data); echo getNiceNum($todo_id); } } catch (Exception $e) { error_log('エラー発生:'.$e->getMessage()); } } debug('Ajax処理終了'); ?>
試したこと
html()以外にも,
text()の書き換えを試したが動作は変わらず。
ajaxnice.phpでSQLを送った後のnice数をログに流したところ、DB上で「0」の時は0、「1」の時は1と(一ケタで)出力されていた。また、dar_dumpしたところint型だった。
jquery側のdoneメソッドで受け取ったdataをconsole.logしたところ、
DB上で「0」の時は10、「1」の時は10と出力されてしまっていた。
PHPファイルで正常に出力された値がjqueryに戻り値としてきた時に変化しまっている?
→
ajax()内でdataType: "text";
をしたらイベントが発火しなくなってしまった。
以上、よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー