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

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

ただいまの
回答率

90.49%

  • PHP

    20770questions

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

  • MySQL

    5990questions

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

  • phpMyAdmin

    666questions

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

  • mysqli

    161questions

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

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

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 1,161

fackingbee

score 6

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

当方、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も比較的新しいものだと思います)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kosuke_Shibuya

    2017/01/09 16:44

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

    キャンセル

  • s8_chu

    2017/01/09 16:51

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

    キャンセル

  • ockeghem

    2017/01/10 09:52

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

    キャンセル

回答 5

checkベストアンサー

+3

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

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
const HOST = "localhost";
const USER_NAME = "root";
const PASSWORD = "password";
const DB_NAME = "DBMAMe";

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)
    ) {
        mysqli_report(MYSQLI_REPORT_ALL);
        try {
            $dbc = new mysqli(HOST, USER_NAME, PASSWORD, DB_NAME);
            mysqli_set_charset($dbc, 'utf8');
            $stmt = $dbc->prepare("INSERT INTO `table`(`fname`, `lname`, `email`, `gender`, `age`, `comments`, `password`) VALUES (?,?,?,?,?,?,?)");
            $stmt->bind_param('sssssss', $fname, $lname, $email, $gender, $age, $comments, $password);
            $stmt->execute();
            $registered = mysqli_affected_rows($dbc);
            echo $registered . "row is affected, everything worked fine!";
        } catch (Exception $exception) {
            echo $exception->getMessage();
            exit();
        }
    } else {
        echo "<P style='color:red;'>ERROE: you left some values in blank!</p>";
    }
} else {
    echo "<h2>Please complete the form...</h2>";
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>タイトル</title>
</head>
<body>
<form action="" method="post">
    <label>First Name:
        <input type="text" name="fname" size="20" maxlength="50">
    </label>
    <label>Last Name:
        <input type="text" name="lname" size="20" maxlength="50">
    </label>
    <label>Email:
        <input type="text" name="email" size="40" maxlength="50">
    </label>
    <fieldset>Gender:
        <label>Male
            <input type="radio" name="gender" value="M">
        </label>
        <label>Famale
            <input type="radio" name="gender" value="F">
        </label>
    </fieldset>
    <label>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>
    </label>
    <label>Comments:
        <textarea name="comments" rows="3" cols="40" maxlength="200"></textarea>
    </label>
    <label>Password:
        <input type="password" name="password" maxlength="50">
    </label>
    <p><input type="submit" name="submit" value="Submit"/></p>
</form>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/09 23:03

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

    キャンセル

+3

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

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {

    $hostname = "localhost";
    $username = "root";
    $dbpass = "パスワード";
    $dbname = "データベース名";

    $link = mysqli_connect($hostname, $username, $dbpass, $dbname) or die("could not connect to database, ERROR:" . mysqli_connect_error());
    mysqli_set_charset($link, "utf8");

    $fname = filter_input(INPUT_POST, 'fname');
    $lname = filter_input(INPUT_POST, 'lname');
    $email = filter_input(INPUT_POST, 'email');
    $gender = filter_input(INPUT_POST, 'gender');
    $age = filter_input(INPUT_POST, 'age');
    $comments = filter_input(INPUT_POST, 'comments');
    $password = filter_input(INPUT_POST, 'password');

    // 入力チェック
    $errors = [];
    if (empty($fname)) {
        $errors['fname'] = '入力必須です。';
    }
    if (empty($lname)) {
        $errors['lname'] = '入力必須です。';
    }
    if (empty($email)) {
        $errors['email'] = '入力必須です。';
    }
    if (empty($gender)) {
        $errors['gender'] = '入力必須です。';
    }
    if (empty($age)) {
        $errors['age'] = '入力必須です。';
    }
    if (empty($comments)) {
        $errors['comments'] = '入力必須です。';
    }
    if (empty($password)) {
        $errors['password'] = '入力必須です。';
    }

    if (count($errors) === 0) {
        $sql = 'INSERT INTO users (';
        $sql .= 'first_name, last_name, email, gender, age, comments, password';
        $sql .= ') VALUES (';
        $sql .= '?, ?, ?, ?, ?, ?, ?';
        $sql .= ')';

        /* プリペアドステートメントを作成します */
        $stmt = mysqli_prepare($link, $sql);

        /* マーカにパラメータをバインドします */
        mysqli_stmt_bind_param($stmt, "sssssss"
            , $fname
            , $lname
            , $email
            , $gender
            , $age
            , $comments
            , $password
        );

        /* クエリを実行します */
        mysqli_stmt_execute($stmt);

        /* 追加した行数 */
        $registered = mysqli_affected_rows($link);
    }
}
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php if (isset($registered)) : ?>
            <p>affected_rows: <?= h($registered); ?></p>
        <?php endif; ?>

        <form action="" method="post">
            <p>
                <label for="fname">First Name: </label>
                <input type="text" name="fname" id="fname" />
                <?php if (isset($errors['fname'])): ?>
                    <div class="error">
                        <?= h($errors['fname']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <label for="lname">Last Name: </label>
                <input type="text" name="lname" id="lname" />
                <?php if (isset($errors['lname'])): ?>
                    <div class="error">
                        <?= h($errors['lname']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <label for="email">Email: </label>
                <input type="text" name="email" id="email" />
                <?php if (isset($errors['email'])): ?>
                    <div class="error">
                        <?= h($errors['email']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                Gender:
                <label>
                    <input type="radio" name="gender" value="M" />
                Male
                </label>
                <label>
                    <input type="radio" name="gender" value="F" />
                    Female
                </label>
                <?php if (isset($errors['gender'])): ?>
                    <div class="error">
                        <?= h($errors['gender']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <label for="age">Age:</label>
                <select name="age" id="age">
                    <option value="0~29">Under 30</option>
                    <option value="30~60">Betwen 30 and 60</option>
                    <option value="60+">Over 60</option>
                </select>
                <?php if (isset($errors['age'])): ?>
                    <div class="error">
                        <?= h($errors['age']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <label for="comments">Comments:</label>
                <textarea name="comments" id="comments" rows="3" cols="40"></textarea>
                <?php if (isset($errors['comments'])): ?>
                    <div class="error">
                        <?= h($errors['comments']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <label for="password">Password:</label>
                <input type="password" name="password" id="password" maxlength="50">
                <?php if (isset($errors['password'])): ?>
                    <div class="error">
                        <?= h($errors['password']); ?>
                    </div>
                <?php endif; ?>
            </p>
            <p>
                <input type="submit" value="Submit" />
            </p>
        </form>
    </body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/09 23:07

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

    キャンセル

+2

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

phpMyAdminに値が渡されるはず

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

PHPマニュアル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/09 22:54

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

    キャンセル

+1

なんだか知識がチグハグですね。
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 等で内容を表示してみると良いです。

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/09 17:33

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

    キャンセル

  • 2017/01/09 22:57

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

    キャンセル

  • 2017/01/09 23:30

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20770questions

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

  • MySQL

    5990questions

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

  • phpMyAdmin

    666questions

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

  • mysqli

    161questions

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