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

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

ただいまの
回答率

90.51%

  • PHP

    20367questions

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

  • MySQL

    5858questions

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

MySQLへのデータ登録に関して

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 276

penginer

score 24

前提・実現したいこと

回答を送信後別ページにヘッダ関数で移動するプログラムを作ろうとしています

発生している問題・エラーメッセージ

ヘッダ関数で移動してもデータが書き込まれません。
尚、変数は全て値がセットされており、
ミスはありません

該当のソースコード

//メインのソース



include './post-att-pl.php';
header('Location: ./assesment-exhi.php');
exit();
//DB(MySQL)への書き込みソース

$NOP_ALL = mysqli_real_escape_string($NOP_ALL);
$gender_a = mysqli_real_escape_string($gender_a);
$gender_b = mysqli_real_escape_string($gender_b);
$gender_c = mysqli_real_escape_string($gender_c);
$gender_d = mysqli_real_escape_string($gender_d);
$gender_e = mysqli_real_escape_string($gender_e);
$gender_f = mysqli_real_escape_string($gender_f);
$gender_g = mysqli_real_escape_string($gender_g);
$gender_h = mysqli_real_escape_string($gender_h);
$gender_i = mysqli_real_escape_string($gender_i);
$gender_j = mysqli_real_escape_string($gender_j);
$select_attribute = mysqli_real_escape_string($select_attribute);
$NOP_1 = mysqli_real_escape_string($NOP_1);
$NOP_2 = mysqli_real_escape_string($NOP_2);
$NOP_3 = mysqli_real_escape_string($NOP_3);
$NOP_4 = mysqli_real_escape_string($NOP_4);
$NOP_5 = mysqli_real_escape_string($NOP_5);
$NOP_6 = mysqli_real_escape_string($NOP_6);
$NOP_7 = mysqli_real_escape_string($NOP_7);
$NOP_8 = mysqli_real_escape_string($NOP_8);
$NOP_9 = mysqli_real_escape_string($NOP_9);
$NOP_10 = mysqli_real_escape_string($NOP_10);
$NOP_11 = mysqli_real_escape_string($NOP_11);
$NOP_12 = mysqli_real_escape_string($NOP_12);
$NOP_13 = mysqli_real_escape_string($NOP_13);
$NOP_14 = mysqli_real_escape_string($NOP_14);
$NOP_15 = mysqli_real_escape_string($NOP_15);
$NOP_16 = mysqli_real_escape_string($NOP_16);
$NOP_17 = mysqli_real_escape_string($NOP_17);
$NOP_18 = mysqli_real_escape_string($NOP_18);
$NOP_19 = mysqli_real_escape_string($NOP_19);
$NOP_20 = mysqli_real_escape_string($NOP_20);
$NOP_21 = mysqli_real_escape_string($NOP_21);
$NOP_22 = mysqli_real_escape_string($NOP_22);
$NOP_23 = mysqli_real_escape_string($NOP_23);
$age_a = mysqli_real_escape_string($age_a);
$age_b = mysqli_real_escape_string($age_b);
$age_c = mysqli_real_escape_string($age_c);
$age_d = mysqli_real_escape_string($age_d);
$age_e = mysqli_real_escape_string($age_e);
$age_f = mysqli_real_escape_string($age_f);
$age_g = mysqli_real_escape_string($age_g);
$age_h = mysqli_real_escape_string($age_h);
$age_i = mysqli_real_escape_string($age_i);
$age_j = mysqli_real_escape_string($age_j);
$fond_a = mysqli_real_escape_string($fond_a);
$fond_b = mysqli_real_escape_string($fond_b);
$fond_c = mysqli_real_escape_string($fond_c);
$fond_d = mysqli_real_escape_string($fond_d);
$fond_e = mysqli_real_escape_string($fond_e);
$fond_f = mysqli_real_escape_string($fond_f);
$fond_g = mysqli_real_escape_string($fond_g);
$fond_h = mysqli_real_escape_string($fond_h);
$fond_i = mysqli_real_escape_string($fond_i);
$fond_j = mysqli_real_escape_string($fond_j);
$date_start = mysqli_real_escape_string($date_start);
$con = mysqli_connect( 'localhost', 'root', 'ikiroot', 'orfc_db') or die();
mysqli_set_charset($con, 'utf8');
$sql = "INSERT INTO 2017 (
NOP_ALL,gender_a,gender_b,gender_c,gender_d,gender_e,gender_f,gender_g,gender_h,gender_i,gender_j,
attribute,NOP_1,NOP_2,NOP_3,NOP_4,NOP_5,NOP_6,NOP_7,NOP_8,NOP_9,NOP_10,NOP_11,NOP_12,NOP_13,NOP_14,NOP_15,NOP_16,NOP_17,NOP_18,NOP_19,NOP_20,NOP_21,NOP_22,NOP_23,
age_a,age_b,age_c,age_d,age_e,age_f,age_g,age_h,age_i,age_j,fond_a,fond_b,fond_c,fond_d,fond_e,fond_f,fond_g,fond_h,fond_i,fond_j,date_start) VALUES (
'".$NOP_ALL."',
'".$gender_a."',
'".$gender_b."',
'".$gender_c."',
'".$gender_d."',
'".$gender_e."',
'".$gender_f."',
'".$gender_g."',
'".$gender_h."',
'".$gender_i."',
'".$gender_j."',
'".$select_attribute."',
'".$NOP_1."',
'".$NOP_2."',
'".$NOP_3."',
'".$NOP_4."',
'".$NOP_5."',
'".$NOP_6."',
'".$NOP_7."',
'".$NOP_8."',
'".$NOP_9."',
'".$NOP_10."',
'".$NOP_11."',
'".$NOP_12."',
'".$NOP_13."',
'".$NOP_14."',
'".$NOP_15."',
'".$NOP_16."',
'".$NOP_17."',
'".$NOP_18."',
'".$NOP_19."',
'".$NOP_20."',
'".$NOP_21."',
'".$NOP_22."',
'".$NOP_23."',
'".$age_a."',
'".$age_b."',
'".$age_c."',
'".$age_d."',
'".$age_e."',
'".$age_f."',
'".$age_g."',
'".$age_h."',
'".$age_i."',
'".$age_j."',
'".$fond_a."',
'".$fond_b."',
'".$fond_c."',
'".$fond_d."',
'".$fond_e."',
'".$fond_f."',
'".$fond_g."',
'".$fond_h."',
'".$fond_i."',
'".$fond_j."',
'".$date_start."'
)";

mysqli_query($con, $sql);
mysqli_close($con);

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

開発環境はXAMPPの最新版とWindows10です

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • A.Ichi

    2017/09/07 08:11

    INSERT INTO `2017` (・・・ としてみては?

    キャンセル

回答 3

checkベストアンサー

+1

header('Location: ./assesment-exhi.php');なので、質問の文意から意図するとSQL操作を行っているPHPファイルが、assesment-exhi.phpだとして進めます。

「エラーが出ていない」とありますが、mysqli_real_escape_string(コネクション, 文字列)ですのでエラーは画面に表示されていないだけで発生していると思います。

下記のPHPコードを試してみてください。

// assesment-exhi.php

//DB接続
$con = mysqli_connect( 'localhost', 'root', 'ikiroot', 'orfc_db');
if (mysqli_connect_errno()) {
    echo '接続失敗:'.mysqli_connect_error()."\n";
    exit();
}

mysqli_set_charset($con, 'utf8');

//エスケープ
$NOP_ALL = mysqli_real_escape_string($con, $NOP_ALL);
...

//SQLクエリ
$sql = ...
...

//SQL実行
if (mysqli_query($con, $sql) === false) {
    echo "DB追加失敗\n";
}

mysqli_close($con);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/07 11:48

    ありがとうございました。
    DBへの接続は問題なく、
    追加の失敗が原因だとは判明したのですが
    原因が思い当たりません。
    厚かましいことは重々承知しておりますが、
    こういう時のよくある原因
    というのはございますでしょうか?

    キャンセル

  • 2017/09/07 13:35

    FF外から失礼します。
    SQL文生成後の$sqlを文字列として出力し、それをMysqlで直接実行してみれば何か分かるかもしれませんね。
    同一トランザクションでこの処理の前処理で何か行っていてそれが原因なら、エラーは起きないので、この処理の直前でコッミトしておく必要がありますが。

    よくあるのは、文法エラーやキー重複です。

    キャンセル

  • 2017/09/08 04:41

    SQL文のテーブル名が数字のみなので、エスケープ(`バッククォート)が必要だと思います。数字のみのテーブル名、フィールド名はエスケープする必要があります。

    $sql = 'INSERT INTO `2017` (...) VALUES (...)';

    プログラムコードは自身で書いたソースコードを過信しないで、ひとつひとつ正しいコードなのか確かめながら進めてどのコードでエラーが起きているのか確定することが大事です。正しいと信じてしまってエラーを見つけられず何時間も同じコードとにらめっこすることがあったりします。
    めんどうで遠回りに見えても、基本に忠実になることが早道かと思います。

    SQL文実行もきちんとエラー処理を入れてみてください。多分エスケープしていないことによるSQL実行エラーも下記のようにエラー処理を行っていれば簡単に見つかります。

    if (mysqli_query($con, $sql) === false) {
    echo "DB追加失敗:".mysqli_error($con)."\n";
    }

    キャンセル

0

回答にはなりませんが、気になったので、念のために書いておきます。
メインのソース、これを仮に assesment-complete.php、リダイレクト先が assesment-exhi.php だとして話を進めます。

PHP の header() 関数はレスポンスヘッダに追加する関数です。が、Location ヘッダが追加されたときに、ステータスコードを自動的に 200 OK から 302 Found に変えます。
で、このレスポンスがクライアントに届くと、ステータスコード 302 からリダイレクトすべきと判断し、レスポンスヘッダに乗っていた Location で示された URL にリダイレクトします。

つまり、「ヘッダ関数で移動」と書かれていますが、「移動」はサーバ内で完結しているのではなく、一旦 assesment-comlete.php に来たリクエストはブラウザに返され、その後、assesment-exhi.php に別のリクエストが飛んできます。
assesment-exhi.php の中でセットしている $NOP_ALL などの値がどこからやってくるのか、提示されているソースからは読み取れませんが、少なくとも、ブラウザのリクエストには乗っていない、すなわち、$_POST['NOP_ALL'] などと拾うことはできません。

このあたり、大丈夫でしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ユーザー側でエスケープ処理をするよりprepareで処理すれば
問題の切り分けができると思います

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • PHP

    20367questions

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

  • MySQL

    5858questions

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