PHP+MYSQLでのINSERTについて - PHPプロ!Q&A掲示板

2732

  • 0P

PHP+MYSQLでのINSERTについて

質問日時 / 2010年5月28日 02:04    回答数 / 11件

Questioner:  lsd1192  このエントリーをはてなブックマークに追加 

キーワード / PHP    MYSQL   

INSERTしようとしたのですが、SQL文が間違ってると前回ご指摘をうけたのですが、解決ならずでこまっております。

  1. $con = mysql_connect("localhost","test","123456")or die(mysql_error());
  2. mysql_select_db("test")or die(mysql_error());
  3. $sql = ("insert into users(name,kana,nick,sex,pass,mail)values($name,$kana,$nick,$sex,$pass,$mail))";
  4. $res = mysql_query($sql) or die(mysql_error());
  5.   
  6. mysql_close($con);

■PHPMYADMIN
 
name varchar(100) utf8_unicode_ci                  
  kana varchar(50) utf8_unicode_ci                   
  nick varchar(50) utf8_unicode_ci                   
  sex varchar(50) utf8_unicode_ci                  
  pass varchar(50) utf8_general_ci                  
  mail varchar(100) utf8_general_ci                   
  date date                   
      NULLはすべていいえです。


初心者なもので意味解らないことだらけです・・・。少しでもご教授いただければ、勉強になるのでご教授宜しくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01yuu_a0>>CODE <?php $con = mysql_connect("localhost","
┃┗A01-1lsd1192ご教授有難うございました! エスケープするの忘れな
┗A02shimixなぜ前の質問と別にされたのか理解出来ませんが・・
 ┗A02-1lsd1192このサイト自体余り使ったことなくて、再度質問してし
  ┗A02-1-1lsd1192なんとかINSERT文エラーなくいくことができまし
   ┗A02-1-1-1shimix「phpMyAdminに登録されていない」だけでは現象がよく
    ┗A02-1-1-1-1lsd1192PHPでDB登録はできたのですが、PHPMYADMINでは、漢字
     ┗A02-1-1-1-1-1shimix>mysql_query("SET NAMES 'utf8"); いや、クライ
      ┗A02-1-1-1-1-1-1lsd1192毎回ご回答ありがとうございます。本当に助かります!
       ┗A02-1-1-1-1-1-1-1shimix前のレスで書いたことは理解されてますか?理解されず
        ┗A02-1-1-1-1-1-1-1-1lsd1192PHPMYADMINの文字セットがUTF8って書いてあったのであ

回答一覧

並び替え:

A01 満足
answereryuu_a0 [5月28日 08:25] (最終編集:5月28日 08:54)

  1. <?php
  2.   $con = mysql_connect("localhost","test","123456")or die(mysql_error());
  3.   mysql_select_db("test")or die(mysql_error());
  4.   
  5.   // mysql_query("SET NAMES 'utf8'");
  6.   mysql_set_charset('utf8');
  7.   $sql = mysql_insert_string('users'compact('name''kana''nick''sex''pass''mail'));
  8.   $res = mysql_query($sql) or die(mysql_error());
  9.   mysql_close($con);
  10.  
  11.  
  12. function mysql_insert_string($table_name$values) {
  13.   $names = '`'.implode('`,`'array_keys($values)).'`';
  14.   $values = implode(','array_map(mysql_escape$values));
  15.  
  16.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});";
  17. }
  18.  
  19. function mysql_escape($value) {
  20.   switch (true) {
  21.   case is_null($value)  : return 'NULL';
  22.   case is_bool($value)  : return $value ? 1 : 0;
  23.   case is_numeric($value)  : return $value;
  24.   default : return "'".mysql_real_escape_string($value)."'";
  25.   }
  26. }
  27. ?>

予約語やクォーテーションなんかが混じってるんちゃう。
取り合えず、別の処理系に渡すときはエスケープしませう。(人のこといえんけど、、、たまに忘れる)

めんどいから、PDO 使かっとこ。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerlsd1192 [5月28日 11:25]

ご教授有難うございました!
エスケープするの忘れないようにします^^

この意見に回答する

ツリーへ TOPへ

A02
answerershimix [5月28日 08:36] (最終編集:5月28日 08:37)

なぜ前の質問と別にされたのか理解出来ませんが・・

  http://www.phppro.jp/qa/2730

  1. $sql = ("insert into users(name,kana,nick,sex,pass,mail)values($name,$kana,$nick,$sex,$pass,$mail))";

えっと・・。括弧の位置がおかしくないですか?SQL文という以前にphpソースとしてエラーになりますけど。また、実際にmysql_queryで投入する前のタイミングで、print $sqlを入れてどういうSQL文に展開されているか確認されていますか?

文字列項目を単引用符で括っていないのは何か理由がありますか?というか文字列項目はmysql_real_escape_stringでエスケープしてください(前スレでも脆弱性を指摘されてましたよね)。

  1. $sql = sprintf("insert into users(name,kana,nick,sex,pass,mail) values ('%s', '%s', '%s', '%s', '%s', '%s')",
  2.                mysql_real_escape_string($name),
  3.                mysql_real_escape_string($kana),
  4.                mysql_real_escape_string($nick),
  5.                mysql_real_escape_string($sex),
  6.                mysql_real_escape_string($pass),
  7.                mysql_real_escape_string($mail));


date(この列名もちょっと嫌だけど)に対して$CURDATE()をセットしていたのは外されたんですかね。単純にCURDATE()のtypoだと思っていたんですが(汗

  http://dev.mysql.com/doc/refman/5.1-olh/ja/date-and-time-functions.html

この意見に回答する

ツリーへ TOPへ

A02-1
replyerlsd1192 [5月28日 11:30]

このサイト自体余り使ったことなくて、再度質問してしまいました><;
エスケープ忘れないようにします^^
脆弱性を指摘されましたね;;
参考書とか色々読んでるんですが、PHPとかも、携帯サイトだとこうしなきゃいけないとかもうよくわからなくなってきた所でした・・・><;
めげずに頑張ります^-^
でも前回、今回とご回答本当に有難うございます^^
またよろしくお願いいたします!

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerlsd1192 [5月28日 11:59]

なんとかINSERT文エラーなくいくことができました^-^
お二人ともありがとうございました!

しかし、ここで問題があるのですが、名前など明記するフォームがあるのですが、漢字、ひらがな、カタカナだけがPHPMYADMINに登録されていないのですが・・・・なぜでしょうか・・・
携帯サイトなのでHP自体はシフトJISにしていますが、チカッパレンタルサーバーはUTF8と書いてあるのですが、全部同じにしないとだめなのでしょうか?

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyershimix [5月28日 13:00]

「phpMyAdminに登録されていない」だけでは現象がよくわかりません。phpスクリプトで取り出したときにnullになっているということでしょうか?

クライアントの文字コードを設定していない・・ということでは?

  http://www.php.net/manual/ja/function.mysql-set-charset.php

#というか、まずはこれをしておかないと・・

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1
replyerlsd1192 [5月31日 18:24]

PHPでDB登録はできたのですが、PHPMYADMINでは、漢字、ひらがなが空白の状態で登録されてしまってます。文字コードの問題だとは思うのですが今一わかりません・・・。携帯サイトを作成してるのでシフトJISでHPは作っております。PHPMYADMINのMySQL の文字セット: UTF-8 Unicode (utf8) MySQL の接続照合順序はutf8_unicode_ciです。

  1. name varchar(200) utf8_unicode_ci                
  2. kana varchar(50) utf8_unicode_ci                 
  3. nick varchar(50) utf8_unicode_ci              
  4. sex varchar(50) utf8_unicode_ci           
  5. pass varchar(200) utf8_unicode_ci         
  6. mail varchar(200) utf8_unicode_ci             
  7. date datetime
PHPでのMYSQL接続
  1. <?php
  2.   $con = mysql_connect("xxxx.jp","xxxxxx","123456")or die(mysql_error())
  3.   mysql_select_db("xxxxx")or die(mysql_error());   
  4.   mysql_query("SET NAMES 'utf8")
  5.   $sql = mysql_insert_string('users'compact('name''kana''nick''sex''pass''mail'))
  6.   $res = mysql_query($sql) or die(mysql_error())
  7.   mysql_close($con)
  8.   
  9.   
  10. function mysql_insert_string($table_name$values) { 
  11.   $names = '`'.implode('`,`'array_keys($values)).'`'
  12.   $values = implode(','array_map(mysql_escape$values))
  13.   
  14.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});"
  15. } 
  16.   
  17. function mysql_escape($value) { 
  18.   switch (true) { 
  19.   case is_null($value)  : return 'NULL'
  20.   case is_bool($value)  : return $value ? 1 : 0
  21.   case is_numeric($value)  : return $value
  22.   default : return "'".mysql_real_escape_string($value)."'"
  23.   } 
  24. } 
  25. ?>
ご指導、ご指摘、ご教授宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1
replyershimix [5月31日 18:33]

>mysql_query("SET NAMES 'utf8"); 

いや、クライアント(phpスクリプト)の文字コードはSJISじゃないんでしょうか?

#それともサイトはSJISだけどスクリプトはUTF-8なんですか?



あと・・。前のレスで提示したmysql_set_charsetを使えない環境なのでしょうか?何故SET NAMESを・・

  http://www.php.net/manual/ja/function.mysql-set-charset.php

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-1
replyerlsd1192 [5月31日 18:54]

毎回ご回答ありがとうございます。本当に助かります!
文字コードはSJISです!
サーバーはチカッパレンタルサーバーなんですけど、php.iniの設定とかも関係あるのでしょうか?><;
PHPMYADMINの照合順序も関係するのでしょうか?
もうさっぱり解らなくて・・・すみません;;;

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-1-1
replyershimix [5月31日 18:58]

前のレスで書いたことは理解されてますか?理解されずに返されてもレス数が増えるだけなのですが・・

>文字コードはSJISです!

では(先に提示されたソースで)クライアントの文字セットをutf-8に指定しているのは何故ですか?

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1-1-1-1
replyerlsd1192 [5月31日 19:06]

PHPMYADMINの文字セットがUTF8って書いてあったのであわせるのかとおもってしまって…><;
理解しようとおもって色々サイトみてるのですが、理解する前に知らない言葉を言われてしまうともうその時点でわからなくなってしまって…。すみません。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)