2012-03-19 22 views
0

SQL文の引数としてPOSTパラメータを1つ使用して、ここにクエリ(MySQLデータベースのZend Frameworkを使用したPHP)があります。mysql_real_escape_stringメソッドが実際に遅い(ほぼ1秒)

私は開発マシンにローカルXAMPPをインストールしていますが、この小さなスクリプトの実行時間は、前にその引数にmysql_real_escape_string()を使用するかどうかにかかわらず引数を渡すかどうかに関係なく150msのようなものです。

次に、BitNami-WAMP-Stackがインストールされた仮想サーバーがあります。私がスクリプトを実行すると(100%同じデータベースの内容)、mysql_real_escape_stringなしで約260msかかってしまいますが、これはローカルマシンとしては「高速」(150msはまったく高速ではないことがわかります)ではありませんが、大丈夫です。しかし、POST変数から1つのmysql_real_escape_string()を引数に追加すると、すべての処理に1.2秒かかります。

また、mysql_real_escape_stringを呼び出すたびに、仮想サーバー上でスクリプトを約1秒遅く実行することに気付きました。私のローカルマシンでは、これは何の効果もありません。

これはどのようにすることができますか?これはMySQLのセットアップのことか、PHP.iniのものなのでしょうか?私は100%同じデータベースと両方のマシン上のPHPソースを持っているので、私はそれがただパラメータ化できると思いますか?

事前にお問い合わせいただきありがとうございます。

EDIT:だからここ

は、最初の(bootstrap.phpの中で)DB接続、私は何をすべきかです:その後、

$GLOBALS["db"]= new Zend_Db_Adapter_Pdo_Mysql(array(
      'host'  => "localhost", 
      'username' => "user", 
      'password' => "password", 
      'dbname' => "database" 
      )); 

以降場合に役立ちデータベースクエリに:

global $db; 

$query = sprintf("SELECT * FROM table WHERE id = '%s'", mysql_real_escape_string($id)); 

$db->query("SET NAMES 'utf8'"); 

$db->fetchAll($query); 

私はこの単純なテストラインを自分のコードに追加すると、仮想マシン上でスクリプトが〜600ms遅くなります。

mysql_real_escape_string("TEST"); 
+0

クエリの作成と実行のコードを表示できますか?また、DBは同じ物理/仮想で実行されますか? – prodigitalson

+1

エスケープする文字列のサイズ(文字数)はどれくらいですか? –

+0

私がエスケープしている文字列は、2〜5桁の長さを持つintデータベースIDだけです – homtg

答えて

0

長期的な解決策が準備された文への切り替えをしなければならないが、それは正しいです。 PDO接続のmysql_real_escape_stringに相当PDO::quoteのようだ:

http://php.net/manual/de/pdo.quote.php

不利益mysql_real_escape_stringベースのソリューションに比べて?

+0

引用符を追加するだけでは(この関数のように)十分ではないと思います。 mysql_real_escape_string()は、mysqlがそれらを実行するのを妨げるので、実際には '\'で任意の特殊文字をエスケープします。 (もし私が間違っている私を修正してください) – HTDutchy

+0

マニュアルはまた、入力文字列内の特殊文字を置き換えると言う – homtg

0

Iマニュアルからの情報であった方法、私の場合に溶液をmysql_real_escape_stringの最初の呼び出しに同じ遅延を有していた:MySQLの接続は(mysql_real_escape_stringのを使用する前に必要とされるhttp://php.net/manual/en/function.mysql-real-escape-string.php

」さもなければレベルE_WARNINGのエラーが発生する)、及びlink_identifierが定義されていない場合、最後のMySQL接続が使用されます。

接続が確立されていないと遅延に関する情報しかありませんでした。

あなたのケースでは、PDOを使用して接続する場合は、PDO :: quoteを使用する必要があります。mysql_pconnect/mysql_connectを使用している場合は、遅滞なくmysql_real_escape_stringを使用できます。

関連する問題