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

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

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

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

mysqli

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

5回答

4685閲覧

PHPとMySQL、phpMyAdminとの連携が上手くいかない。

fackingbee

総合スコア12

MySQL

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

mysqli

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2017/01/09 07:27

平素より大変お世話になっております。

当方、PHPの初学者でございます。

(C#やhtmlはある程度やっているので、関数や条件文や演算子など、オブジェクト指向についての基本的なことは理解しているつもりです)

データベースを学ぶ必要性を感じたので、ある講座を参考にPHPの学習を始めたところです。
基本的な事項を押さえた上で、PHPとMySQLを使用し、実際に簡単なデータベースとのやりとりを行ってみようと思った矢先なのですが、いきなりつまづいてしまい、ネットで検索しても的を得た回答が得られず、全く進めなくなってしまったので、この度ご相談に上がりました。

現象としましては、

Webページでユーザーがフォームを打ち込み、その値をデータベースに送るという段階で、以下の実装を行うという学習内容の中で、(あ、xamppを使用しています)

<?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ $fname = $_POST['fname']; $lname = $_POST['lname']; $email = $_POST['email']; $gender = $_POST['gender']; $age = $_POST['age']; $comments = $_POST['comments']; $password = $_POST['password']; if(!empty($fname) && !empty($lname) && !empty($email) && !empty($gender) && !empty($age) && !empty($comments) && !empty($password)){ include ('connection.php'); mysqli_query($dbc,"INSERT INTO users(first_name,last_name,email,gernder,age,comments,password) VALUES('$fname','$lname','$email','$gender','$age','$comments','$password')"); $registered = mysqli_affected_rows($dbc); echo $registered."row is affected, everything worked fine!"; }else{ echo "<P style='color:red;'>ERROE: you left some values in blank!</p>"; } }else{ echo "<h2>Please complete the form...</h2>"; } ?> <html> <head> <title></title> </head> <body> <form action="userform.php" method="post"> <p>First Name: <input type="text" name="fname" size="20" maxlength="50" /></p> <p>Last Name: <input type="text" name="lname" size="20" maxlength="50" /></p> <p>Email: <input type="text" name="email" size="40" maxlength="50" /></p> <p>Gender: <input type="radio" name="gender" value="M" /> Male<input type="radio" name="gender" value="F" /> Famale</p> <p>Age: <select name="age"> <option value="0~29">Under 30</option> <option value="30~60">Betwen 30 and 60</option> <option value="60+">Over 60</option> </select></p> <p>Comments:<br /><textarea name="comments" rows="3" cols="40" maxlength="200"></textarea></p> <p>Password: <input type="password" name="password" maxlength="50"></p> <p><input type="submit" name="submit" value="Submit" /></p> </form> </body> </html>
<?php $hostname = "localhost"; $username = "root"; $password1 = ""; $dbname = "MyFirstDatabase"; $dbc = mysqli_connect($hostname, $username, $password1, $dbname) OR die("could not connect to database, ERROR:".mysqli_connect_error()); mysqli_set_charset($dbc, "utf8"); ?>

実際の以下のようなWebページのフォームから、

イメージ説明

ユーザーが全て埋めることで、phpMyAdminに値が渡されるはずなのですが、

まず、本来『1 row』となりphpMyAdminに追加・表示されるはずが『−1 row』となってしまい、何も表示されずに困っています。(恐らくこの段階で通信できていないと思われます。また、$registeredが−1になってしまっているので、mysqli_affected_rows($dbc);がおかしいとは思うのですが)

イメージ説明

イメージ説明

maxlengthと値の長さを揃える、項目の順番も遵守する、など、言われたことをそのままやってるつもりなのですが、どうも上手くいきません。これだけの状況で判断できかねるかと存じますが、もし何か打開策があれば、ご教授願えると幸いです。

何卒よろしくお願い申し上げます。

(PCは先月購入したiMacで、その時に各々インストールしたので、OSもPHPも比較的新しいものだと思います)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/01/09 07:44

users テーブルの定義がわかるように、SHOW CREATE TABLE users; で得られる結果を記述してください。
s8_chu

2017/01/09 07:51

mysqli_errorで表示されたエラーを追記してください。
ockeghem

2017/01/10 00:52

既に回答者の方々が指摘されているように、このサンプルにはセキュリティ上の問題(SQLインジェクション)があります。よろしければ、サンプルの出典を教えていただけないでしょうか?
guest

回答5

0

回答作っているうちに、すでにいっぱい回答がありますね。せっかく作っておいたのでw
DBの定義が提示されていないので、未検証です。

php

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4 5function h($string) 6{ 7 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 8} 9 10if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 11 12 $hostname = "localhost"; 13 $username = "root"; 14 $dbpass = "パスワード"; 15 $dbname = "データベース名"; 16 17 $link = mysqli_connect($hostname, $username, $dbpass, $dbname) or die("could not connect to database, ERROR:" . mysqli_connect_error()); 18 mysqli_set_charset($link, "utf8"); 19 20 $fname = filter_input(INPUT_POST, 'fname'); 21 $lname = filter_input(INPUT_POST, 'lname'); 22 $email = filter_input(INPUT_POST, 'email'); 23 $gender = filter_input(INPUT_POST, 'gender'); 24 $age = filter_input(INPUT_POST, 'age'); 25 $comments = filter_input(INPUT_POST, 'comments'); 26 $password = filter_input(INPUT_POST, 'password'); 27 28 // 入力チェック 29 $errors = []; 30 if (empty($fname)) { 31 $errors['fname'] = '入力必須です。'; 32 } 33 if (empty($lname)) { 34 $errors['lname'] = '入力必須です。'; 35 } 36 if (empty($email)) { 37 $errors['email'] = '入力必須です。'; 38 } 39 if (empty($gender)) { 40 $errors['gender'] = '入力必須です。'; 41 } 42 if (empty($age)) { 43 $errors['age'] = '入力必須です。'; 44 } 45 if (empty($comments)) { 46 $errors['comments'] = '入力必須です。'; 47 } 48 if (empty($password)) { 49 $errors['password'] = '入力必須です。'; 50 } 51 52 if (count($errors) === 0) { 53 $sql = 'INSERT INTO users ('; 54 $sql .= 'first_name, last_name, email, gender, age, comments, password'; 55 $sql .= ') VALUES ('; 56 $sql .= '?, ?, ?, ?, ?, ?, ?'; 57 $sql .= ')'; 58 59 /* プリペアドステートメントを作成します */ 60 $stmt = mysqli_prepare($link, $sql); 61 62 /* マーカにパラメータをバインドします */ 63 mysqli_stmt_bind_param($stmt, "sssssss" 64 , $fname 65 , $lname 66 , $email 67 , $gender 68 , $age 69 , $comments 70 , $password 71 ); 72 73 /* クエリを実行します */ 74 mysqli_stmt_execute($stmt); 75 76 /* 追加した行数 */ 77 $registered = mysqli_affected_rows($link); 78 } 79} 80?> 81<!DOCTYPE HTML> 82<html lang="ja"> 83 <head> 84 <meta charset="UTF-8"> 85 <title></title> 86 </head> 87 <body> 88 <?php if (isset($registered)) : ?> 89 <p>affected_rows: <?= h($registered); ?></p> 90 <?php endif; ?> 91 92 <form action="" method="post"> 93 <p> 94 <label for="fname">First Name: </label> 95 <input type="text" name="fname" id="fname" /> 96 <?php if (isset($errors['fname'])): ?> 97 <div class="error"> 98 <?= h($errors['fname']); ?> 99 </div> 100 <?php endif; ?> 101 </p> 102 <p> 103 <label for="lname">Last Name: </label> 104 <input type="text" name="lname" id="lname" /> 105 <?php if (isset($errors['lname'])): ?> 106 <div class="error"> 107 <?= h($errors['lname']); ?> 108 </div> 109 <?php endif; ?> 110 </p> 111 <p> 112 <label for="email">Email: </label> 113 <input type="text" name="email" id="email" /> 114 <?php if (isset($errors['email'])): ?> 115 <div class="error"> 116 <?= h($errors['email']); ?> 117 </div> 118 <?php endif; ?> 119 </p> 120 <p> 121 Gender: 122 <label> 123 <input type="radio" name="gender" value="M" /> 124 Male 125 </label> 126 <label> 127 <input type="radio" name="gender" value="F" /> 128 Female 129 </label> 130 <?php if (isset($errors['gender'])): ?> 131 <div class="error"> 132 <?= h($errors['gender']); ?> 133 </div> 134 <?php endif; ?> 135 </p> 136 <p> 137 <label for="age">Age:</label> 138 <select name="age" id="age"> 139 <option value="0~29">Under 30</option> 140 <option value="30~60">Betwen 30 and 60</option> 141 <option value="60+">Over 60</option> 142 </select> 143 <?php if (isset($errors['age'])): ?> 144 <div class="error"> 145 <?= h($errors['age']); ?> 146 </div> 147 <?php endif; ?> 148 </p> 149 <p> 150 <label for="comments">Comments:</label> 151 <textarea name="comments" id="comments" rows="3" cols="40"></textarea> 152 <?php if (isset($errors['comments'])): ?> 153 <div class="error"> 154 <?= h($errors['comments']); ?> 155 </div> 156 <?php endif; ?> 157 </p> 158 <p> 159 <label for="password">Password:</label> 160 <input type="password" name="password" id="password" maxlength="50"> 161 <?php if (isset($errors['password'])): ?> 162 <div class="error"> 163 <?= h($errors['password']); ?> 164 </div> 165 <?php endif; ?> 166 </p> 167 <p> 168 <input type="submit" value="Submit" /> 169 </p> 170 </form> 171 </body> 172</html>

投稿2017/01/09 08:27

編集2017/01/09 08:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fackingbee

2017/01/09 14:07

コードまで作成していただき、本当にありがとうございました。時間がある時に検証してみます。何か分かりましたら、また追って連絡いたしますのでもうしばらくお待ちいただければ幸いです。
guest

0

ベストアンサー

SQL文が間違っているのではないかと考えました。
以下のように行うとどうでしょうか。

PHP

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4const HOST = "localhost"; 5const USER_NAME = "root"; 6const PASSWORD = "password"; 7const DB_NAME = "DBMAMe"; 8 9if ($_SERVER['REQUEST_METHOD'] == 'POST') { 10 $fname = $_POST['fname']; 11 $lname = $_POST['lname']; 12 $email = $_POST['email']; 13 $gender = $_POST['gender']; 14 $age = $_POST['age']; 15 $comments = $_POST['comments']; 16 $password = $_POST['password']; 17 18 if (!empty($fname) && 19 !empty($lname) && 20 !empty($email) && 21 !empty($gender) && 22 !empty($age) && 23 !empty($comments) && 24 !empty($password) 25 ) { 26 mysqli_report(MYSQLI_REPORT_ALL); 27 try { 28 $dbc = new mysqli(HOST, USER_NAME, PASSWORD, DB_NAME); 29 mysqli_set_charset($dbc, 'utf8'); 30 $stmt = $dbc->prepare("INSERT INTO `table`(`fname`, `lname`, `email`, `gender`, `age`, `comments`, `password`) VALUES (?,?,?,?,?,?,?)"); 31 $stmt->bind_param('sssssss', $fname, $lname, $email, $gender, $age, $comments, $password); 32 $stmt->execute(); 33 $registered = mysqli_affected_rows($dbc); 34 echo $registered . "row is affected, everything worked fine!"; 35 } catch (Exception $exception) { 36 echo $exception->getMessage(); 37 exit(); 38 } 39 } else { 40 echo "<P style='color:red;'>ERROE: you left some values in blank!</p>"; 41 } 42} else { 43 echo "<h2>Please complete the form...</h2>"; 44} 45?> 46<!DOCTYPE html> 47<html lang="ja"> 48<head> 49 <title>タイトル</title> 50</head> 51<body> 52<form action="" method="post"> 53 <label>First Name: 54 <input type="text" name="fname" size="20" maxlength="50"> 55 </label> 56 <label>Last Name: 57 <input type="text" name="lname" size="20" maxlength="50"> 58 </label> 59 <label>Email: 60 <input type="text" name="email" size="40" maxlength="50"> 61 </label> 62 <fieldset>Gender: 63 <label>Male 64 <input type="radio" name="gender" value="M"> 65 </label> 66 <label>Famale 67 <input type="radio" name="gender" value="F"> 68 </label> 69 </fieldset> 70 <label>Age: 71 <select name="age"> 72 <option value="0~29">Under 30</option> 73 <option value="30~60">Betwen 30 and 60</option> 74 <option value="60+">Over 60</option> 75 </select> 76 </label> 77 <label>Comments: 78 <textarea name="comments" rows="3" cols="40" maxlength="200"></textarea> 79 </label> 80 <label>Password: 81 <input type="password" name="password" maxlength="50"> 82 </label> 83 <p><input type="submit" name="submit" value="Submit"/></p> 84</form> 85</body> 86</html>

投稿2017/01/09 08:23

編集2017/01/09 08:24
s8_chu

総合スコア14731

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

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

fackingbee

2017/01/09 14:03

コードまで作成していただき、本当にありがとうございました。時間がある時に検証してみます。何か分かりましたら、また追って連絡いたしますのでもうしばらくお待ちいただければと思います。
guest

0

解決策は他のスゴイ方々に任せるとして、小さなツッコミを。

phpMyAdminに値が渡されるはず

最近phpMyAdminについて勘違いしている質問者を何人か見かけます。
phpMyAdminは簡単に言うと「MySQLに入っているデータを管理するためのPHP製ツール」です。
phpMyAdminそれ自身にデータを格納するのではありません。
MySQLというデータベースにデータを入れ、それを見やすく表示したり操作しやすくしてくれるツールがphpMyAdminです。

投稿2017/01/09 14:54

編集2017/01/09 14:55
zico_teratail

総合スコア907

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

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

0

なんだか知識がチグハグですね。
mysqli_affected_rows
-1 が返ってきているので、クエリがエラーを返したことを示します。

"INSERT INTO users(first_name,last_name,email,gernder,age,comments,password) VALUES('$fname','$lname','$email','$gender','$age','$comments','$password')"
が正しいSQL文になっていないと考えられるので、
mysqli_query の手前で、echo 等で内容を表示してみると良いです。

スクリプトのエラー表示をさせる対応でも良いかもしれません。下記をスクリプトの頭に追加して下さい。
エラーを表示するようにするおまじないです。

php

1ini_set('display_errors', 1); 2error_reporting(E_ALL);

こちらのサンプル、あまりセキュリティを意識していないものなので、実践的には意味がありません。

フォームの取扱であれば、このスクリプトを完成後に以下を読み、追加で理解を深めて下さい。
$_GET, $_POSTなどを受け取る際の処理

また、DB操作の取扱はプリペアドステートメントと言うものを利用することを推奨します。
mysqli_prepare

個人的にはPDOと呼ばれる、別の操作方法で利用するケースが多く、そちらで操作体系を学ぶのに役立ったサイトが以下です。
PHPでデータベースに接続するときのまとめ

あまり良いサンプルではないので、さっさと卒業しましょう。

投稿2017/01/09 08:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/01/09 08:33

あ、実践的なソースを Kosuke_Shibuya さんが提示してくれましたねw あちらのソースを見ながら、理解を深めるのが良いです。
fackingbee

2017/01/09 13:57

まだまだ理解不足ですが、皆様のアドバイスを参考にこれからもっと理解を深めていければと思います。 検証まで少し時間がかかるので、何か進展がありましたまた連絡したいと思います。もうしばらくお待ちいただければと思います。
退会済みユーザー

退会済みユーザー

2017/01/09 14:30

気がついてないみたいですけど、だれも今のエラーが解決する方法書いてないですよ。 クエリがエラーを返したということは、fackingbee さんの提示したソースに根本的な間違いがあると思われますが、新しくコードを書いてくれた人たちは、提示されたものを元に作ってるんで、基本的に同じ箇所でエラーが出ます。 まずはそこからですが、アドバイスが追加で欲しければ、users テーブルの定義が必要です。
guest

0

mysqli_affected_rows()が-1を返すのは、クエリがエラーを返したを返した場合です。

PHPマニュアル

phpMyAdminで直接SQLを実行してみて、エラーが出るか検証してみてください。

投稿2017/01/09 07:50

hiroshi.kato

総合スコア93

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

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

fackingbee

2017/01/09 13:54

了解致しました。他の方からご教授いただいたアドバイスを元に、検証してみます。何か進展があればまたご連絡致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問