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

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

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

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

825閲覧

別名で同じ仕組みのクラス。一緒に使うとうまく機能しません。

chapp

総合スコア233

PHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/05/25 04:40

お世話になります。
phpでajaxを用いた、「いいね」ボタンを作っています。クラスもajaxも勉強しながらなのですが、上手く動かず困っております。

記事中に2種類の「いいね」ボタンを実装したいと考えております。
2種類の「いいね」の仕組みは基本一緒ですが、違うものをカウントしたいため、テーブル名、カラム名こそ違うが、テーブル構造は同じものを2つ用意しています。

記事中に、1つの「いいね」ボタンであれば、特に問題なく動くのですが、2つ設置すると、1つは「いいね」をクリックしても反応せず、リロードしてカウントが変わっていることを確認出来る状況です。

2種類のうち1つが上手くいかないという現象は、設置する順番を変えても、決まって一方の「いいね」だけとなっています。

実際のクラスを用意しているソースは以下の通りです。

ソースをダラダラと提示するのも失礼とも思ったりするのですが、ご指摘いただけると助かります。

実はこの部分だけで、4日間悩み続けているので、アドバイスを頂戴したく投稿いたしました。

お忙しい中恐縮いたします。よろしくお願いいたします。

like_button.php

<?php /** * Like_button : Like! ボタン用 */ class Like_button { /** button **/ private $_btn_name = 'Like! [::count::]'; // ボタン表示(buttonタグのテキストに設定できる値)(::count::で人数置き換え) private $_btn_off_class = 'btn btn-primary btn-xs'; // OFFの場合のボタン用class private $_btn_off_tooltip = 'Like! する(現在::count::人がLike! しています)'; // OFFの場合にtooltipに表示する内容(::count::で人数置き換え) private $_btn_on_class = 'btn btn-danger btn-xs'; // ONの場合のボタン用class private $_btn_on_tooltip = 'Like! を取り消す(現在::count::人がLike! しています)'; // ONの場合にtooltipに表示する内容(::count::で人数置き換え) private $_use_tooltip = TRUE; // tooltipを使用するかどうか /** cookie id **/ private $_use_cookie = TRUE; // ログインされていない場合にcookieでON/OFF判定を行うかどうか private $_cookie_id = 'wspff-Xo6wswOTLT'; // COOKIE名 private $_cookie_expire = 63072000; // COOKIE保持期間(秒) 60*60*24*365*2 private $_cookie_domain = ''; // COOKIEドメイン(サブドメインも有効にする場合は指定すること) private $_cookie_secure = FALSE; // HTTPSの場合にだけ有効にしたい場合はTRUEを設定 private $_cookie_httponly = TRUE; // クライアント側のget cookieでも取得できるようにするにはFALSEを設定 private $_db; private $_cookie_value; private $_lot_map = array(); private $_comment_map = array(); /** * __construct * @throws Exception */ public function __construct(&$mysqli, $lot_no=NULL) { try { $this->_db = $mysqli; if(!is_null($lot_no)) { $this->_set_lot_map($lot_no); $this->_set_comment_map($lot_no); } if($this->_use_cookie===TRUE) { $this->_cookie_value = isset($_COOKIE[$this->_cookie_id]) ? $_COOKIE[$this->_cookie_id] : $this->_random_str(16); $expire = time()+$this->_cookie_expire; setcookie($this->_cookie_id, $this->_cookie_value, $expire, '/', $this->_cookie_domain, $this->_cookie_secure, $this->_cookie_httponly); } } catch(Exception $e) { throw $e; } } /** * get_lot_button : lot用のLike! ボタンhtmlを返します * @param integer $no : lot_no * @param unknown $member_no : member_no * @return string */ public function get_lot_button($no, $member_no=NULL) { try { $is_on = FALSE; $like_cnt = 0; if(!is_array($this->_lot_map) || !array_key_exists($no, $this->_lot_map) || !is_array($this->_lot_map[$no]) || count($this->_lot_map[$no])===0) $this->_set_lot_map($no); if(array_key_exists($no, $this->_lot_map)) { if(array_key_exists('count', $this->_lot_map[$no])) $like_cnt = $this->_lot_map[$no]['count']; if(!is_null($member_no) && array_key_exists('member_no', $this->_lot_map[$no]) && array_key_exists($member_no, $this->_lot_map[$no]['member_no'])) $is_on = TRUE; elseif($this->_use_cookie===TRUE && !empty($this->_cookie_value) && array_key_exists('cookie_id', $this->_lot_map[$no]) && array_key_exists($this->_cookie_value, $this->_lot_map[$no]['cookie_id'])) $is_on = TRUE; } return $this->_get_button_html('lot', $no, $is_on, $like_cnt); } catch(Exception $e) { print_r($e->getMessage()); } } /** * click_like : Like! ボタンクリック * @param unknown $type * @param unknown $no * @param unknown $status * @throws Exception * @return array */ public function click($type, $no, $status) { try { $proc = $status==='on' ? 'off' : 'on'; $member_no = isset($_SESSION["member_no"]) ? $_SESSION["member_no"] : NULL; return $this->{'_button_'.$proc}($type, $no, $member_no); } catch(Exception $e) { throw $e; } } /** * _button_on * @param string $type * @param integer $no * @param unknown $member_no * @throws Exception * @return array|NULL[] */ private function _button_on($type, $no, $member_no) { try { $insert = array('like_'.$type.'_no' => $no); if(!is_null($member_no)) $insert['like_'.$type.'_member_no'] = $member_no; if($this->_use_cookie===TRUE && !empty($this->_cookie_value)) $insert['cookie_id'] = "'".$this->_db->real_escape_string($this->_cookie_value)."'"; if(!isset($insert['like_'.$type.'_member_no']) && !isset($insert['cookie_id'])) return array(); $this->_trans_begin(); $table = 'like_'.$type; $result = $this->_db->query("INSERT INTO `".$table."` (`".implode("`,`", array_keys($insert))."`) VALUES(".implode(",", $insert).")"); if($result!==TRUE) { $this->_db->rollback(); return array(); } $this->_db->commit(); return array('html' => $this->{'get_'.$type.'_button'}($no, $member_no)); } catch(Exception $e) { $this->_db->rollback(); throw $e; } } /** * _button_off * @param string $type * @param integer $no * @param unknown $member_no * @throws Exception * @return array|NULL[] */ private function _button_off($type, $no, $member_no) { try { $this->_trans_begin(); $table = 'like_'.$type; if(!is_null($member_no)) { $result = $this->_db->query("DELETE FROM `".$table."` WHERE `like_".$type."_no`=".$no." AND `like_".$type."_member_no`=".$member_no); if($result!==TRUE) { $this->_db->rollback(); return array(); } } if($this->_use_cookie===TRUE && !empty($this->_cookie_value)) { $result = $this->_db->query("DELETE FROM `".$table."` WHERE `like_".$type."_no`=".$no." AND `cookie_id`='".$this->_db->real_escape_string($this->_cookie_value)."'"); if($result!==TRUE) { $this->_db->rollback(); return array(); } } $this->_db->commit(); return array('html' => $this->{'get_'.$type.'_button'}($no, $member_no)); } catch(Exception $e) { throw $e; } } /** * _get_button_html * @param string $type * @param integer $no * @param boolean $is_on * @param integer $like_cnt * @throws Exception * @return string */ private function _get_button_html($type, $no, $is_on=FALSE, $like_cnt=0) { try { $class = $this->_add_class('btn_like', $is_on ? $this->_btn_on_class : $this->_btn_off_class); $staus = $is_on ? 'on' : 'off'; $btn_name = str_replace('::count::', $like_cnt, $this->_btn_name); $attr = array( 'type' => 'button', 'id' => 'btn_like_'.$type.'_'.$no, 'class' => $class, 'style' => 'cursor: pointer;', 'data-type' => $type, 'data-no' => $no, 'data-status' => $staus ); if($this->_use_tooltip===TRUE) { $tooltip = $is_on ? $this->_btn_on_tooltip : $this->_btn_off_tooltip; $tooltip = str_replace('::count::', $like_cnt, $tooltip); $attr['data-toggle'] = 'tooltip'; $attr['title'] = $tooltip; } $html = '<button'; foreach($attr as $key => $val) $html .= ' '.$key.'="'.$val.'"'; $html .= '>'.$btn_name.'</button>'; return $html; } catch(Exception $e) { throw $e; } } /** * _set_lot_map * @param integer $lot_no * @throws Exception */ private function _set_lot_map($lot_no) { try { $this->_lot_map = array(); $sql = "SELECT `lt`.* "; $sql .= "FROM `like_lot` lt "; $sql .= "WHERE `lt`.`like_lot_no`=".$lot_no; $result = $this->_db->query($sql); if(is_object($result) && $result->num_rows>0) { $count = $result->num_rows; $this->_lot_map[$lot_no] = array('count' => $count); while($row = $result->fetch_assoc()) { if(!empty($row['like_lot_member_no'])) { if(!array_key_exists('member_no', $this->_lot_map[$lot_no])) $this->_lot_map[$lot_no]['member_no'] = array(); $this->_lot_map[$lot_no]['member_no'][$row['like_lot_member_no']] = $row['like_no']; } if(!empty($row['cookie_id'])) { if(!array_key_exists('cookie_id', $this->_lot_map[$lot_no])) $this->_lot_map[$lot_no]['cookie_id'] = array(); $this->_lot_map[$lot_no]['cookie_id'][$row['cookie_id']] = $row['like_no']; } } } } catch(Exception $e) { throw $e; } } /** * _add_class * @param unknown $class * @param unknown $add * @throws Exception * @return string */ private function _add_class($class, $add) { try { if(!is_array($class)) $class = explode(' ', $class); if(!is_array($add)) $add = explode(' ', $add); $class = array_merge($class, $add); return implode(' ', $class); } catch(Exception $e) { throw $e; } } /** * _random_str * @param unknown $len * @throws Exception * @return string */ private function _random_str($len=8) { try { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, ceil($len / strlen($pool)))), 0, $len); } catch(Exception $e) { throw $e; } } /** * _trans_begin * @throws Exception * @return unknown */ private function _trans_begin() { try { $this->_db->autocommit(FALSE); return version_compare(PHP_VERSION, '5.5', '>=') ? $this->_db->begin_transaction() : $this->_db->query('START TRANSACTION'); } catch(Exception $e) { throw $e; } } } ?>

以上は、2つあるうち2つ並べて正常に動く方のクラスです。もう一方はクラス名と、テーブルのカラム名程度しか違いない状況ですが、クラス名は違えど同じソースの場合に注意すべき点などありましたご教示いただけると幸いです。何度見直しても分からずで・・・

お忙しい中恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

javascriptのイベント処理の際、重複した処理にて片方のプログラムが働いていたようです。

投稿2020/05/25 12:45

chapp

総合スコア233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問