phpを使ってmysqlにデータをINSERTしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,452

my_port_is_53

score 41

お世話になります。

phpの基本を勉強している初心者です。
現在、phpを使ってmysqlのlocalhostsの'userdata'テーブルに,投稿番号,名前,コメント,日付,パスワードのレコードを挿入したいのですが、上手くいきません。
web上でいろいろ検索して、追加してみましたが、どれもうまくいきませんでした。
データベースの文字コードはutf8_general_ci
ソースコードの方の文字コードもutf-8にしてあります。

以下が私の記述した複数のコードです。
<?php

//変数   
$name = $_POST['user'];
$com = $_POST['comment'];
$pas = $_POST['pass'];

//日本語、アルファベットが受け取れない
$db = mysqli_connect('localhost','root','1234','db')or die(mysqli_connnect_error());
mysqli_set_charset($db, 'utf-8');
//%sを%dにしたらエラーは消えるが、文字を受け取らなくなる。
$sql = sprintf('INSERT INTO userdata SET name = %s, comment = %s, pass = %s',

//値がnameとcommentとpassならnameとcommentとpassの属性が空のレコードが追加される。
//アラビア数字なら通常通り追加される。
//それ以外はエラーで、unkown column $_POST['user']の値が表示
mysqli_real_escape_string($db,  $_POST['user']),
mysqli_real_escape_string($db, $_POST['comment']),
mysqli_real_escape_string($db, $_POST['pass'])
);

mysqli_query($db, $sql) or die(mysqli_error($db));

?>
レコードには、数字のみ反映されます。

他にもPDOなども試してみました。
//変数宣言
$name = $_POST['user'];
$com = $_POST['comment'];
$pas = $_POST['pass'];
//実行すると以下の行でエラー
//Notice: Undefined variable: pdo in C:\xampp\htdocs\php_app_kadai\database.php on line 13
//Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\php_app_kadai\database.php on line 13

$stmt = $pdo -> prepare("INSERT INTO userdata (name, comment, pass) VALUES (:name, :com, :pas)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':com', $com, PDO::PARAM_STR);
$stmt->bindParam(':pas', $pas, PDO::PARAM_STR);
$stmt->execute();

$con = mysql_connect("localhost","root","1234")
or die("MySQLに接続できません。");
mysql_select_db('userdata');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$sql = "INSERT INTO `userdata` (`name`, `comment`, `pass`) VALUES (`$name`,`$com`,`$pas`)";
$result = mysql_query($sql);
//以下の行でエラー
//Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\php_app_kadai\database.php on line 52
mysql_free_result($result);
mysql_close($con);

$name = $_POST['user'];
$com = $_POST['comment'];
$pas = $_POST['pass'];

//エラー無しデータベースに反映されない
$db = new PDO("mysql:host:localhost;dbname=db","root","1234");
$st = $db->prepare("INSERT INTO userdata (name, comment,pass) VALUES (?,?,?)");
$st->bindParam(1,$name);
$st->bindParam(2,$com);
$st->bindParam(3,$pas);
$st->execute();
//行数は0でレコードは増えなかった
print mysql_affected_rows();
よろしくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

どのコードも微妙に間違ってるだけなんだけど…
mysql_* 系の関数は覚えても意味がないのでスルーします。
mysqli_* 系は…sprintf の使い方が間違ってます。

//変数宣言
$name = $_POST['user'];
$com = $_POST['comment'];
$pas = $_POST['pass'];

//実行すると以下の行でエラー
//Notice: Undefined variable: pdo in C:\xampp\htdocs\php_app_kadai\database.php on line 13
//Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\php_app_kadai\database.php on line 13

//これ足りない
$pdo = $db = new PDO("mysql:host=localhost;dbname=db","root","1234");

$stmt = $pdo -> prepare("INSERT INTO userdata (name, comment, pass) VALUES (:name, :com, :pas)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':com', $com, PDO::PARAM_STR);
$stmt->bindParam(':pas', $pas, PDO::PARAM_STR);
$stmt->execute();

$name = $_POST['user'];
$com = $_POST['comment'];
$pas = $_POST['pass'];

//エラー無しデータベースに反映されない
// $db = new PDO("mysql:host:localhost;dbname=db","root","1234");
$db = new PDO("mysql:host=localhost;dbname=db","root","1234");

$st = $db->prepare("INSERT INTO userdata (name, comment,pass) VALUES (?,?,?)");
$st->bindParam(1,$name);
$st->bindParam(2,$com);
$st->bindParam(3,$pas);
$st->execute();
//行数は0でレコードは増えなかった
//print mysql_affected_rows(); // <- PDO使っているのにmysql_* では取得できません。
echo $st->rowCount();

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/23 18:38

    ありがとうございます。
    早速ためさせて頂きます。

    キャンセル

  • 2015/08/23 18:58

    無事解決致しました。
    迅速な回答ありがとございます。

    sqlとsqliについては意識していませんでした。
    PDO使っているのにmysql_* では取得できないということなので、ライブラリが異なることは知りませんでした。教えて頂きありがとうございます。

    キャンセル

  • 2015/08/23 19:03

    PHPの公式リファレンスは内容もわかりやすく、具体的な記述例も豊富です。ほとんどの場合、ここを読むだけで自己解決できると思いますので、一度、通読するといいですよ。

    http://php.net/manual/ja/book.pdo.php

    キャンセル

  • 2016/02/24 02:36

    ありがとうございます!
    参考にさせていただきます。

    キャンセル

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

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

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