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ğlama4.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.7MYSQL_VERSION_ID 50720
veMYSQL_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
hazırlayalım. Eğer $ sth-> execute ('session: 06b6d2138df949524092eefc066ee5ab3598bf96') 'ile' bind_param' ve 'execute' çağrılarını değiştirirseniz ne olur? – Borodin
@Borodin aynı sorundur '$ sth-> execute (...)' –
'id' sütunu ne tür veridir? Sayısal olmadığından emin misin? – Borodin