• ベストアンサー
  • すぐに回答を!

更新時の文字化けに関して

初歩的な質問で申し訳ありませんが、教えて下さい。 以下のようにSQL文を作成し、更新処理をしようとしたところ、 どうも文字化けして更新できませんでした。 そもそもの文字設定の基本を把握できていないのが問題ですが、、、 どこの何を設定すれば良いでしょうか? よろしくお願いします。 《DB内容 (MySQL)》 項目 name varchar(50) 照合順序 sjis_japanese_ci 《プログラム内容(phpで記述)》 //データベース接続 $con = mysql_connect("localhost", "root", "999999"); // php_dbデータベースへ接続する if (!$con) { die('接続できませんでした: ' . mysql_error()); } $str = 'あいうえお'; $sql = "UPDATE tbl_ABC set name = '$str'"; if (!mysql_select_db('db_abc', $con)) { echo 'Could not select database'; exit; } $result = mysql_query($sql,$con); mysql_query("set names sjis"); if (!$result) { echo "DB Error, could not query the database\n"; echo 'MySQL Error: ' . mysql_error(); exit; } mysql_close($con) ;

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数109
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3
  • agunuz
  • ベストアンサー率65% (288/437)

すでに的確なツッコミがありますが(汗 ソースをSJISで書いているならば(本来sjisはphpでは使ってはいけない文字セットですが、それは置いといて) >mysql_query("set names sjis"); でなく、 mysql_set_charset('sjis'); とすべきだし、実行するタイミングは「MySQLに繋いだ直後」に行うべきです。提示されたソースでは >$result = mysql_query($sql,$con); >mysql_query("set names sjis"); update文の実行後に set names が実行されていますので、update文に対して何の効果も与えていません。 なお「SJISを使う」メリットは何もありませんので、UTF-8で書くことをお勧めします(MySQLでは文字セット名が「utf8」なので注意)。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 皆様のご回答のおかげで、問題を解決する事ができました! 皆様にはいつもお世話になっている為、どなたをベストアンサーにすれば良いか、、、 ありがとうございました!

その他の回答 (2)

  • 回答No.2
noname#244856
noname#244856

No.1で既に的確な回答がついていますが、参考リンクを張っておきます。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

大きな問題が3つあります (1)mysql_系の関数は非推奨です (2)プログラム側からset namesは原則発行すべきではありません (3)sjisでデータ管理をするのはあまり得策ではありません。 上記をいずれ改善するとして 今回のソースコードはshift-jisで保存していますか? まっとうなエディタを利用していれば明示的にキャラクターコードを 指定できると思うので、チェックしてみてください また >どうも文字化けして更新できませんでした。 ちょっと意味不明なのですが・・・ 更新したけど文字化けしていたのか、更新ができなかったのか どちらなのでしょうか? 仮に文字化けしていたのであればなんで文字化けしていることが確認できたのでしょうか? 逆に更新できなかった場合は、なぜい文字化けが更新できなかった理由だと考えたのでしょうか?

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 文字設定に関して

    教えて下さい。 自身の環境の文字設定が把握できておらず申し訳ありません。 以下のようにSQLを投げ、取得したデータを表示させようとしていますが、取得はできている ものの $tmp_kenmei を表示させようとしたところ、表示されません。 echo で中身を確認した際には、問題なくセットされていました。 また、where句で条件を指定しない場合は、問題なく取得できます。 文字設定か何かの問題かと思われますが、、、 何が原因でしょうか、、、教えて下さい。 よろしくお願いします。 《内容》 $tmp_kenmei = mb_convert_encoding($tmp_kenmei,"UTF-8","SJIS"); $con = mysql_connect("localhost", "root", "999999"); //データベースへ接続する if (!$con) { die('接続できませんでした: ' . mysql_error()); } $sql = "select kenmei from tbl_AAA where kenmei like '%" . $tmp_kenmei . "%'"; if (!mysql_select_db('db', $con)) { echo 'Could not select database'; exit; } $result = mysql_query($sql,$con); mysql_query("set names sjis"); if (!$result) { echo "DB Error, could not query the database\n"; echo 'MySQL Error: ' . mysql_error(); exit; } $row = mysql_num_rows($result); $count = 1; for($i=0;$i<$row;$i++) { $array = mysql_fetch_array($result); //件名 $tmp_kenmei[$count] = mb_convert_encoding($array[0],"SJIS","UTF-8"); echo mb_convert_encoding($array[0],"SJIS","UTF-8"); $count++; }

    • ベストアンサー
    • PHP
  • classについて

    $server = "localhost"; $database = "hoge"; $user = "user"; $pass = "pass"; $con = mysql_connect ($server, $user, $pass); mysql_select_db ($database, $con); $sql = "SELECT * "; $sql.= "FROM `table` "; while ($result = mysql_fetch_array ($rs, MYSQL_ASSOC)) { echo $result[hoge]; } 上記と同じことを下記のようなクラスにして db.php class db { $server = "localhost"; $database = "hoge"; $user = "user"; $pass = "pass"; function __construct() { $this->con = mysql_connect ($this->server, $this->user, $this->pass); mysql_select_db ($this->db, $this->con); } function query($sql){ $rs = mysql_query ($sql); return mysql_fetch_array ($rs, MYSQL_ASSOC); } hoge.php $db = new db(); $sql = "SELECT * "; $sql.= "FROM `table` "; while ($db->query($sql)) { echo $result[hoge]; } のようにしたのですが、うまくいきません。 function query($sql){ $rs = mysql_query ($sql); $result = mysql_fetch_array ($rs, MYSQL_ASSOC); } とすると一行はとれるのですが、複数行とるにはどうしたらいいのでしょうか・・・ どうかよろしくお願いします。

    • 締切済み
    • PHP
  • php mysqlについて

    初心者です宜しくお願いします。 phpからデータベースを使いたいのですが(mysql)、mysql_query()関数のところで1366エラーが出ます。 半角英数ならエラーは出ません。 プログラムを貼り付けます。どなたかお願いします、説明をもっと書きたいのですが私もあまりわかってないのでどうもすみません。 今やっていることは全てローカルですwindowsを使ってます、文字コードもshift_jisです。phpもmysqlも一台のコンピュータでやっています。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>MySQLへデータを登録</title> </head> <body> DBとの連携テスト結果<br> <?php // DBに接続 if(!$con=mysql_connect("localhost","root","y3kwyuba")){ echo"connect_error"; exit; } // DBを選択 if(!mysql_select_db("test",$con)){ echo"select_db_error"; exit; } //MySQL4.1への対応 //mysql_query("SET NAMES SJIS"); この上の行のコメントをはずすとうまく動くのですが色々調べましたら、この書き方は推奨されないと書いてありました、他に対策はあるのでしょうか? $name = $_POST['nm']; $age = $_POST['age']; // フォームで送られてきたデータでINSERT文を作成 $sql = "insert into t_touroku(name,age) values('$name',$age)"; // SQLを実行 if(!$res=mysql_query($sql,$con)){ echo"query_error"; echo "エラー番号:".mysql_errno(), #エラー番号 "メッセージ:".mysql_error(); #エラーメッセージ exit; } // DBから切断 mysql_close($con); // メッセージ出力 echo"登録完了"; ?> </body> </html> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP javascript の関係に関して

    現在、MySQLよりPHPを用いてデータを取得し、PHPのある変数にデータを格納しています。 その結果を、javascriptの中でデータとして使用したいと考えていますが、そもそもPHPで格納されている変数をjavascriptの中で使用する事は可能なのでしょうか。。。 //例ですが、   $sql = "select aaa from AAA"; if (!mysql_select_db('db', $con)) { echo 'Could not select database'; exit; } mysql_query("set names sjis"); $result = mysql_query($sql,$con); $row = mysql_num_rows($result); $count = 1; for($i=0;$i<$row;$i++) { $array = mysql_fetch_array($result); $tmp_aaa[$count] = $array[0]; $count++; } <script type="text/javascript"> <!-- msgtxt = new Array(); for (i=0; i<3; i++){ msgtxt[i] = new Array(); } $count = 0; for($i=0;$i<$row_naiyou;$i++) { $msgtxt[$count] = $tmp_aaa[$count]; $count++; } というような形です。 javascript自体、php> ?>の中に囲まれていれば問題ないのでしょうか? 初歩的な質問で申し訳ありませんが、教えて下さい。

    • 締切済み
    • PHP
  • PHPについて。

    PHPで占いを作っているのですが、ランダム表示にするにはどうすればいいですか。 <html> <head> <title>入力フォーム</title> </head> <body> <center> <?php //接続 $link = mysql_connect("○○○","○○○","○○○"); if(!$link){ die('Connected error !'.mysql_error()); } //DB選択 $db_selected = mysql_select_db('○○', $link); if(!$db_selected){ die('Connected error !'.mysql_error()); } //フォーム入力文字を表現 $○○= $_POST['name']; /* echo $○○.'<br>'; */ //ハッシュ値の取得 $hash = crc32($○○); if($hash < 0){ $hash = 0 - $hash; } /* echo $hash; */ $result = mysql_query("SELECT ○○") or die("sql error !"); $retukazu = mysql_num_rows($result); $kekka = $hash % $retukazu + 1; //文字コード設定 mysql_query("SET NAMES sjis"); $sql = mysql_query("SELECT ○○ = $kekka"); if(!$sql){ die('query_error !'.mysql_error()); } while($row = mysql_fetch_assoc($sql)){ echo '<center><br />あなたはきっと・・・<br /><br /><font color= "Red"><strong>'.$row['Memo'].'</strong></font>です<br />'; } ?> </p> </body> </html>

    • ベストアンサー
    • PHP
  • PHP+MySQLで文字化けします

    PHPでMySQLに接続して以下のように テーブルの作成・そのテーブルにInsertをすると文字化けします。 PHPサーバーの文字コードはEUC-JP、MySQLの文字コードはlatin1です。 PHPのバージョンは5.04でMySQLのバージョンは4.1.20です。 無料レンタルサーバーなので詳細な設定は変更できません。 <?php // データベースに接続し、選択する mb_language('Japanese'); mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); $link = mysql_connect('localhost',"user","password") or die('Could not connect: ' . mysql_error()); echo 'Connected successfully'; mysql_select_db('user') or die('Could not select database'); mysql_query("SET NAMES UTF-8",$link); // SQL クエリを実行する $name = 'test'; $query = "CREATE TABLE IF NOT EXISTS `$name` ( `id` varchar(50) primary key, `name` varchar(50), `pw` varchar(50) );"; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); $query = "INSERT INTO $name (id, name) VALUES('test', 'テスト');"; $mojicode = mb_detect_encoding($query); $query = mb_convert_encoding($query, "UTF-8", "$mojicode"); $result = mysql_query($query) or die('Query failed: ' . mysql_error()); // HTML に結果を出力する echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; // 結果セットを開放する mysql_free_result($result); // 接続を閉じる mysql_close($link); ?> まだまだPHP、MySQL共に技術が未熟なため 説明不足な部分が多々あるかと思いますがご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPでの不思議なふるまいが理解できません。MySQLのデータ照合

    PHPでユーザーにURLでパラメーター付メールを送り、そのURLをクリックするとMySQLに保存されているユーザー名「hoge」というレコード内のsignという項目の値が0なら1にするというプログラムを書いています。 phpadminでsignが0なのを確認しているのに、URLをクリックしてプログラムを走らせると、//■■■■(3)■■■■の場所で終わってしまいます。(つまり0だと認識されていない?)その場合、echo $pass;の表示はなぜか1です。 echo $pass;は、//■■■■(2)■■■■のsignを1にする前の処理なのになぜ前もって1となるかが分からない点です。 そこでコメントされている■■■■(1)■■■■のexit;を、コメントアウトさせてからプログラムを走らせるとecho $pass;の表示は0です。 この現象が分かる方は教えて欲しいです。 宜しくお願いします。 //(これより以前省略) $db = mysql_connect($db_host,$db_user,$db_passwd); $sql = "select * from $db_table where username like 'hoge'"; $result = mysql_query($sql) or die("SQLに失敗しました".mysql_error()); //■■■■MySQLに保存されているデータを抜き出し $row = mysql_fetch_array($result); $sign = $row{'sign'}; $pass = $row{'password'}; echo $pass; //■■■■メールに書いてあるクリックされたURLの分解 $a = explode('&', $_SERVER['QUERY_STRING']); $urlpass = split('=', $a[1]); //exit;//■■■■(1)■■■■ if ( $sign == 0 ){ if ( $urlpass == $pass ){sign $sql = "update $db_table set sign = 1 where username like 'hoge'";■■■■(2)■■■■ $result = mysql_query($sql) or die("SQLに失敗しました".mysql_error()); if ($result){ echo"認証できました。"; } }else{ echo"認証できません。"; } }else{//$signが0以外なら echo"認証済みです";//■■■■(3)■■■■ }

    • ベストアンサー
    • PHP
  • PHPとMySQLで文字化けします

    <?php $con=mysql_connect("localhost","oxwar2","chono3"); $db=mysql_select_db("oxwar2",$con); $query="insert into japan(id,title,price)values(1,'絵本',1000)"; $result=mysql_query($query,$con); if($result){ print "OK"; } ?> として、実行すると上手くいきますが、phpMyadminで見ますと、日本語の部分だけが文字化けしております。 これを直すにはどうしたらよいのでしょうか。 文字コードはUTF8で作りました。色々試しても同じです。 どのようにしたらよいのでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 関数内で処理した内容を計算式で使用するには?

    function dbcount($table,$category) { require_once'DB.php'; $username = "abc"; $password = "abc"; $host = "abc"; $database = "abc"; $db = DB::connect("mysql://$username:$password@$host/$database"); $sql = "select count(*) from $table where $id;"; $result = $db->query($sql); while($row = $result->fetchRow()){ echo $row[0]; } } $kazu = 5; if ( $kazu >= db("table","key=1") ) { echo "真"; } else { echo "偽"; } ――――――――――――――――――――――――― といった感じのプログラムなのですが、if文が正常に処理されずに困っています。 関数dbを実行すると60が帰ってくるので、本来ならば「偽」と表示され、るはずなのですが、何故か「真」が表示され、文字の左側には60が表示されています。 60は関数を使用した結果なのですが、ここに表示されているという事は、条件式の数字として認識されていないという事でしょうか? だとすれば、どのようにすれば正常に計算されるのでしょうか?

    • ベストアンサー
    • PHP
  • MYSQLにINSERTできません。

    見よう見まねでやっている超初心者です。 恥を忍んで質問させて頂きます。 古いPHP(2003年ごろ)関連書籍に下記のような include.phpファイルがあるのですが、DB接続失敗、クエリ発行エラー等の エラー表示は出ないのですが(65行目位の、管理者パスワードチェック : _chkPass)でパスワードがMYSQLにINSERTできません。 PHPバージョンの違いなのでしょうか(私のはPHPV5 XAMPPです。) 色々試したりMYSQLの確認をしたのですが、どこがイケないのか、 どこをどう直したらいいのか全く分かりません。 このプログラムに不具合は無いのか?あったとしたらどう直したら動くようになるのか? わかる方どうかご教授の程よろしくお願い致します。 具体的にご教授頂けると大変助かります。 <?php putenv("TZ=JST-9"); define( "_DB_SERVER", "localhost"); define( "_DB_NAME", "cgiweb" ); define( "_DB_UID", "root" ); define( "_DB_PASS", "" ); //--------------------------------------------------------- // DB接続 : _dbConnect //--------------------------------------------------------- function _dbConnect(){ //DB接続 $_conn = mysql_connect( _DB_SERVER, _DB_UID, _DB_PASS) or die('DB接続失敗 = ' . mysql_error()); //DB選択 mysql_select_db( _DB_NAME, $_conn) or die('DB選択失敗 = ' . mysql_error()); return( $_conn ); } //--------------------------------------------------------- // DB切断 : _dbDisconnect //--------------------------------------------------------- function _dbDisconnect( $_conn ){ //DB切断 mysql_close($_conn); } //--------------------------------------------------------- // クエリ発行 : _query //--------------------------------------------------------- function _query( $_conn, $_query ){ $_result=mysql_query($_query,$_conn) or die('クエリ発行エラー = ' .mysql_error()); return( $_result ); } //--------------------------------------------------------- // FETCH実行 : _fetchArray //--------------------------------------------------------- function _fetchArray( $_result ){ $_row = mysql_fetch_array($_result,MYSQL_ASSOC); return( $_row ); } //--------------------------------------------------------- // 結果セット開放 : _freeResult //--------------------------------------------------------- function _freeResult($_result){ mysql_free_result($_result); } //--------------------------------------------------------- // 管理者パスワードチェック : _chkPass // 引数:コネクション // チェック対象パスワード // 戻値:_OK or _NG //--------------------------------------------------------- function _chkPass( $_conn, $_input_pass ){ $_err_str = ""; if( ! $_input_pass ){ //パスワード未設定なら入力画面を表示 $_err_str = "パスワードを入力してください"; } else{ //パスワードがあるなら店舗マスタの内容と比較 $_result = _query( $_conn, "SELECT tenpo_pass FROM tenpo_mst" ); $_row = _fetchArray( $_result ); if( $_row ){ //レコードがあればチェック if( $_input_pass != $_row['tenpo_pass'] ){ //認証NGなので、入力画面を再表示 $_err_str = "パスワードが誤っています"; } }else{ //レコードがなければ入力されたパスワードでレコード作成 $_sql = ""; $_sql .= "INSERT INTO tenpo_mst ("; $_sql .= " tenpo_name,"; $_sql .= " tenpo_pass,"; $_sql .= " zei_kbn,"; $_sql .= " zeiritsu,"; $_sql .= " zei_kirisute_kbn,"; $_sql .= " order_status"; $_sql .= " ) VALUES ("; $_sql .= " '',"; $_sql .= " '" . addslashes($_input_pass) . "',"; $_sql .= " 2,"; $_sql .= " 0,"; $_sql .= " 0,"; $_sql .= " 0"; $_sql .= " )"; _query( $_conn, $_sql ); } _freeResult( $_result ); } //入力画面表示の場合 if( $_err_str != "" ){ echo "<HTML>\n"; echo "<HEAD>\n"; echo "<TITLE>管理者認証</TITLE>\n"; echo "</HEAD>\n"; echo "<BODY>\n"; echo "<CENTER>\n"; echo "<FONT COLOR=RED SIZE=5>管理者認証</FONT>\n"; echo "<HR>\n"; echo "${_err_str}<BR><BR>\n"; echo "<FORM ACTION=\"mnt_menu.php\" METHOD=\"POST\">\n"; echo "<FONT COLOR=RED SIZE=2>※記号を除く半角小文字8文字以内</FONT><BR>\n"; echo "パスワード:<INPUT TYPE=\"password\" NAME=\"post_pass\" MAXLENGTH=8>\n"; echo "<INPUT TYPE=\"submit\" VALUE=\"送信\">\n"; echo "</FORM>\n"; echo "<HR>\n"; echo "</CENTER>\n"; echo "</BODY>\n"; echo "</HTML>\n"; _dbDisconnect($_conn); exit; } } ?> 以下省略しました。

    • ベストアンサー
    • PHP