PHP PDO Bind или Execute [duplicate]

In [1]: df
Out[1]:
    Sp  Mt Value  count
0  MM1  S1     a      3
1  MM1  S1     n      2
2  MM1  S3    cb      5
3  MM2  S3    mk      8
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      2
8  MM4  S2   uyi      7

In [2]: df.groupby(['Mt'], sort=False)['count'].max()
Out[2]:
Mt
S1     3
S3     8
S4    10
S2     7
Name: count

Чтобы получить индексы исходного DF, вы можете сделать:

In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']

In [4]: df[idx]
Out[4]:
    Sp  Mt Value  count
0  MM1  S1     a      3
3  MM2  S3    mk      8
4  MM2  S4    bg     10
8  MM4  S2   uyi      7

Обратите внимание, что если у вас есть несколько максимальных значений для каждой группы, все будут возвращены.

Обновить

По градиентной вероятности, что это то, что запросит OP:

In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)

In [6]: df
Out[6]:
    Sp  Mt Value  count  count_max
0  MM1  S1     a      3          3
1  MM1  S1     n      2          3
2  MM1  S3    cb      5          8
3  MM2  S3    mk      8          8
4  MM2  S4    bg     10         10
5  MM2  S4   dgd      1         10
6  MM4  S2    rd      2          7
7  MM4  S2    cb      2          7
8  MM4  S2   uyi      7          7
47
задан Michael Berkowski 12 September 2012 в 17:17
поделиться

3 ответа

Вы могли бы найти bindParam, когда вы просто хотите привязать ссылку на переменную к параметру в запросе, но, возможно, еще нужно сделать некоторые манипуляции на нем и только хотите, чтобы значение переменной вычислялось во время выполнения запроса , Он также позволяет выполнять более сложные вещи, такие как привязка параметра к вызову хранимой процедуры и добавление возвращаемого значения в связанную переменную.

Подробнее см. Документацию bindParam , документация bindValue и выполнить документацию .

Например,

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter

bindValue и передача массива в execute ведут себя так же, как значение параметра фиксировано в этой точке, и SQL выполняется соответствующим образом.

Следуя тому же примеру выше, но используя bindValue

$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_value' for ':col1' parameter

Когда передавая значения непосредственно в execute, все значения рассматриваются как строки (даже если задано целочисленное значение). Поэтому, если вам нужно применять типы данных, вы всегда должны использовать bindValue или bindParam.

Я думаю, вы могли бы видеть, что bind* используется больше, чем execute(array), поскольку многие считают, что это лучшее кодирование практика для явного определения типов данных в объявлениях параметров.

56
ответ дан AnthonyB 22 August 2018 в 17:13
поделиться
  • 1
    Привет Майк. Из интереса вы могли бы рассказать об этом? Меня всегда интересовало, как работают переменные bindParam(), поскольку иногда я получаю & quot; Не могу передать переменную по ссылке & quot; ошибки, и на самом деле не уверены, что это значит, почему я думаю об этом. – Martin Bean 12 September 2012 в 17:29
  • 2
    @MartinBean Я обновил свой ответ, чтобы включить пример того, как bindParam будет оценивать значение связанной переменной во время выполнения запроса. – Mike Brant 12 September 2012 в 17:34
  • 3
    @ExplosionPills Я имел в виду явный вид данных. Извините за путаницу, я обновил свой ответ. – Mike Brant 12 September 2012 в 17:38
  • 4
    bindParam передает переменную по ссылке, что означает, что само значение оценивается только тогда, когда оно используется (выполнение запроса). Это позволяет, например, запросить в цикле, просто меняя переменные, не переплетаясь снова и снова. – Madara Uchiha♦ 12 September 2012 в 17:41
  • 5
    Явные типы данных, являющиеся хорошей практикой, являются хорошим ответом .. в теории .. однако я тоже редко вижу это. Я думаю, что я буду придерживаться execute большую часть времени, лично. – Explosion Pills 12 September 2012 в 18:05

Передавая параметры вместе с методом $pdo->execute(), все значения в массиве, которые должны быть переданы, как PDO::PARAM_STR в оператор с функцией $pdo->bindParam().

Основное отличие, которое I теперь можно видеть, что с помощью функции $pdo->bindParam() вы можете определить тип данных, переданный вместе с константами PDO::PARAM_* , как описано в руководстве PHP.net

9
ответ дан Jens Kooij 22 August 2018 в 17:13
поделиться

Простой, значение bindParam может измениться, но значение bindValue не может измениться. Пример:

$someVal=10;
$someVal2=20;
/* In bindParam, the value argument is not bound and 
will be changed if we change its value before execute.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* In bindValue, the value argument is bound and 
never changed if we change its value before execute.
*/
$ref->bindValue(':someCol',$someVal);
// here assignment is referral (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10
4
ответ дан Teerath Kumar 22 August 2018 в 17:13
поделиться
  • 1
    Я думаю, что ОП задавал разницу между execute и bindParam, а не bindParam и bindValue, но я только начал использовать PDO и не знал разницы – tsukimi 9 October 2015 в 01:35
Другие вопросы по тегам:

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