PHP شركة تنمية نفط عمان::bindParam() أنواع البيانات..كيف يعمل ؟

StackOverflow https://stackoverflow.com/questions/833510

سؤال

أنا أتساءل ماذا إعلان نوع البيانات في bindParam() (أو bindValue()) يستخدم...

يعني أنا قلت إن تحديد عدد صحيح حجة (PDO::PARAM_INT) ، يجب أن يكون حجة تحويلها إلى عدد صحيح ، شيء من هذا القبيل

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

أو على الأقل رمي خطأ إذا كان حجة ليس من نوع المعلنة.ولكن هذا ليس هو الحال.

غوغلينغ حولها ، وجدت أن في php.net أرشيف:

مرحبا جميعا ،

أنا أعمل حاليا في شركة تنمية نفط عمان.بالضبط على bindParam() وظيفة.الثالث المعلمة data_type يبدو أن هنا لفرض نوع من القيمة ؟ ولكن عندما أحاول :

$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 فيراري تيستاروسا 23 250 GTO فيراري

هذا يعني أنه لم يغير إذا كنت وقد المعلمة الثالث أم لا.أو ربما فاتني شيء.يمكن لشخص ما تول لي أكثر ؟ أو مجرد أن شخص ما قال لي أين يمكنني العثور على معلومات حول ذلك.

التحيات ،

Cyruss

هذا هو بالضبط الوضع.أين هي أفكاري أين الخطأ ؟

هل كانت مفيدة؟

المحلول

في الأطر التجريد DB بلغات أخرى يمكن استخدامها لأشياء مثل التأكد من تفعلونه السليم الهروب للقيم في بطانة (للسائقين التي لا تدعم المعلمات ملزمة السليم) وتحسين كفاءة الشبكة بجعل معبأة أرقام المؤكد ثنائي بشكل مناسب (نظرا دعم بروتوكول). يبدو في شركة تنمية نفط عمان، فإنه لا يفعل الكثير.

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

وهكذا، إذا أنت تقول أنها STR (أو إذا قلت أي شيء على الإطلاق، وهذا هو الافتراضي) ونوع داخلي البيانات الخاص بك هو مزدوج بعد ذلك سوف تحويلها إلى سلسلة باستخدام أسلوب واحد، إذا لم يكن ل مضاعفة بعد ذلك سوف يتم تحويله إلى سلسلة باستخدام طريقة مختلفة.

إذا كنت أقول أنه عدد صحيح ولكنه في الواقع منطقي بعد ذلك سوف يتم تحويله إلى فترة طويلة.

إذا أنت تقول انها منطقي لكنها في الحقيقة عدد بعد ذلك سوف يتم تحويله إلى منطقية صحيح.

وهذا هو حقا كل ما رأيته (بسرعة) النظر في مصدر stmt، وأتصور بمجرد تمرير المعلمات إلى السائق يمكن القيام به السحر إضافية. لذا، كنت أعتقد أن كل ما تحصل عليه هو قليلا من القيام به الحق والكثير من الغموض السلوك والتباين بين السائقين.

نصائح أخرى

لذلك قررت أن يغوص في شفرة المصدر PHP و هذا ما وجدته.

static int really_register_bound_param في ext/شركة تنمية نفط عمان/pdo_stmt.ج على خط 329 من النسخة 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);
}

هذه هي التحويلات شركة تنمية نفط عمان لا ملزمة.

  • شركة تنمية نفط عمان::PARAM_STR يحول كل ما تعطيه إلى سلسلة باستثناء null.
  • شركة تنمية نفط عمان::PARAM_INT يحول bools في يتوق
  • شركة تنمية نفط عمان::PARAM_BOOL يحول يتوق إلى bools

هذا هو.شيء آخر هو تحويلها.شركة تنمية نفط عمان يستخدم المعلمة الأعلام إلى تنسيق SQL لا يلقي أنواع البيانات.

وهناك واحد على الأقل تأثير PDO :: PARAM_INT ديه في INSERT استفسار: يتم تحويل القيم المنطقية إلى 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);
}

وحاولت نفس الشيء مع BindValue وحصلت على نفس النتيجة لذلك السلوك الذي نشهد لا يقتصر على bindParam.

$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(); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top