MySQLに接続されているのにmysql_real_escape_stringがエラー - PHPプロ!Q&A掲示板

1299

  • 0P

MySQLに接続されているのにmysql_real_escape_stringがエラー

質問日時 / 2008年7月11日 12:27    回答数 / 6件

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

キーワード / mysql_real_escape_string    mysql   

MySQL:5.1.22-rc
PHP:5.2.5
鯖:XREA coreserver

  1. $link = mysql_connect('localhost', 'ユーザ', 'パスワード');
  2. if (!$link) {
  3. die('接続できませんでした: ' . mysql_error());
  4. }
  5. echo '接続に成功しました';
  6. mysql_close($link);
で接続に成功していて、SQLのデータも取得しているのに
mysql_real_escape_stringがエラーを出します。。

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ドメイン名が来ている。。'@'localhost' (using password: NO) in -----

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in ----

エラー内容にも納得がいきません。。
何故MYSQLのユーザー名ではなく、ドメイン名がくるのでしょう?

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



ツリー一覧

┗A01kaitaumysql_real_escape_string() をどうやって呼び出して
 ┗A01-1hoges返信有難うございます。 一応呼び出しは関数群とし
  ┗A01-1-1kaitauとりあえず、mysql_real_escape_stringを呼ぶ前にmysq
   ┗A01-1-1-1hogesやっぱりそうですよね。 >とりあえず、mysql_real
    ┗A01-1-1-1-1kaitau> >とりあえず、mysql_real_escape_stringを呼ぶ前に
     ┗A01-1-1-1-1-1hogesなるほど。わかりました! ># そもそもPDO使って

回答一覧

並び替え:

A01
answererkaitau [7月11日 13:03]

mysql_real_escape_string() をどうやって呼び出しているのか不明ですが、
とりあえず呼び出す前の記述が載せられた通りなら、
mysql_real_escape_string() を呼んでいるのがmysql_closeの後になり、
開いている接続が無いので、新たな接続を試みて失敗しているのだと思います。

エラー内容については、php.iniかmy.cnfなどにデフォルトのユーザがそう記述されているために
それを用いて接続を試みているという事では無いでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1
replyerhoges [7月11日 13:19] (最終編集:7月11日 13:28)

返信有難うございます。

一応呼び出しは関数群としてコールしてます。

  1. function xsssql( $stg ){
  2.   $stg = htmlspecialchars( $stg, ENT_QUOTES );/* XSS対策 */
  3.   $stg = nl2br( $stg );/* \r\nを<br />に */
  4.   $stg = str_replace( "\r\n",  "", $stg);/* 余分な\r\nを退治 */
  5.   $stg = mysql_real_escape_string( $stg );/* SQLインジェくション対策 */
  6.   return $stg;
  7. }
  8. $pageID = xsssql($_GET["pageID"]);

リクエスト値の送受信に関係なく、この関数は読み込まれています。
つまり、$_GET["pageID"] が false であっても通過します。

他の鯖(XREA下位VerでPHPやSQLのVerは同じ)ではエラーは排出されないのですが。。
何故うまくいっていたのでしょう??
とりあえず、こんな形で回避してみましたが。。

  1. $pageID = (isset($_POST["pageID"])) 
  2. ? xsssql($_POST["pageID"]) : ( (isset($_GET["pageID"])) 
  3. ? xsssql($_GET["pageID"]) : false ) ;

あと、mysql.default_user は no value でした。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerkaitau [7月11日 19:22] (最終編集:7月11日 19:23)

とりあえず、mysql_real_escape_stringを呼ぶ前にmysql_closeを呼んでたりしますか?
或いは、mysql_connectを呼ぶ前にmysql_real_escape_stringを使おうとしてませんか?
まずはそこの確認が必要かと思います。

少なくともエラー内容を見る限り、接続が無い状態から、
再接続をしようとして失敗している状態なので。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerhoges [7月11日 20:04]

やっぱりそうですよね。

>とりあえず、mysql_real_escape_stringを呼ぶ前にmysql_closeを呼んでたりしますか?
>或いは、mysql_connectを呼ぶ前にmysql_real_escape_stringを使おうとしてませんか?

これが正しいですよね。
なぜ同じスクリプトで一方がエラーが出ないのかが不思議ですが。。

書き忘れていましたがmysql_connectmysql_closeは使っていないです。
PDO関数でDBに接続してます。
ちなみに前述の通り、他の鯖ではエラー排出しないです。。

うーん、、

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1 満足
replyerkaitau [7月11日 20:19]

> >とりあえず、mysql_real_escape_stringを呼ぶ前にmysql_closeを呼んでたりしますか?
> >或いは、mysql_connectを呼ぶ前にmysql_real_escape_stringを使おうとしてませんか?

> これが正しいですよね。
> なぜ同じスクリプトで一方がエラーが出ないのかが不思議ですが。。

えーと、間違って伝わってたらすみませんが、その認識は間違ってると思います。
mysql_real_escape_stringは、関数の説明にもある通り、mysqlへの接続が
確立されていることが前提なので、基本的には、mysql_connectを呼んでから
mysql_closeを呼ぶまでの間に使われるのが正しい使い方です。

上記の間以外の場合で呼ばれた場合、PHPはmysql_real_escape_string内部で
独自にmysqlへの接続を試みるので、正しく行っているように見えるサーバは、
ここでのデフォルトの接続が許可されているだけのことでしょう。

# そもそもPDO使ってるならPDOStatementでbindしてしまうなりPDO::quote(試したことないけど)を
使えばいいんじゃないでしょうか

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyerhoges [7月11日 21:01]

なるほど。わかりました!

># そもそもPDO使ってるならPDOStatementでbindしてしまうなりPDO::quote(試したことないけど)を
>使えばいいんじゃないでしょうか 

使っていますw
色々とSQLインジェクションを調べてて mysql_real_escape_string の有用性?を
調べていたら思わぬエラーに引っかかってしまった感じです。

助かりました。デフォルトの接続が許可されているだけでした。
やっと納得できました。
やっぱりもっと説明を読むべきでした。
有難うございます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

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