Php PDO :: bindParam veri türleri .. nasıl çalışır?

3 Cevap php

Ben bind parametresi (veya değer) veri türünün beyanı için kullanılan merak ediyorum ...

Yani, ben gibi bir şey, ben int gibi bir param tanımlarsanız, PDO :: PARAM_INT, param int dönüştürülmesi gerektiğini düşündüm

$delete->bindParam(1, $kill, PDO::PARAM_INT);
//should works like
$delete->bindParam(1, (int)$kill);

ya param beyan türü değilse en azından bir hata atmak, ama öyle değil.

Etrafında Googling, ben buldum php.net arşivde:

Hi all,

I am currently working on PDO. Exactly on the bindParam() function. The third parameter data_type seems to be here to force the type of the value ? But when I try :

$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)";
$stmt = $dbh->prepare($sql);
$nom = 'Testarossa'; $marque = 'Ferrari' ;
$stmt->BindValue(':marque',$marque) ;
$stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ;

$stmt->execute(); $nom = '250 GTO' ;
$stmt->execute(); ?>

I was expecting to have either a PHP error or an interger in my database. But in my DB I have :

22 Testarossa Ferrari 23 250 GTO Ferrari

It mean that it didn't change if I have the third parameter or not. Or perhaps I miss something. Can someone tole me more ? Or just can someone told me where I can find information about it.

Selamlar,

Cyruss

that is exactly my situation. Where are my thoughts going wrong?

3 Cevap

Diğer dillerde diğer DB soyutlama çerçeveler o emin (doğru bağlı parametreleri desteklemeyen sürücüler için) in-astar değerleri için doğru kaçışa yapıyoruz yapma ve emin numaraları yaparak ağ verimliliğini artırmak gibi şeyler için kullanılabilir İkili uygun (verilen protokol desteği) dolu. Bu PDO'de benziyor, çok yapmaz.

   if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
                if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
                        char *p;
                        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
                        ZVAL_STRINGL(param->parameter, p, len, 0);
                } else {
                        convert_to_string(param->parameter);
                }
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
                convert_to_long(param->parameter);
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
                convert_to_boolean(param->parameter);
        }

Yani, bu bir STR (veya size tüm bu varsayılan olarak bir şey söylemek eğer) ve verinin dahili tip bir çift o zaman bir çift değilse, o zaman, bir yöntemi kullanarak bir dize haline dönecek derseniz farklı bir yöntem kullanarak bir dizeye dönüştürür.

Eğer bir int olduğunu söylüyorlar ama gerçekten bir bool ise, o zaman uzun bir dönüşecektir.

Eğer bir bool olduğunu söylüyorlar ama gerçekten bir numara, o zaman gerçek bir mantıksal değere dönüştürür.

Bu gerçekten onlar ek bir büyü yapabilirim sürücü içine parametreleri geçirmek kez (hızlı) stmt kaynağında bakarak, ben hayal gördüm hepsi bu. Yani, ben olsun, tüm hak ve sürücüler arasındaki davranış belirsizlik ve değişkenlik bir sürü yapmak biraz olduğunu tahmin ediyorum.

Yani PHP kaynak koduna dalmaya karar verdi ve bu ne buldum.

static int really_register_bound_param sürümü 5.2.9 hattı 329 ext / pdo / pdo_stmt.c içinde

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
    if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
        char *p;
        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
        ZVAL_STRINGL(param->parameter, p, len, 0);
    } else {
        convert_to_string(param->parameter);
    }
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
    convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
    convert_to_boolean(param->parameter);
}

Bu PDO bağlama sırasında yaptığı dönüşümler.

  • PDO :: PARAM_STR null dışında bir dize vermek ne dönüştürür.
  • PDO :: PARAM_INT uzun mamul haline bool değerlerden oluşan dönüştürür
  • PDO :: PARAM_BOOL bool değerlerden oluşan içine uzun ürünler dönüştürür

İşte bu. Başka bir şey dönüştürülür. PDO veri türlerini döküm için değil SQL biçimlendirmek için PARAM bayrakları kullanır.

Ben bindValue ile aynı şeyi denedim ve gördüğünüz davranış bindParam ile sınırlı değildir bu yüzden aynı sonucu var.

$stmt->BindValue(':marque', $marque) ;
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;

$stmt->execute();
$nom = '250 GTO';
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;
$stmt->execute();