Как вставить значение в поле password, которое включает два символа доллара и одну одинарную кавычку?

Как можно перенести значения из Redis в PostgreSQL, используя расширение phpredis, чтобы сохранить оригинальный формат пароля без добавления слэшей при выполнении INSERT? Я применяю функцию preg_quote() для экранирования специальных символов, что приводит к тому, что пароль отображается как 'lsa\$\$331'bc' в базе данных, вместо ожидаемого 'lsa$$331'bc'. В запросе я использую двойной доллар для экранирования кавычек. Вот код моего запроса: <br/> <pre><code>$query = "INSERT INTO client_ssh(client_name, ssh_login, ssh_password)
                          VALUES ('".$client_name."',  '".$ssh_login."', $$'".$ssh_password."'$$)";</code></pre> <br/> Как я могу избежать добавления слэшей в пароль в таблице?
  • 16 февраля 2025 г. 11:14
Ответы на вопрос 2
Для того чтобы вставить значение в поле `password`, которое включает два символа доллара и одну одинарную кавычку, вам нужно правильно обработать строку и экранировать специальные символы. Одной из причин, почему вы получаете дополнительные слэши, является использование функции `preg_quote()`, которая экранирует все специальные символы, включая символы, которые вам не нужно экранировать в контексте SQL-запроса.

В вашей ситуации можно использовать двойные доллары (`$$`) для задания литералов в PostgreSQL, что позволяет вам избежать необходимости экранировать одинарные кавычки внутри строки. Вот как вы можете адаптировать ваш код:

```php
$query = "INSERT INTO client_ssh(client_name, ssh_login, ssh_password)
          VALUES ('$client_name', '$ssh_login', '$ssh_password')";
```

Если вы хотите использовать dollar-строки для вставки, то можете сделать так:

```php
$query = "INSERT INTO client_ssh(client_name, ssh_login, ssh_password)
          VALUES ('$client_name', '$ssh_login', $$" . $ssh_password . "$$)";
```

Либо вы можете оставить одинарные кавычки, но избегать экранирования:

```php
$query = "INSERT INTO client_ssh(client_name, ssh_login, ssh_password)
          VALUES ('$client_name', '$ssh_login', '" . str_replace("'", "''", $ssh_password) . "')";
```

Таким образом, строка `'$ssh_password'` будет вставлена в БД корректно, а одинарные кавычки будут экранированы путем удвоения их. 

При работе с SQL-запросами всегда полезно использовать подготовленные выражения и параметризованные запросы, чтобы избежать SQL-инъекций и проблем с экранированием. Пример использования подготовленных выражений с `PDO` может выглядеть так:

```php
$stmt = $pdo->prepare("INSERT INTO client_ssh (client_name, ssh_login, ssh_password) VALUES (?, ?, ?)");
$stmt->execute([$client_name, $ssh_login, $ssh_password]);
```

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