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

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

ただいまの
回答率

90.11%

AUTO_INCREMENT の場合の値のinsert方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 6,489

moitaro

score 149

度々お世話になっております。

CREATE TABLE users (
  users_id    int(8)       NOT NULL AUTO_INCREMENT,
  email       varchar(255) NOT NULL,
  password    varchar(255) NOT NULL,
  entryday    DATETIME,
  primary key(users_id)
);


というテーブルに

$sql = "insert into users(email, password) values(".$_POST[mail].", ".$_POST[pass].");";
$result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql);


と値を入れようとしましたが
出力が

クエリの送信に失敗しました。
SQL:insert into users(email, password, entryday) values(fugafuga@hogehoge, test);


と上手く入りません。

users_id    int(8)       NOT NULL AUTO_INCREMENT,
なので
users_idのインサート方法がよろしくないと予想しているのですが
マニュアルを見た所
https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html
なんか良い様な気がしております。

こんな単純な所で伺ってしまい大変申し訳ないのですが
上記なぜsql文が失敗するか伺ってよろしいでしょうか?

なお本番では
パスワード部分は
http://php.net/manual/ja/faq.passwords.php
を参考にする予定です。

以上 お問い合わせ致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+3

直接の原因は、
kunaiさんの回答にある通りで、
文字列として値を扱わせるにはシングルクォートで囲む必要があります。

問題を切り分けるには、エラーメッセージを見るとともに、(PHPを介さずに)MySQLにログインして直接想定するSQLを発行して、SQL自体が正しいかどうかを確認すると楽です。

それとは別の問題として、ご提示のコードには以下の2点の問題がありますので、
参考にされているサイトや書籍があるのであれば、最近のものに変更されることをお勧めします

  1. SQLインジェクション脆弱性があり、セキュリティ上、非常に深刻な状態にある。
  2. 非推奨とされているmysql関数を使用している。

PDOもしくはmysqliクラスもしくは関数を使い、
SQL発行時には確実に安全なSQL以外は全てプリペアードステートメントを使用することでSQLインジェクション脆弱性の作りこみを回避することが可能です。

php pdo プリペーアドステートメント

php mysqli プリペアードステートメント

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/02 10:37

    ご忠告ありがとうございます。
    不慣れなため恥ずかしいコードをさらして失礼しました。

    >MySQLにログインして直接想定するSQLを発行して、SQL自体が正しいかどうかを確認すると楽です。
    phpMyAdminの事でしょうか???
    サーバー管理者が多忙故入れるのが困難との事……

    >PDOもしくはmysqliクラスもしくは関数を使い、
    http://qiita.com/yasumodev/items/bd2ba476f31804d527d3
    を参考に下記のようにやりました。
    --------
    $mysqli = new mysqli($dbidpw['host'],$dbidpw['user'],$dbidpw['pass'], $dbidpw['db']);
    if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
    } else {
    $mysqli->set_charset("utf8");
    }
    $sql = "SELECT users_id, email,password,entryday FROM users";
    if ($result = $mysqli->query($sql)) {
    // 連想配列を取得
    while ($row = $result->fetch_assoc()) {
    echo $row["users_id"] . $row["email"] . "<br>";
    echo ">>>>". $row["password"] . $row["entryday"] ."<<<<<br>";
    }
    // 結果セットを閉じる
    $result->close();
    }

    $query = "INSERT INTO users(email,password,entryday) VALUES ( '".$_POST[mail]."' , 'test' , NOW() )";
    if( $mysqli->query( $query ) ) {
    echo "mmmmmmmm".$query.'mmmmmm INSERT成功';
    }else {
    echo 'INSERT失敗';
    }

    $mysqli->close();
    --------
    おかげてコードが見やすくなりました。

    ありがとうございました。

    キャンセル

checkベストアンサー

+2

emailとpasswordが ' ' で囲われていないだけではないでしょうか。
エラーログを見て対処を考えると、何が悪いのかすぐわかるので良いです!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/02 09:18

    仰る通りでした……
    焦っていて失礼しました。

    ini_set('display_errors', '1');

    を入れるようにします。

    キャンセル

+1

ちなみに
insert into users(email, password, entryday) values('fugafuga@hogehoge', 'test');

としても項目数が違うのでエラーです例示の命題ではentrydayを指定しているように
見えないのですが途中でなにか省略していますか?

insert into users(email, password, entryday) values('fugafuga@hogehoge', 'test' ,CURDATE());

的な処理をしてみてください

なおphpがどうやってMySQLにアクセスできるかは
phpinfo()でセクションMySQL、MySQLi、PDOがあるかを確認する必要があります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/02 09:08

    コメントありがとうございます。

    仰る通り
    insert into users(email, password, entryday) values('fugafuga@hogehoge', 'test'、now());
    のnow()を省略しておりました。
    CURDATE()の方が一般的なのですねっ
    そちらで実装しようかと思います。

    コメントありがとうございました。

    キャンセル

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

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