Archive for category MySQL

Числа, дати, поля… – сьогодні трохи про MySQL

Бази даних: MySQL, PostgreSQL, Oracle…
- з резюме пересічного веб-программера…

Специфіка створення веб-сайтів на сьогоднішній день така, що досконально вивчати тонкощі СУБД потреби немає. Вистачає і “вершків”. Вивчив запит на вибірку, вставку, оновлення – і сміливо можна переписувати пункт “Бази даних” у власному резюме. Не те що б я це засуджував – у самого знання по MySQL поки що “базові”. Проблема в іншому: нахапавшись вершків, більшість просто перестає прагнути вчитись далі. Зрештою, в кожного свій шлях, а я хотів би навести кілька простих та корисних речей по роботі зв’язки PHP+MySQL

Робота з датою

РНР зберігає дату в форматі unix timestamp, натомість MySQL використовує формат DATETIME, тобто представлення дати у вигляді YYYY-MM-DD HH:MM:SS (2006-12-25 13:43:15)
Щоб коректно працювати з датою і часом потрібно використовувати наступні перетворення:

$mysqldate = date( ‘Y-m-d H:i:s’, $phpdate ); //Форматує системну дату/час використовуючи мітку часу, задану аргументом $phpdate
$phpdate = strtotime( $mysqldate ); //перетворює текстове представлення дати в мітку часу Юнікс

Звичайно, можна зберігати дату в БД одразу в форматі unix timestamp, використовуючи якесь числове поле, але в цьому випадку функції MySQL по роботі з часом і датою будуть недоступні.
Вивести сьoгоднішню дату в MySQL – NOW()
Вивести сьoгоднішню дату в РНР в форматі unix timestamp – strtotime(’now’) або date(’U’)

Скопіювати поле таблиці

Звучить до смішного просто, але коли я не знайшов такої операції в PHPMyAdmin і вирішив зробити це діло “вчручну”, то … виникла певна пауза :)
Отже потрібно:
ALTER TABLE `table_name` ADD `new_field` TEXT NOT NULL AFTER `some_existing field` ; – створюємо нове поле new_field після існуючого поля some_existing field
UPDATE `table_name` SET `new_field` = `some_existing field`; – копіюємо всі значення з одного поля в інше.
Щоб скопіювати всю таблицю:
create table my_table_copy (select * from my_table)
(в цьому випадку не копіюється інформація про ключові поля, необхідно ще дописувати коменду ALTER TABLE `my_table_copy` ADD PRIMARY KEY ( `my_table_copy_id` ); )
Вставити всі дані із старої таблиці в ПОРОЖНЮ нову:
insert into my_table_copy (select * from my_table)
Щоб скопіювати частину даних з однієї таблиці в іншу з умовою (офіційний мануал поспішає на допомогу):
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

Правильне сортування чисел в текстових полях

Щоб відсортувати числа в текстовому полі коректно, а не на зразок 1,10,2 можна використовувати функцію CAST

CAST(data as UNSIGNED) AS new_data
….
ORDER BY new_data

Ще спосіб: просто написати ORDER BY data+0
Якщо ж текстове поле містить не тільки числа, а й букви, то попередньо ці букви треба видалити. Приклад:

SELECT CAST(SUBSTRING_INDEX(filename, '_', -1) as unsigned) as file, filename ,caption, photos_id as id FROM photos
WHERE o_id = '555' order by file;

По суті, у нас тут file використовується як службове поле – тільки для правильного сортування.

Коментарів немає

Отримання інформації про колонки в БД

В тенетах натрапив на цікавий скрипт, що виводить службову інформацію по колонкам таблиці з БД MySQL. Великого прикладного значення скрипт немає – навряд чи хтось захоче писати другий PHPMyAdmin – але для експериментів та навчання згодиться.

mysql_connect('localhost:3306', $user, $password)
mysql_select_db("database");
$result = mysql_query("select * from table")
or die("Query failed: " . mysql_error());
/* отримуємо дані про колонку*/
$i = 0;
while ($i < mysql_num_fields($result)) {
echo "Information for column $i:
\n";
$meta = mysql_fetch_field($result, $i);
if (!$meta) {
echo "No information available
\n";
}
echo "
<pre>blob:         $meta->blob
max_length:   $meta->max_length
multiple_key: $meta->multiple_key
name:         $meta->name
not_null:     $meta->not_null
numeric:      $meta->numeric
primary_key:  $meta->primary_key
table:        $meta->table
type:         $meta->type
unique_key:   $meta->unique_key
unsigned:     $meta->unsigned
zerofill:     $meta->zerofill</pre>
";
$i++;
}
mysql_free_result($result);

Коментарів немає