{"id":4105,"date":"2020-12-29T01:01:46","date_gmt":"2020-12-28T16:01:46","guid":{"rendered":"https:\/\/okamurax.com\/?p=4105"},"modified":"2020-12-29T02:35:23","modified_gmt":"2020-12-28T17:35:23","slug":"php-vue-js-mysql%e3%81%8b%e3%82%89%e5%8f%96%e5%be%97json%ef%bc%8b%e6%9b%b4%e6%96%b0","status":"publish","type":"post","link":"https:\/\/appbay.org\/?p=4105","title":{"rendered":"PHP Vue.js MySQL\u304b\u3089\u53d6\u5f97(JSON)\uff0b\u66f4\u65b0"},"content":{"rendered":"<p>PHP\u5fa9\u7fd2\u306e\u305f\u3081\u3001<br \/>\n\u30fbPHP\u3067\u306e\u30ed\u30b0\u30a4\u30f3\uff0b\u30ed\u30b0\u30a2\u30a6\u30c8<br \/>\n\u30fbVue.jp\u2192PHP\u2192MySQL\u3067\u306e\u53d6\u5f97(JSON)\uff0b\u66f4\u65b0<br \/>\n\u3092\u4f5c\u6210\u3057\u3066\u307f\u305f\u3002<\/p>\n<p>config.php<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\ndefine(\"BASE_URL\", \"http:\/\/\" . $_SERVER[\"HTTP_HOST\"] . \"\/app1\");\r\n\r\ndefine(\"DB_DSN\", \"mysql:host=localhost;dbname=test_db;charset=utf8\");\r\ndefine(\"DB_USR\", \"root\");\r\ndefine(\"DB_PWD\", \"xxx\");\r\n\r\n$auth = [\r\n\t\"taro\" =&gt; [\"id\" =&gt; \"100\", \"pwd\" =&gt; '$2y$10$h8HbPPXw99gmOdhWWYgxl.oGBMPEBmTtE5YWW25dq7T.TpxTcqRAm'],\r\n\t\"jiro\" =&gt; [\"id\" =&gt; \"200\", \"pwd\" =&gt; '$2y$10$A9XhGbn\/K0O9OG\/\/Ei2.fe\/4i8\/VSgixJ2mSYs5w25\/etTLAy8AYm'],\r\n];\r\n\r\n\/\/ php -r \"echo password_hash('\u30d1\u30b9\u30ef\u30fc\u30c9', PASSWORD_DEFAULT);\"<\/pre>\n<p>index.php<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\nsession_start();\r\n\r\nini_set(\"display_errors\", 1);\r\nini_set(\"error_reporting\", E_ALL);\r\n\r\nrequire_once \"config.php\";\r\n\r\nif (!isset($_SESSION[\"id\"])) {\r\n  header(\"Location: \" . BASE_URL . \"\/login.php\");\r\n  exit;\r\n}\r\n\r\n?&gt;\r\n\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"ja\"&gt;\r\n&lt;head&gt;\r\n  &lt;meta charset=\"UTF-8\"&gt;\r\n  &lt;title&gt;test&lt;\/title&gt;\r\n  &lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/vue\/dist\/vue.js\"&gt;&lt;\/script&gt;\r\n  &lt;script src=\"https:\/\/unpkg.com\/axios\/dist\/axios.min.js\"&gt;&lt;\/script&gt;\r\n  &lt;style&gt;\r\n  table{\r\n    border-collapse: collapse;\r\n  }\r\n  td{\r\n    min-width: 100px;\r\n    border: 1px solid #ccc;\r\n    \r\n  }\r\n  &lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div id=\"app\"&gt;\r\n\r\n  &lt;form&gt;\r\n    &lt;input type=\"button\" value=\"\u53d6\u5f97\" v-on:click=\"select\"&gt;\r\n  &lt;\/form&gt;\r\n\r\n  &lt;table&gt;\r\n    &lt;tr v-for=\"item in items\" v-bind:data-id=\"item.id\"&gt;\r\n      &lt;td v-on:click=\"td_click\"&gt;{{item.id}}&lt;\/td&gt;\r\n      &lt;td v-on:click=\"td_click\"&gt;{{item.name}}&lt;\/td&gt;\r\n      &lt;td v-on:click=\"td_click\"&gt;{{item.age}}&lt;\/td&gt;\r\n    &lt;\/tr&gt;\r\n  &lt;\/table&gt;\r\n\r\n  &lt;form&gt;\r\n    ID:&lt;input type=\"text\" v-model=\"model['id']\" &gt;\r\n    Name:&lt;input type=\"text\" v-model=\"model['name']\"&gt;\r\n    Age:&lt;input type=\"text\" v-model=\"model['age']\"&gt;\r\n    &lt;input type=\"button\" value=\"\u66f4\u65b0\" v-on:click=\"update\"&gt;\r\n  &lt;\/form&gt;\r\n\r\n&lt;\/div&gt;\r\n\r\n&lt;a href=\"&lt;?php echo BASE_URL . \"\/logout.php\" ?&gt;\"&gt;Logout&lt;\/a&gt;\r\n\r\n&lt;script&gt;\r\n\r\nlet v = new Vue({\r\n  el: \"#app\",\r\n  data: {\r\n\r\n    model: {\r\n      \"id\": \"\",\r\n      \"name\": \"\",\r\n      \"age\": \"\"\r\n    },\r\n    url: \"&lt;?php echo BASE_URL . \"\/json.php\" ?&gt;\",\r\n    items: null\r\n\r\n  },\r\n  methods: {\r\n    \r\n    clear(){\r\n\r\n      this.items = []; \r\n      this.model[\"id\"] = \"\";\r\n      this.model[\"name\"] = \"\";\r\n      this.model[\"age\"] = \"\";\r\n\r\n    },\r\n    td_click(e) {\r\n\r\n      let parent = e.currentTarget.parentNode;\r\n      this.model[\"id\"] = parent.children[0].textContent;\r\n      this.model[\"name\"] = parent.children[1].textContent;\r\n      this.model[\"age\"] = parent.children[2].textContent;\r\n\r\n    },\r\n    select() {\r\n\r\n      let params = new URLSearchParams();\r\n      params.append(\"query_type\", 1);\r\n\r\n      this.post(params, true);\r\n\r\n    },\r\n    update() {\r\n\r\n      let params = new URLSearchParams();\r\n      params.append(\"query_type\", 2);\r\n      params.append(\"id\", this.model[\"id\"]);\r\n      params.append(\"name\", this.model[\"name\"]);\r\n      params.append(\"age\", this.model[\"age\"]);\r\n\r\n      this.post(params, false);\r\n      this.clear();\r\n\r\n    },\r\n    post(params, exists_response) {\r\n      console.log(params);\r\n      axios\r\n        .post(v.url, params)\r\n        .then(response =&gt; {\r\n\r\n          if(exists_response) this.items = response.data;\r\n\r\n        })\r\n        .catch(error =&gt; {\r\n\r\n          alert(error);\r\n\r\n      });\r\n    }\r\n  }\r\n})\r\n\r\n&lt;\/script&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>json.php<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\nsession_start();\r\n\r\nini_set(\"display_errors\", 1);\r\nini_set(\"error_reporting\", E_ALL);\r\n\r\nrequire \"config.php\";\r\n\r\nif (!isset($_SESSION[\"id\"])) exit;\r\n\r\n$query_type = filter_input(INPUT_POST, \"query_type\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n$id = filter_input(INPUT_POST, \"id\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n$name = filter_input(INPUT_POST, \"name\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n$age = filter_input(INPUT_POST, \"age\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n\r\nif ($_SERVER[\"REQUEST_METHOD\"] === \"POST\" &amp;&amp; isset($query_type)) {\r\n\r\n  $json = new Json();\r\n\r\n  switch ($query_type){\r\n\r\n    case 1:\r\n      $columnList = array(\"id\",\"name\",\"age\");\r\n      $json-&gt;ExecuteQuery(\"select * from test_table\", $columnList);     \r\n      break;\r\n\r\n    case 2:\r\n      $json-&gt;ExecuteNonQuery(\r\n        \"update test_table set name = :name, age = :age where id = :id\", \r\n        array(\":name\"=&gt;$name, \":age\"=&gt;$age, \":id\"=&gt;$id)\r\n      );\r\n      break;\r\n\r\n  }\r\n}\r\n\r\n\/\/ class\r\n\r\nclass Json{\r\n\r\n  function Connection() {\r\n\r\n    try {\r\n\r\n      return new PDO(DB_DSN, DB_USR, DB_PWD);\r\n\r\n    } catch (Exception $e) {\r\n      \r\n      http_response_code(401);\r\n      exit;\r\n\r\n    }\r\n  }\r\n\r\n  function ExecuteNonQuery($sql, $valueList){\r\n\r\n    $stmt = $this-&gt;Connection()-&gt;prepare($sql);\r\n    $stmt-&gt;execute($valueList);\r\n\r\n  }\r\n\r\n  function ExecuteQuery($sql, $columnList) {\r\n\r\n    $result = array();\r\n    foreach($this-&gt;Connection()-&gt;query($sql) as $row){\r\n      $tmp = array();\r\n      foreach($columnList as $column){\r\n        $tmp[$column] = $row[$column];\r\n      }\r\n      array_push($result, $tmp);\r\n    }\r\n    header('Content-type: application\/json');\r\n    echo json_encode($result, JSON_UNESCAPED_UNICODE);\r\n\r\n  }\r\n}\r\n<\/pre>\n<p>login.php<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\nsession_start();\r\n\r\nini_set(\"display_errors\", 1);\r\nini_set(\"error_reporting\", E_ALL);\r\n\r\nrequire_once \"config.php\";\r\n\r\n$usr = filter_input(INPUT_POST, \"usr\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n$pwd = filter_input(INPUT_POST, \"pwd\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n\r\n$token = filter_input(INPUT_POST, \"token\", FILTER_SANITIZE_FULL_SPECIAL_CHARS); \r\n\r\nif ($_SERVER[\"REQUEST_METHOD\"] === \"POST\" &amp;&amp; $token === $_SESSION[\"token\"]) {\r\n\r\n\tif (isset($auth[$usr]) &amp;&amp; password_verify($pwd, $auth[$usr][\"pwd\"])) {\r\n\r\n\t\tsession_regenerate_id();\r\n\t\t$_SESSION[\"id\"] = $auth[$usr][\"id\"];\r\n\t\r\n\t\theader(\"Location: \" . BASE_URL . \"\/index.php\");\r\n\t\texit;\r\n\r\n\t} else {\r\n\r\n\t\techo \"&lt;script&gt;(function(){alert('\u30e6\u30fc\u30b6\u30fc\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9055\u3044\u307e\u3059\u3002');}());&lt;\/script&gt;\";\r\n\r\n\t}\r\n}\r\n\r\n$_SESSION[\"token\"] = md5(mt_rand());\r\n\r\n?&gt;\r\n\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"ja\"&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=\"UTF-8\"&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;form method=\"post\"&gt;\r\n\t\u30e6\u30fc\u30b6\u30fc\u540d: &lt;input type=\"text\" name=\"usr\"&gt;\r\n\t\u30d1\u30b9\u30ef\u30fc\u30c9: &lt;input type=\"text\" name=\"pwd\"&gt;\r\n\t&lt;input type=\"hidden\" name=\"token\" value=\"&lt;?php echo $_SESSION[\"token\"]; ?&gt;\"&gt;\r\n\t&lt;input type=\"submit\"&gt;\r\n&lt;\/form&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>logout.php<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\nsession_start();\r\n\r\nini_set(\"display_errors\", 1);\r\nini_set(\"error_reporting\", E_ALL);\r\n\r\nrequire_once \"config.php\";\r\n\r\nsession_destroy();\r\n\r\nheader(\"Location: \" . BASE_URL . \"\/login.php\");<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP\u5fa9\u7fd2\u306e\u305f\u3081\u3001 \u30fbPHP\u3067\u306e\u30ed\u30b0\u30a4\u30f3\uff0b\u30ed\u30b0\u30a2\u30a6\u30c8 \u30fbVue.jp\u2192PHP\u2192MySQL\u3067\u306e\u53d6\u5f97(JSON)\uff0b\u66f4\u65b0 \u3092\u4f5c\u6210\u3057\u3066\u307f\u305f\u3002 config.php &lt;?php define(&#8220;BASE_URL&#8221;, &#8220;htt &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/appbay.org\/?p=4105\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;PHP Vue.js MySQL\u304b\u3089\u53d6\u5f97(JSON)\uff0b\u66f4\u65b0&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[3,139],"class_list":["post-4105","post","type-post","status-publish","format-standard","hentry","category-1","tag-php","tag-vue-js"],"_links":{"self":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/4105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4105"}],"version-history":[{"count":4,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/4105\/revisions"}],"predecessor-version":[{"id":4110,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/4105\/revisions\/4110"}],"wp:attachment":[{"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}