PHP PDO bindValue () garip sorun

3 Cevap php
<?php
try
{
    $db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");

    $stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
    $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
    $stmt->execute();

    while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
    {
        echo var_dump($r);                                      
    }

}
catch( PDOException $e )
{
    die("Exception");
}

Sorun bu hat üzerinde: $ deyim-> bindValue (": index", $ _GET ['index'], PDO :: PARAM_INT);

Ve özel parametre ikinci biridir.

Yukarıda olduğu gibi kod while döngü yürütülür değildir bu yüzden hiçbir şey dönmez, çalışmıyor. Ben 10 gibi bir sayı ile $ _GET ['index'] yerine ise, bu 10 satır döndürür, gayet güzel çalışıyor. Bir dizi geçmesi gerekir böylece $ _GET ['index'] yankılanan, bir dizi gösterir. Ben de bindParam denedim ama sonuç aynı.

Neden bu çalışmıyor?

EDIT:

I (int) $ _GET ['index'] ile $ _GET ['index'] değiştirin İlginç ... çalışıyor.

3 Cevap

Eğer $ deyim-> errorInfo kontrol ederseniz () aslında sorgu başarısız olduğunu göreceksiniz.

PDO :: PARAM_INT bunu bir tamsayı veriyoruz PDO'yu söyler. PDO bir tamsayı vermek istemiyorsanız, PDO sql dize değerini teklif edecek.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10

$ _GET Tüm değerler bir dizi ya da bir dize vardır. Bir değer olarak bağlama önce bir tamsayı $ _GET ['index'] coercing tarafından doğru şeyi yaptı. Bunu yaparak, PDO bir tamsayı alır, PDO'de bir tamsayı :: PARAM_INT bekliyordum ve bu nedenle sql dize değeri teklif olmaz.

SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10

$_GET süper küresel dizideki değerleri dizelerdir: PHP sorgu dizesi iin geçti ne tahmin değil.


If you want one value from $_GET to be considered as an integer -- which is what you want, here -- you'll need to convert it to an integer yourself.

Bunu yapmak için, kullanabilirsiniz:

  • A typecast , (int)$_GET['yourval']
  • Kullanılacak bu belirli bir taban sağlar: intval() işlevi

$ _GET ['Index'] gibi geliyor olmasını beklediğiniz değildir. Yakın değerini incelemek için var_dump () kullanın. Bazı karakterler görsel algılanamaz çünkü, raporlar var_dump dize uzunluğuna dikkat edin, ama dize uzunluğu gizli hikaye anlatacağım.