середа, 6 травня 2009 р.

Поговорим о MySQL и Autoindex

Часто программисты сталкиваются с такой задачей, как сохранять данные сразу в несколько баз данных MySQL, причем как правило такие базы связаны друг с другом по ID. Как правило идентификатор записи в MySQL определяется автоматически при помощи параметра поля «auto_increment» - это экономит время и ресурсы сервера. Этот параметр имеет свой счетчик в MySQL и по-этому для того что бы корректно записать данные в базу нужно его определить.

Когда я искал пути решения, часто в блогах предлагали использовать 2 метода:

1.

function mysql_autoid($id,$table) {
    $query = 'SELECT MAX('.$id.') AS last_id FROM '.$table;
    $result = mysql_query($query);
    $result = mysql_fetch_array($result);
    return ($result['last_id']+1);
}


2.

обновлять значение самого автодиндекса.

Сразу скажу, оба метода неверные и имеют много минусов. 1 вариант имеет огромный недостаток, нельзя удалять элементы из базы данных, он просто перестает выдавать правильное значение. Второй метод я даже пробывать не стал, так как не видел смысла в нем!

Решением этой проблемы стал любимый сайт MySQL (http://dev.mysql.com/doc/refman/5.1-maria/en/mysql-insert-id.html), где я нашел эту чудесную функцию. Так же описание этой функции есть в мануалах самого php (http://ru2.php.net/manual/ru/function.mysql-insert-id.php).
mysql_insert_id() используется после mysql запроса, вот пример использования:
// – тут мы добавляем 1 запись в каталог, и сразу после запроса получаем $last_id, который будет равен ID записи которую мы только что сохранили.
mysql_query("INSERT INTO `new_cat_subimg` (`id` ,`img`,`price`,`siteid`, `name`) VALUES (NULL , '{$name}', '{$price}', '{$site['id']}', '{$namesub}');");
$last_id=mysql_insert_id();

// и вот тут мы добавляем этот ID в другую запись
mysql_query("INSERT INTO `new_cat_sub` (`id` ,`id_cat`, `text`, `array_id`, `default_img`,`param`,`siteid`,`name`,`sort`,`price`) VALUES (NULL , '{$cat}', '{$_POST['text']}', '{$last_id}', '0', '{$_POST['param']}', '{$_POST['siteid']}', '{$_POST['name']}', '{$sort}', '{$text2}');");
Собственно работает хорошо и отлажено!

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments