2009-05-07 12 views
28

मैं सोच रहा हूँ के लिए ...PHP पीडीओ :: बिंदपाराम() डेटा प्रकार .. यह कैसे काम करता है?

मेरा मतलब है कि bindParam() (या bindValue()) में डेटा प्रकार की घोषणा प्रयोग किया जाता है, मैंने सोचा कि अगर मैं एक पूर्णांक तर्क (PDO::PARAM_INT) को परिभाषित, तर्क परिवर्तित किया जाना चाहिए एक पूर्णांक के लिए,

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

या कम से कम एक त्रुटि फेंक दें यदि तर्क घोषित प्रकार का नहीं है। पर ये स्थिति नहीं है।

चारों ओर Googling, मैंने पाया कि php.net संग्रह में:

हाय सब,

मैं वर्तमान में पीडीओ पर काम कर रहा हूँ। BindParam() फ़ंक्शन पर बिल्कुल । मान के प्रकार को मजबूर करने के लिए तीसरा पैरामीटर डेटा_टाइप प्रतीत होता है? लेकिन जब मैं कोशिश:

$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(); ?> 

मैं या तो एक PHP त्रुटि या मेरी डेटाबेस में एक interger के लिए उम्मीद कर रहा था। लेकिन मेरी DB में मेरे पास है:

22 Testarossa फेरारी 250 GTO 23 फेरारी

इसका मतलब यह है कि अगर मैं तीसरे पैरामीटर है या नहीं है कि यह नहीं बदला। या शायद मुझे कुछ याद आती है। क्या कोई मुझे और अधिक टोल कर सकता है? या सिर्फ ने मुझे बताया कि मुझे इसके बारे में जानकारी मिल सकती है।

सादर,

Cyruss

वास्तव में मेरी स्थिति है। मेरे विचार गलत कहां जा रहे हैं?

+1

"मुझे या तो मेरे डेटाबेस में एक PHP त्रुटि या एक इंटरगर होने की उम्मीद थी।" मैं भी – VolkerK

उत्तर

30

अन्य भाषाओं में अन्य डीबी अमूर्त चौखटे में यह सुनिश्चित करें कि आप (ड्राइवरों कि उचित बाध्य मानकों का समर्थन नहीं करते के लिए) उचित बचने कर रहे हैं इन-अस्तर मूल्यों के लिए और सुधार कर रही है जैसी चीजों के लिए इस्तेमाल किया जा सकता नेटवर्क दक्षता सुनिश्चित करके कि संख्याएं द्विआधारी पैक उचित हैं (प्रोटोकॉल समर्थन दिया गया है)। ऐसा लगता है कि पीडीओ में, यह ज्यादा नहीं करता है।

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); 
     } 

इसलिए, यदि आप कहते हैं कि यह एक एसटीआर है (या आप कुछ भी नहीं कहने अगर सब पर के रूप में है कि डिफ़ॉल्ट है) और अपने डेटा की आंतरिक प्रकार एक डबल तो यह एक स्ट्रिंग एक विधि का उपयोग कर में बदल जाएगा, यदि यह दोहरा नहीं है तो यह इसे एक अलग विधि का उपयोग करके एक स्ट्रिंग में परिवर्तित कर देगा।

यदि आप कहते हैं कि यह एक int है लेकिन यह वास्तव में एक बूल है तो यह इसे लंबे समय तक परिवर्तित कर देगा।

यदि आप कहते हैं कि यह एक बूल है लेकिन यह वास्तव में एक संख्या है तो यह इसे एक वास्तविक बूलियन में परिवर्तित कर देगा।

यह वास्तव में मैंने देखा है (जल्दी) stmt स्रोत को देखकर, मुझे लगता है कि एक बार जब आप ड्राइवर में पैरामीटर पास करते हैं तो वे अतिरिक्त जादू कर सकते हैं। तो, मुझे लगता है कि आपको जो कुछ मिलता है वह सही है और ड्राइवरों के बीच व्यवहार की अस्पष्टता और भिन्नता का एक बहुत कुछ है।

+1

दोह, मुझे निंजा पोस्ट किया गया। मान लीजिए मैं बस धीमी ^^ का जवाब देता हूं। – gradbot

+0

अरे, मैंने सोचा कि यह बच निकला है।/कोड को ठीक करने के लिए घर चलाना। –

+0

आह ठीक है, मुझे http://php.net/manual/en/pdo.prepared-statements.php कोई चिंता नहीं मिली। –

5

कम से कम एक प्रभाव पीडीओ है :: PARAM_INT है सम्मिलित करें पर प्रश्नों: बूलियन मान 0 या 1. जैसा

$i = true; 
$stmt->bindParam(':i', $v, PDO::PARAM_INT);

pdo_stmt.c में परिवर्तित कर रहे हैं:

else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) { 
     convert_to_long(param->parameter); 
}

+1

ओह .. मुझे आश्चर्य है कि यह प्रभाव वास्तव में उपयोगी है .. अन्य data_typeS के बारे में क्या? स्ट्रिंग, आदि? – Strae

+0

मुझे इन सुविधाओं के लिए विश्वसनीय दस्तावेज़ीकरण नहीं मिला है। इसलिए मैं सभी कोड/ext/pdo * में जा सकता हूं ... या बस उस पैरामीटर पर INSERT, अद्यतन ... क्वेरी के लिए भरोसा नहीं कर सकता। – VolkerK

+0

ठीक है, मैं यह देखने के लिए चयन प्रश्नों पर एक कोशिश करूंगा कि 'समस्या' उन्हें भी कैसे प्राप्त करती है ... दुख, वैसे भी, डेटा_टाइप घोषणा INSERT क्वेरी में स्वच्छता/प्रवाह नियंत्रण के लिए भी उपयोगी होगी । – Strae

3

मैं एक ही बात करने की कोशिश की बिंदवैल्यू के साथ और एक ही परिणाम मिला, इसलिए जो व्यवहार आप देख रहे हैं वह बाध्यप्रम तक ही सीमित नहीं है।

$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(); 
19

इसलिए मैंने PHP स्रोत कोड में गोता लगाने का फैसला किया और यह मुझे मिला।

संस्करण 5.2.9

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); 
} 

की लाइन 329 पर ext/पीडीओ/pdo_stmt.c में static int really_register_bound_param ये रूपांतरण बाध्यकारी दौरान पीडीओ करता है।

  • पीडीओ :: PARAM_STR जो कुछ भी आप इसे स्ट्रिंग पर देते हैं उसे नल को छोड़कर परिवर्तित करता है।
  • पीडीओ :: PARAM_INT
  • पीडीओ :: PARAM_BOOL bools

यह है कि में देशांतर धर्मान्तरित देशांतर में bools बदल देता है। कुछ और परिवर्तित नहीं किया गया है। पीडीओ डेटा प्रकारों को कास्ट न करने के लिए एसक्यूएल प्रारूपित करने के लिए पैराम झंडे का उपयोग करता है।

+0

"पीडीओ :: PARAM_STR जो कुछ भी आप इसे स्ट्रिंग में देते हैं उसे परिवर्तित करता है" NULL को छोड़कर –

संबंधित मुद्दे