[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: База Данных и сериализованный массив
Wahtel
Здравствуйте форумчане, мне одна компания скинула тестовое задание, я ни в коем случае не прошу вас решить его за меня, просто я впервые сталкиваюсь с таким заданием, и не могу понять саму задачу поставленную передо мной.
Прошу вас не писать что то типа, "вот это ты дно, о какой работе может идти вообще речь"
и так далее.
Вот задание:

В БД хранятся данные (уникальный идентификатор, значение, версия).

Таблица имеет следующий вид:
CREATE TABLE `data` (
`ident` varchar(32) NOT NULL,
`value` varchar(255) NOT NULL,
`version` int(10) unsigned NOT NULL,
UNIQUE KEY `ident` (`ident`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251

На вход скрипта в GET приходит запрос в следующем формате:
ident[0]=<IDENT_0>&value[0]=<VALUE_0>&version[0]=<VERSION_0>&....&ident[N]=<IDENT_N>&value[N]=<VALUE_N>&version[N]=<VERSION_N& gt;

Считается, что в БД всегда хранятся актуальные данные.
Скрипт должен обработать данные поступившие на вход и на выходе
вернуть сериализованный массив с 3мя ключами:

1. delete - список идентификаторов, которые пришли в запросе и отсутствуют в БД
2. update - список значений и версий по идентификаторам, где версия в
БД стала больше чем версия пришедшая в запросе
3. new - список значений и версий по идентификаторам, которые
отсутствуют в пришедшем запросе, но есть в БД

Пример структуры массива который может получиться на выходе скрипта:
array (
'delete' =>
array (
0 => 'ident1',
1 => 'iden3',
),
'update' =>
array (
'ident2' =>
array (
'value' => 'some value 1',
'version' => 56,
),
),
'new' =>
array (
'ident4' =>
array (
'value' => 'some value 44',
'version' => 1,
),
'ident5' =>
array (
'value' => 'some value 567',
'version' => 2,

Я верю что это не очень тяжело, но я не понимаю как мне вообще сформулитровать вам свой вопрос, если бы кто то смог бы мне объяснить поэтапно, что тут нужно сделать, то я уверен, что смог бы это сделать, и я был бы безгранично благодарен этому человеку)
walerus
<?php

$db = mysql_connect("localhost", "root", "");
mysql_select_db( "test", $db );
mysql_query('SET NAMES utf8');

/*
1. delete - список идентификаторов, которые пришли в запросе и отсутствуют в БД

2. update - список значений и версий по идентификаторам, где версия в БД стала больше чем версия пришедшая в запросе
НЕ понятно что возвращать, данные с базы или данные с GET переменной ???.


3. new - список значений и версий по идентификаторам, которые отсутствуют в пришедшем запросе, но есть в БД
*/


$sql_request = 'SELECT * FROM `data`';
$result = mysql_query( trim( $sql_request ) );

$update = array();
$delete = array();
$new = array();

while( $row = mysql_fetch_assoc( $result ) ) {

/*
Array
(
[ident] => 1
[value] => 1
[version] => 1
)
*/


if ( in_array( $row['ident'], $_GET['ident'] ) )
{
$tmp_position = array_search( $row['ident'], $_GET['ident'] );

// Если есть такой идентификатор, проверяем версию "больше"
if ( $row['version'] > $_GET['version'][ $tmp_position ] )
{
$update[ $row['ident'] ] = array(
'value' => $row['value'],
'version' => $row['version'],
);

}

unset( $_GET['ident'][$tmp_position] );
unset( $_GET['value'][$tmp_position] );
unset( $_GET['version'][$tmp_position] );
}
else
{
$new[ $row['ident'] ] = array(
'value' => $row['value'],
'version' => $row['version'],
);


}
}


$delete = array();
if ( !empty( $_GET ) )
{
foreach( $_GET['ident'] as $key => $line )
{
$delete[] = $_GET['ident'][$key];
}
}


$all_result = array(
'delete' => $delete,
'update' => $update,
'new' => $new,

);


print_r( $all_result );
Как то так, набросал на коленке. Если что то не понятно, спрашивай...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.