私は準備されたステートメントとして単純なクエリを実行しようとしていますが、成功しません。ここでは、コードは次のようになります。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.7MYSQL_VERSION_ID 50720
とMYSQL_VERSION_ID 50716
- を使用して、私のオリジナルのテストサーバーの両方に対し、
MYSQL_VERSION_ID 50557
としてDBIトレースで報告されたのMySQL 5.5クライアントを使用してサーバを見つけましたできます!は多分これは。このQを見つけた人を助け、私はいくつかのテストの後、問題
を用意しましょう。 'bind_param'と' execute'呼び出しを '$ sth-> execute( 'session:06b6d2138df949524092eefc066ee5ab3598bf96')'で置き換えるとどうなりますか? – Borodin
@Borodin '$ sth-> execute(...) 'と同じ問題です –
' id'カラムはどのようなタイプのデータですか?数値ではないと確信していますか? – Borodin