Примечание. Неопределенная переменная: pdo в C: \ xampp \ htdocs \ testing \ PDO2.php в строке 8 [дубликат]

Если вы хотите преобразовать свою серию в целые идентификаторы, вы можете использовать pd.factorize .

Обратите внимание, что это решение, в отличие от pd.Categorical, не будет сортироваться в алфавитном порядке. Таким образом, первая страна будет назначена 0. Если вы хотите начать с 1, вы можете добавить константу:

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

Если вы хотите сортировать в алфавитном порядке, укажите sort=True:

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 

48
задан 9 revs, 4 users 81% 8 December 2017 в 09:48
поделиться

2 ответа

Команда, подготовленная PDO, вызывает ошибку в предложении LIMIT

. Для целей совместимости PDO будет только emulate подготовленным операциям, заменив заполнители фактическими данными вместо их отправки на сервер отдельно, если не указано иное. И с «ленивой» привязкой (используя массив в execute ()), PDO будет обрабатывать каждый параметр как строку. В результате подготовленный LIMIT ?,? запрос становится LIMIT '10', '10', который является недопустимым синтаксисом, который вызывает запрос.

Эта проблема может быть решена либо

  • , путем включения эмуляции mode (так как MySQL может сортировать все заполнители должным образом):
    $conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    
  • путем привязки и установки правильного типа (PDO :: PARAM_INT) явно:
    $stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
    $stm->bindValue(1, $limit_from,PDO::PARAM_INT);
    $stm->bindValue(2, $per_page,PDO::PARAM_INT);
    $stm->execute();
    $data = $stm->fetchAll();
    
19
ответ дан 2 revs, 2 users 94% 16 August 2018 в 03:47
поделиться
  • 1
    «MySQL может правильно сортировать все заполнители»; круто! ;) – Alix Axel 12 May 2013 в 03:57
  • 2
    Спасибо, но это только и только при использовании Limit в PDO? – rokimoki 16 May 2013 в 13:18

Как я могу использовать подготовленные операторы с помощью оператора LIKE?

Подготовленный оператор может представлять только полный литерал данных. Не является частью литерального, не сложного выражения или идентификатора. Но только строка или номер. Итак, очень распространенная ошибка - это такой запрос:

$sql = "SELECT * FROM t WHERE column LIKE '%?%'";

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

Итак, нужно отправить полный строковый литерал с помощью подготовленного оператора. Существует два возможных способа:

  • сначала сначала подготовить FULL выражение:
    $name = "%$name%";
    $stm  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
    $stm->execute(array($name));
    $data = $stm->fetchAll();
    
  • или использовать конкатенацию внутри запроса
    $sql = "SELECT * FROM t WHERE column LIKE concat('%',?,'%')";
    

, хотя последнее кажется слишком раздутым.

24
ответ дан Your Common Sense 16 August 2018 в 03:47
поделиться
  • 1
    Само собой разумеется, но в большинстве случаев вам нужно избежать %, _ и любых других поддерживаемых движком подстановочных знаков в $name перед тем, как поместить его в запрос. – DCoder 13 April 2013 в 19:42
  • 2
    @DCoder: +1, только для полноты и поскольку это заданный вопрос: addcslashes($name, '%_\\');. – Alix Axel 3 June 2013 в 14:24
Другие вопросы по тегам:

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