Веб-программинг

Интересное и полезное про PHP, JS, Jquery, Angular, Bootstrap, MySQL, PostgreSQL, Docker, Git, Trello, Nginx и Apache, API Яндекса, Google, PayPal, Fb, Vk, GeoNames, Robokassa...

Ctrl + ↑ Позднее

Найти все дублированные строки в PostgreSQL

Допустим задача: найти дубли не просто по одному полю, а сразу по нескольким полям. Например, в таблице есть поля user_id и link

id name user_id link
1 Первая запись 226 яндекс.ру
2 Вторая запись 67 гугл.ру
3 Третья запись 315 рамблер.ру
... ... ... ...
3116 Последняя запись 226 яндекс.ру

и необходимо найти все дубли, чтобы совпадали поля user_id и link. В нашем случае, это строки под id=1 и id=3116.
Можно применить следующий sql:

SELECT user_id, link, string_agg(CAST(id AS TEXT), ', ') AS ids, count(user_id) AS count
FROM our_table
GROUP BY user_id, link
HAVING count(user_id) > 1
ORDER BY user_id DESC;

Строка string_agg(CAST(id AS TEXT), ', ') AS ids необходима для того, чтобы конкатенировать id дублированных строк

Как сортировать в PostgreSQL согласно списку конструкции WHERE

Если необходимо осуществить поиск по нескольким ID, например (4, 6, 3, 12). Видно, что список имеет неупорядоченную сортировку, и вывод результата в PostgreSQL необходимо построить согласно этому списку.
Что-то вроде того:

SELECT *
FROM "table"
WHERE id IN (4, 6, 3, 12)
ORDER BY (4, 6, 3, 12)

Т. е. чтобы конечный результат сохранил сортировку id

В данном случае нам поможет следующая конструкция:

SELECT *
FROM "table"
JOIN unnest('{4, 6, 3, 12}'::int[]) WITH ORDINALITY t(id, sort) USING (id)
ORDER  BY t.sort;

Как исключить несколько слов в регулярном выражении

Например, вам необходимо составить выражение, которое разрешит любые нечисловые символы.
Это несложно:

/\D/

или

/[^0-9]/

А если необходимо исключить из поиска определенные слова? Тогда лучше применить Negative Lookaround — позиционную проверку. Подробнее можно узнать здесь.

Если наши слова red и black, то регулярное выражение может выглядеть так:

/^(?!.*(?:red|black))[\D]+$/

Пример можно посмотреть здесь

2018   Lookaround   regexp

Быстрый update всех строк для поля JSONB

Если в поле с типом JSONB необходимо поменять только значения определенного ключа, то быстрая команда:

update "tableName" set columnName = jsonb_set("columnName",'{"ip"}','"192.168.0.1"');
2018   jsonb   jsonb_set   PostgreSQL
2018   git   git pull

Разрешить вводить в input только цифры

Например, если поле для ввода номера телефона, без спец.символов, при этом если не нужно создавать поле с type=number.

Вот вполне рабочий вариант:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" >

при этом все неразрешенные символы будут просто игнорироваться

2018   input   oninput   regexp   [^0-9.]

Импорт csv-файла и обработка в php

$csvFile = file('/home/oleg/data.csv');
$array = array_map(function($input) {return str_getcsv($input, ";");}, $csvFile );

foreach ($array as $item) {
    $object = new CustomClass();
    $object->name = (string) $item[0];
    $object->title = (string) $item[1];
    $object->price = (float) $item[2];
    $object->save();
}

Что из себя представляет функция str_getcsv — посмотрите в документации

2018   csv   php   str_getcsv

Permission denied (publickey) при ssh-подключении

Если вы пытаетесь подключиться к серверу и такой командой:

ssh root@ip-address

и такой командой:

ssh root@ip-address -o 'IdentitiesOnly=yes'

а в ответ получаете ошибку:

Permission denied (publickey).

То попробуйте прописать ключ напрямую следующей командой:

ssh -v -i ~/.ssh/id_rsa root@ip-address
Ctrl + ↓ Ранее