2017-12-04 13 views
8

私は準備されたステートメントとして単純なクエリを実行しようとしていますが、成功しません。ここでは、コードは次のようになります。Perl DBI(MySQL)は、プリペアドステートメントに実際のパラメータの代わりにシングルクォートを入れます。

package sqltest; 
use DBI; 

DBI->trace(2); 

my $dbh = DBI->connect('dbi:mysql:database=test;host=***;port=3306','the_username', '****'); 
my $prep = 'SELECT me.id, me.session_data, me.expires FROM sys_session me WHERE me.id = ?'; 
$dbh->{RaiseError} = 1; 
my $sth = $dbh->prepare($prep); 
$sth->bind_param(1, 'session:06b6d2138df949524092eefc066ee5ab3598bf96'); 
$sth->execute; 
DBI::dump_results($sth); 

MySQLサーバは、構文エラーnear '''で応答します。

DBIトレースの出力が私にそう

-> bind_param for DBD::mysql::st (DBI::st=HASH(0x21e35cc)~0x21e34f4 1 'session:06b6d2138df949524092eefc066ee5ab3598bf96') thr#3ccdb4 
Called: dbd_bind_ph 
    <- bind_param= (1) [1 items] at perl_test_dbi_params.pl line 10 
[...] 
>parse_params statement SELECT me.id, me.session_data, me.expires FROM sys_session me WHERE me.id = ? 
Binding parameters: SELECT me.id, me.session_data, me.expires FROM sys_session me WHERE me.id = ' 
[...] 
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1 

を示し、それが必要としてステートメントは準備されませんように、それが見えます。 パラメータを指定せずにクエリを送信すると、期待どおりに動作します。

私はここで何が欠けていますか?コンテキストに

DBIバージョンはMySQLのバージョンは5.5.57-0+deb8u1

のWindows perl 5, version 26, subversion 1 (v5.26.1) built for MSWin32-x86-multi-thread-64int
とUbuntu perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi

EDIT1でテストされ、DBI 1.637-ithreadあるCatalyst::Plugin::Session::Store::DBICで触媒を使用している間、私はこの問題に気づきました。ここで、id-columnはVARCHAR(72)型で、session-idを保持します。

EDIT2:

  • DBD :: MySQLバージョンは、同じ問題
  • 結合に$sth->bind_param('session:foo', SQL_VARCHAR);結果を介して結合同じ問題
  • $sth->execute('session:foo');結果を介して結合4.043
  • あります数値フィールドは機能しますが、明示的な型定義の場合のみ$sth->bind_param(1, 1512407082, SQL_INTEGER);

EDIT3:
私はいくつかのより多くのテストを行うには時間を見つけて、ない満足のいく結果が得られていない:

  • 私は古いサーバーでテストすることができたし、それが働きました。 DBIとDBDのバージョン:: mysqlのは同じですが、私は$dbh->{mysql_server_prepare} = 1;でMySQL 5.7 MYSQL_VERSION_ID 50720MYSQL_VERSION_ID 50716
  • を使用して、私のオリジナルのテストサーバーの両方に対し、MYSQL_VERSION_ID 50557としてDBIトレースで報告されたのMySQL 5.5クライアントを使用してサーバを見つけましたできます!は多分これは。このQを見つけた人を助け、私はいくつかのテストの後、問題
+2

を用意しましょう。 'bind_param'と' execute'呼び出しを '$ sth-> execute( 'session:06b6d2138df949524092eefc066ee5ab3598bf96')'で置き換えるとどうなりますか? – Borodin

+0

@Borodin '$ sth-> execute(...) 'と同じ問題です –

+0

' id'カラムはどのようなタイプのデータですか?数値ではないと確信していますか? – Borodin

答えて

3

の本当の原因ではなくなりましたでしょう、私はこれはDBD間の互換性の問題のようだという結論に達しました:: mysqlおよびMySQLクライアント5.7(および/またはMySQLサーバ5.5)。

  • ダウングレードを説明hereのようなMySQLの5.6に:同じ問題に遭遇するかもしれない、他の人のためになるよう

    は、少なくとも、私は、Ubuntuの16(xenial)のための解決策を見つけました。私にとっては、サーバー/クライアントなしlibmysqlclient-devをインストールすることで十分であった
  • それは私がDBD::mysql GitHubで問題を提出します今のMySQL 5.6

インストールして構築しますし、更新するように、DBD :: MySQLのsudo cpanm --reinstall DBD::mysqlを再インストールこの問題に関するニュースがあれば、この答えです。


も私のために働いた代替ソリューション、:
は、サーバーが正しく見えるあなたの声明$dbh->{mysql_server_prepare} = 1;

関連する問題