PHP PDO:: bindParam () типы данных..как это работает?

Переменная self.indexes не будет заполнена после цикла запросами. Запросы даже не выполняются там.

Если вы не хотите использовать общий экспорт в файл, вы можете поместить запись в файл, чтобы функционировать при закрытии паука. Подробности здесь: scrapy: вызов функции, когда паук выходит

. Вам нужно привязать сигнал к функции и написать там код.

30
задан Shi 28 March 2017 в 00:27
поделиться

4 ответа

В других структурах абстракции БД на других языках его можно использовать для таких вещей, как выполнение правильного экранирования для встроенных значений (для драйверов, которые не поддерживают правильные параметры привязки) и повышение эффективности сети путем обеспечения надлежащей двоичной упаковки чисел (при условии поддержки протокола). Похоже, что в PDO это мало что делает.

   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 (или если вы вообще ничего не говорите, поскольку это значение по умолчанию), а внутренний тип ваших данных - double, то он будет превратите его в строку с помощью одного метода, если это не double, то он преобразует его в строку, используя другой метод.

Если вы скажете, что это int, но на самом деле это bool, тогда он преобразует его в длинный .

Если вы так говорите ' sa bool, но на самом деле это число, тогда оно преобразует его в истинное логическое значение.

Это действительно все, что я увидел (быстро), глядя на исходный код stmt, я полагаю, как только вы передадите параметры в драйвер, они смогут творить дополнительную магию , Итак, я предполагаю, что все, что вы получаете, - это немного правильного поведения и много неоднозначного поведения и различий между водителями.

32
ответ дан 27 November 2019 в 23:40
поделиться

There's at least one effect PDO::PARAM_INT has on INSERT queries: boolean values are converted to 0 or 1. Like in

$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);
}
6
ответ дан 27 November 2019 в 23:40
поделиться

Итак, я решил погрузиться в исходный код PHP, и вот что я нашел.

static int really_register_bound_param в ext / pdo / pdo_stmt.c в строке 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);
}

Это преобразования, которые PDO выполняет во время привязки.

  • PDO :: PARAM_STR преобразует все, что вы ему передаете, в строка, кроме null.
  • PDO :: PARAM_INT конвертирует логические значения в длинные
  • PDO :: PARAM_BOOL преобразует длинные числа в логические

Вот и все. Больше ничего не конвертируется. PDO использует флаги PARAM для форматирования SQL, чтобы не приводить типы данных.

21
ответ дан 27 November 2019 в 23:40
поделиться

Я попробовал то же самое с 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(); 
3
ответ дан 27 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: