2017-12-04 118 views
8

gerçek parametresi yerine tek alıntı koyar Hazırlanmış bir deyim olarak basit bir sorgu yapmaya çalışıyorum ama hiçbir başarı. İşte kod:Perl DBI (MySQL) hazır ifadede

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 sunucusu bir sözdizimi hatası near ''' ile yanıt verir.

DBII-iz çıkış beyanı olması gerektiği gibi hazırlanmış almaz gibi bana Yani

-> 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 

, görünüşe gösterir. Sorguyu parametre olmadan gönderdiğimde beklendiği gibi çalışır.

Burada neleri özlüyorum? bağlam için
:

DBII versiyonu DBI 1.637-ithread olduğunu MySQL sürüm

5.5.57-0+deb8u1 Windows'un perl 5, version 26, subversion 1 (v5.26.1) built for MSWin32-x86-multi-thread-64int
ve Ubuntu perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi

Edit1 ile test edilmiştir olduğu Catalyst::Plugin::Session::Store::DBIC ile Catalyst kullanarak ederken sorun tespit ettik. Burada, id sütunu, bir oturum kimliğini tutan bir Varchar (72) türüdür.

Edit2:

  • DBD :: mysql versiyonu aynı sorunu
  • bir Bağlama içinde $sth->bind_param('session:foo', SQL_VARCHAR); sonuçları yoluyla bağlanması aynı sorunu
  • yılında $sth->execute('session:foo'); sonuçları yoluyla Bağlama 4.043
  • olduğunu sayısal alan çalışır, ancak yalnızca açık tip tanımıyla $sth->bind_param(1, 1512407082, SQL_INTEGER);

Edit3:
Ben biraz daha test yapmak için zaman buldum ama hiçbir tatmin edici sonuçlar ile:

  • Ben eski bir sunucuyla test etmek mümkün oldu ve işe yaradı. DBI ve DBD versiyonları :: MySQL aynıdır, ama $dbh->{mysql_server_prepare} = 1;ile MySQL 5.7 MYSQL_VERSION_ID 50720 ve MYSQL_VERSION_ID 50716
  • kullanarak orijinal test sunucularına hem oysa MYSQL_VERSION_ID 50557 olarak DBII-iz bildirilen MySQL 5.5 istemcisi kullanarak sunucuyu bulundu işe yarıyor! Belki bu q bulur birisi. Yardımcı olur, ama yerine şimdi sorun bazı testlerden sonra
+2

hazırlayalım. Eğer $ sth-> execute ('session: 06b6d2138df949524092eefc066ee5ab3598bf96') 'ile' bind_param' ve 'execute' çağrılarını değiştirirseniz ne olur? – Borodin

+0

@Borodin aynı sorundur '$ sth-> execute (...)' –

+0

'id' sütunu ne tür veridir? Sayısal olmadığından emin misin? – Borodin

cevap

3

gerçek nedeni, bu :: arasında DBD bir uyumluluk sorunu gibi görünüyor sonucuna geldi ediyorum mysql ve MySQL istemcisi 5.7 (ve/veya MySQL sunucusu 5.5).

  • not indirimi tarif here gibi MySQL 5.6: Aynı sorunu çalıştırmak ki, diğerleri için çok

    En azından, I, Ubuntu 16 (Xenial) için bir çözüm bulundu. Benim için, sunucu/istemci olmadan libmysqlclient-dev yükleme yeterli olduğunu
  • ben DBD::mysql GitHub de bir sorunu açacağını şimdi MySQL 5,6

yüklü inşa alır ve güncelleyecek şekilde, DBD :: MySQL sudo cpanm --reinstall DBD::mysql yeniden Bu sorunun, bu sorunla ilgili herhangi bir haber varsa. Ayrıca benim için çalıştı


alternatif bir çözüm

:
sunucu beyanı doğru görünüyor $dbh->{mysql_server_prepare} = 1;