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

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

ただいまの
回答率

90.52%

  • PHP

    20326questions

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

  • MySQL

    5848questions

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

INSERTができない

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 330

imaharu

score 19

 やっていること

パーフェクトPHP(2016)を読みながら、コードを写しています

insertの処理が動いておらず、DBに値が入力されません

下のコードで何が間違っている点はありますでしょうか?

特にweb上でエラーは出ていません

そのまま、写すとmysql > mysqli関係のエラーが出たので、少し改善しました

イメージ説明

<?php
// データベースに接続
$link = mysqli_connect('localhost', 'root', '');

if(!$link){
    die('データベースに接続できません: ' . mysqli_error());
}

// データベースを選択する
mysqli_select_db($link , 'oneline_bbs');

$errors = array();

// POSTなら保存処理実行
if($_SERVER['REQUEST_METHOD'] === 'POST'){
    // 名前が正しく入力されているかチェック
    $name = null;
    if(!isset($_POST['name']) || !strlen($_POST['name'])){
        $errors['name'] = '名前を入力してください';
    }
    else if(strlen($_POST['name']) > 40){
        $errors['name'] = '名前は40文字以内で入力してください';
    }
    else{
        $name = $_POST['name'];
    }

    // ひとことが正しく入力されているかチェック
    $comment = null;
    if(!isset($_POST['comment']) || !strlen($_POST['comment'])){
        $errors['comment'] = 'ひとことを入力してください';
    }
    else if(strlen($_POST['comment']) > 200){
        $errors['comment'] = 'ひとことは200文字以内で入力してください';
    }
    else{
        $comment = $_POST['comment'];
    }

    // エラーがなければ保存
    if(count($errors) === 0){
        // 保存するためのSQL文を作成
        $sql = "INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('"
        . mysqli_real_escape_string($link , $name) . "','"
        . mysqli_real_escape_string($link , $comment) . "','"
        . date('Y-m-d H:i:s') . "')";

        // 保存する
        mysqli_query($link,$sql);

    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>ひとこと掲示板</title>
</head>
<body>
    <h1>ひとこと掲示板</h1>
    <form action="bbs.php" method="post">
        <?php if(count($errors)):?>
        <ul class="error_list">
            <?php foreach($error as $error):?>
            <li>
                <?php echo htmlspecialchars($error, ENT_QUOTES,'UTF-8') ?>
            </li>
            <?php endforeach; ?>
        </ul>
        <?php endif; ?>

        名前: <input type="text" name="name" />
        <br>
        ひとこと: <input type="text" name="comment" size="60" />
        <br>
        <input type="submit" name="submit" value="送信する" />
    </form>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

マニュアルの記載順にもよりますがinsertの前にselectでデータが読めるかどうか確認は取っていますか?

その上で

$sql = "INSERT INTO post (name,comment,create_at) VALUES ('"
. mysqli_real_escape_string($link , $name) . "','"
. mysqli_real_escape_string($link , $comment) . "','"
. date('Y-m-d H:i:s') . "')";

の後ろで

print $sql;


とすると、それなりのSQL文が表示されますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/28 20:35

    ちなみにプレースホルダーでprepareの処理をしない限り
    インジェクションの対策が不完全です
    2016版とありますが、ちょっと書き方が古すぎるような気がします

    キャンセル

  • 2017/09/29 10:21

    コードを実行すると下の文が表示されました

    Tom
    INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('hehe','hehehehe','2017-09-29 03:17:46')
    が出力されました

    Tomはselect文でデータが取得できていることを示しています

    ```
    if(count($errors) === 0){
    // 保存するためのSQL文を作成
    $sql = "SELECT name FROM post";
    if ($result = $link->query($sql)) {
    // 連想配列を取得
    while ($row = $result->fetch_assoc()) {
    echo $row["name"] . "<br>";
    }
    // 結果セットを閉じる
    $result->close();
    }
    $in = "INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('". mysqli_real_escape_string($link , $name) . "','". mysqli_real_escape_string($link , $comment) . "','". date('Y-m-d H:i:s') . "')";

    print $in;
    // 保存する
    mysqli_query($link,$in);

    }
    ```

    キャンセル

  • 2017/09/29 10:27

    selectはできてinsert文は文法に問題がないけど、最終的に投入されないということですね?

    そうなるとデータ投入の権限がついていない可能性があります
    $ret= mysqli_query($link,$sql);
    var_dump($ret);
    で失敗してることは確認できますか?

    printf("Error: %s\n", mysqli_error($link));
    でエラー内容が確認できるかもしれません

    キャンセル

  • 2017/09/29 14:43

    create_at > created_at
    にするとinsertができました。
    タイプミスだったようです。
    ------
    プレースホルダーでprepareの処理をしない限り
    インジェクションの対策が不完全です
    ------
    これについて詳しく知りたいのですが、参考サイトなどありますでしょうか?

    キャンセル

  • 2017/09/29 14:52

    query()の使い方はこう
    http://jp2.php.net/manual/ja/pdo.query.php

    query()はSELECTステートメントにより返されたレコードセットで 反復処理が可能です

    キャンセル

  • 2017/09/29 15:08

    勉強しておきます
    解決に協力して頂き、ありがとうございました

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20326questions

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

  • MySQL

    5848questions

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