2013-01-22 6 views
6

Böyle bir sorgu var: (Postgresql 8.4, PHP-fpm 5.3.10 (fpm-fcgi) üzerine)PHP PDO sorgusuna "now() -interval '2 dakika'" gibi şeyler nasıl eklenir?

select * from users where now() - interval '2 minutes' < seenlast ORDER BY seenlast; 

yüzden, PHP/PDO sorguyu kullanmak istiyorum:

$mymin=5; //this is a variable can be changed by $_GET 
$query = $db_conn->prepare("select * from users where now() - interval ':myminute minutes' < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute",$mymin) 
$query->execute; 

Bu işe yaramaz, dakikalar ($ mymin) uygun bir şekilde iletmenin bir yolunu bulamıyorum. Eğer timesting eserlerini hardcode yaparsam, kodun diğer kısmı doğru olmalı.

Ben de denedim: tırnak işaretleri olmadan

$temp=$mymin." minutes"; 
$query = $db_conn->prepare("select * from users where now() - interval :myminute < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute",$temp) 

I already saw this, didn't help

+0

aynı sorunu vardı ancak hata aldı: 'sqlstate [HY105]: geçersiz parametre türü: 7 '.Bunun nedeni, adlandırılmamış params kullanıldığında tespit edilen değiştirmelerden (soru işaretleri) daha fazla param olduğu için oldu. –

cevap

11

Aralıkları sayılarla çarpılarak edilebilir. Bu yüzden bir yaklaşım, "myminutes" parametresini basit bir tamsayı olarak geçirerek, interval '1 minute' * :myminutes ifadesini hazırlayarak ifade etmektir.

+0

Mükemmel çözüm: D – ykat

-2
... - INTERVAL :myminute MINUTES ... 

uygun yöntemdir. Eğer yardımı olacaksa, kullanım eşdeğeri olarak tutucuların düşünüyorum eski okul değişken tabanlı sorgu yapı yöntemleri yer tutucular dışında

... - INTERVAL $myminute MINUTES 

değişkenler bilmediğimiz enjeksiyon açıklarını ilgileneceğim. Yer tutucuları kullandığınız için SQL sözdizimini değiştireceğiniz anlamına gelmez, bu nedenle

geçerli SQL değildir. için mu


takip:

mysql> select now() + interval '2 minute'; 
ERROR 1064 (42000): 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 
mysql> select now() + interval 2 minute; 
+---------------------------+ 
| now() + interval 2 minute | 
+---------------------------+ 
| 2013-01-22 13:38:24  | 
+---------------------------+ 
1 row in set (0.02 sec) 
+0

answare için teşekkür ederim ama yine de hayır şans :( – ykat

+0

INTERVAL: myminute MINUTES'un çalışacağından şüphe duyarım, bir sözdizimi hatası üretmesini beklerdim. 'INTERVAL '2 dakika' OTOH mükemmel, 'aralık' 3 dakika '' bir cast operasyonu ve '' 3 dakika '' interval '' ya da 'cast' ('interval' olarak 3 dakika ') yazmanın bir başka yoludur. –

+0

@muistooshort: yanlış.adı yukarıya doğru bakın –

5

Çok fazla PDO veya PHP bilmiyorum ama sanırım burada neyin yanlış gittiğini biliyorum.

dediğinizde bu: Gerçekten aynı olan döküm işlemi gerçekleştirirken ediyoruz

interval '3 minutes' 

olarak:

'3 minutes'::interval 
cast('3 minutes' as interval) 

Peki bir ARALIĞINA bir METİN değerini atıyor yapıyoruz . Bu, '3 minutes' dizgisine benzeyen bir şey üretmeniz gerektiği anlamına gelir. Sen dize parçalar bir araya kullanarak dize birleştirme yapıştırın olabilir:

# Use cast to make the precedence cleaner. 
$query = $db_conn->prepare("select * from users where now() - cast(:myminute || ' minutes' as interval) < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute", $mymin) 

Yoksa PHP'de çekişmeler dize yapmak mümkün olmalıdır:

$query = $db_conn->prepare("select * from users where now() - interval :myminute < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute", $mymin . ' minutes') 
+0

uzun bir gün, yarın da bunu kontrol edeceğim. – ykat

0

Ben phalcon ve iç Modelleri PDO ayrıştırıcı mücadele etmektedirler Aynı sorun ile saatlerce.

bu çözüm Bulunan:

public static function getTimedoutRequests($secsThreshold) { 
    return self::find(
     array(
      // PDO is buggy here, can't use INTERVAL 
      "DATE_PART('epoch', create_time) < DATE_PART('epoch', NOW()) - ?0", 
      "bind" => array(
       $secsThreshold 
      ) 
     ) 
    ); 
} 
İlgili konular