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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

2216閲覧

PHPで実行したSELECT COUNT(*)文の結果をJavaScriptでうまく処理できない

FUGAMARU-MCPE

総合スコア33

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/03/12 15:07

JavaScript(jQuery)でAjaxを使ってPHPにデーターを送信、送信されたデーターを基にPHPがMySQLサーバーのテーブル内に該当するデーターがあるか確認、結果をJavaScriptに戻す、結果によって処理を変える、ということをやりたいのですが、「結果によって処理を変える」というところでうまく条件分岐ができていません。そこまではうまくいっています。

こちらがコードになります。

JavaScript

1$.ajax({ 2 type: "POST", 3 url: "/login.php", 4 data: 'id=' + getQueryVariable('id') + '&username=' + $('#username').val() + '&password=' + $("#password").val() 5}).done(function(result){ 6 if (result == "1"){ 7 //データーがあった場合の処理 8 }else{ 9 alert("データーがありませんでした"); 10 } 11});

↓login.php↓

PHP

1<?php 2$mysqli = new mysqli('IP', 'ユーザー名', 'パスワード', 'データーベース名'); 3$mysqli->set_charset('utf8'); 4$result = $mysqli->query("SELECT COUNT(*) AS result FROM users WHERE id = '".$_POST["id"]."' AND name = '".$_POST["username"]."' AND password = '".$_POST["password"]."'"); 5$row = $result->fetch_row(); 6echo $row[0]; 7$mysqli->close(); 8?>

テーブル内に同じデーターは存在しないと考えて下さい。
PHPの$row[0]はstringだったので、JavaScript側では1を文字列として扱っています。
JavaScript側の条件分岐の手前で一旦$row[0]の中身を表示させてみたのですが、データーの有無によって1か0が切り替わっているのを確認したので、ちゃんとカウントはできています。
しかし、その後の条件分岐のところでresultの中身が1なのにもかかわらず「データーがありませんでした」と表示されてしまいます。
resultの中身を表示させると、データーがあった場合、「1string(1) "1"」、データーがなかった場合「0string(1) "0"」と表示されました。

どこがおかしいのでしょうか?アドバイス下さい。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

以下のようにデータベースを定義して、適当にデータを入れました。

SQL

1CREATE TABLE `sample` ( 2 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 `name` VARCHAR(255) NOT NULL DEFAULT '', 4 `password` VARCHAR(255) NOT NULL DEFAULT '' 5) ENGINE = InnoDB;

SQL

1INSERT INTO 2 `sample`(`id`, `name`, `password`) 3VALUES 4 (NULL, 'name1', 'pass1'), 5 (NULL, 'name2', 'pass2'), 6 (NULL, 'name3', 'pass3'), 7 (NULL, 'name4', 'pass4'), 8 (NULL, 'name5', 'pass5')

質問者さんのコードではプリペアドステートメントを使用していないようなので、プリペアドステートメントを使用したほうが良いと思います。また、Noticeレベルのエラーが出てしまうのでそのチェックも行ったほうが良いと思います。

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>タイトル</title> 6</head> 7<body> 8<form> 9 <label> 10 <input type="text" name="username" id="username"> 11 </label> 12 <label> 13 <input type="text" name="password" id="password"> 14 </label> 15 <input type="button" id="button1"> 16</form> 17<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 18<script> 19 function getQueryVariable() { 20 if (Number.isInteger(parseInt(location.search.split("id=")[1], 10))) { 21 return (parseInt(location.search.split("id=")[1], 10)); 22 } else { 23 return false; 24 } 25 } 26 27 $("#button1").on("click", function () { 28 if (Number.isInteger(getQueryVariable())) { 29 $.ajax({ 30 type: "POST", 31 url: "./login.php", 32 data: "id=" + getQueryVariable() + "&name=" + $("#username").val() + "&pass=" + $("#password").val() 33 }).done(function (result) { 34 if (result === "1") { 35 alert(result); 36 } else { 37 alert("該当結果なし。"); 38 } 39 }); 40 } 41 }); 42</script> 43</body> 44</html>

PHP

1<?php 2if ($_SERVER["REQUEST_METHOD"] === "POST") { 3 if (isset($_POST["id"]) && isset($_POST["name"]) && $_POST["pass"]) { 4 $mysqli = new mysqli("localhost", "root", "pass", "sample"); 5 6 if ($mysqli->connect_error) { 7 exit($mysqli->connect_error); 8 } else { 9 $mysqli->set_charset("utf8"); 10 } 11 12 $id = $_POST["id"]; 13 $name = $_POST["name"]; 14 $pass = $_POST["pass"]; 15 16 $sql = "SELECT COUNT(*) AS result FROM sample01 WHERE id = ? AND name = ? AND password = ?"; 17 if ($stmt = $mysqli->prepare($sql)) { 18 $stmt->bind_param("iss", $id, $name, $pass); 19 $stmt->execute(); 20 $result = $stmt->get_result()->fetch_row(); 21 echo $result[0]; 22 $stmt->close(); 23 } 24 $mysqli->close(); 25 } 26}

投稿2017/03/12 22:16

s8_chu

総合スコア14731

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

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

FUGAMARU-MCPE

2017/03/13 10:28 編集

丁寧にサンプルコードまで付けていただきありがとうございました。 お陰様でSQLインジェクションに対する理解と、対策ができました。 無事、ログイン処理が行えるようになりました。
guest

0

質問への回答ではないですが、このlogin.phpはSQLインジェクションの格好の的です。プリペアードステートメントを使用してください。

投稿2017/03/12 16:59

SVC34

総合スコア1149

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

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

FUGAMARU-MCPE

2017/03/13 10:27

SQLインジェクションという言葉を初めて知りました。 ありがとうございました。
guest

0

PHPの$row[0]はstringだったので、JavaScript側では1を文字列として扱っています。

多分理由はココです

javascript

1var result = 1 2alert(result == "1") 3alert(result === "1")

の違いを確認してみて下さい

投稿2017/03/12 16:50

YoshiakiSatoh

総合スコア37

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

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

FUGAMARU-MCPE

2017/03/13 10:27

原因の1つでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問