Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перенос из одной таблицы в другую
 
 автор: designshadow   (13.08.2009 в 02:06)   письмо автору
 
 

Создал скрипт для крона чтобы переносить записи в архив(по конечной дате) и комментарии к ним, но сталкиваюсь с такой проблемой.
Не все записи переносятся, как-то так получается что он переносит запись и не удаляет её, и видать после этой записи скрипт не выполняется дальше...
Запускаю сам скрипт повторно, одна запись остаётся(Good moving - ERROR!") остальные переносятся.
Если удалить её из архива вручную и третий раз запустить скрипт то она успешна перенесётся.

Где я допустил ошибку?

<?
$d = date("Y-m-d");

$res = mysql_query("SELECT * FROM goods WHERE date_end < '$d'",$db);
if (!$res)
{
echo "<p><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>Не прошло.<br><strong>Код ошибки:</strong><br></p>";
// exit(mysql_error());
}
if (mysql_num_rows($res) > 0)
{
$myrow = mysql_fetch_array($res);
do
{
$res2 = mysql_query("INSERT INTO goods_archive (id, description,date_end) VALUES('$myrow[id]','$myrow[description]','$myrow[date_end]')");
if ($res2 == 'true')
{
echo "Good moving - OK!";
$res_del = mysql_query("DELETE FROM goods WHERE id = '$myrow[id]'");
}
else
{
echo "Good moving - ERROR!";
}


$res_com = mysql_query("SELECT * FROM com WHERE post = '$myrow[id]'",$db); // Выбрать из таблицы с комментарими...
if (!$res_com)
{
echo "<p><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>Не прошло.<br><strong>Код ошибки:</strong><br></p>";
// exit(mysql_error());
}
if (mysql_num_rows($res_com) > 0)
{
$myrow_com = mysql_fetch_array($res_com);
do
{
$res_com2 = mysql_query("INSERT INTO com_archive (id,post,text,date) VALUES('$myrow_com[id]','$myrow_com[post]','$myrow_com[text]','$myrow_com[date]')"); // Вставить в архив с комментариями
if ($res_com2 == 'true')
{
echo "Com moving - OK!";

$res_com_del = mysql_query("DELETE FROM com WHERE post = '$myrow[id]'");

}
else
{
echo "Com moving - ERROR!";
}
}
while ($myrow_com = mysql_fetch_array($res_com));
}
else
{
echo "<p><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>В таблице нет данных.</p>";
// exit ();
}


}
while ($myrow = mysql_fetch_array($res));
}
else
{
echo "<p><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>В таблице нет данных.</p>";
// exit ();
}

?>

  Ответить  
 
 автор: а-я   (13.08.2009 в 02:09)   письмо автору
 
   для: designshadow   (13.08.2009 в 02:06)
 


6.4.3.1. Синтаксис оператора INSERT ... SELECT
INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name [(column list)] SELECT ...

Команда INSERT ... SELECT обеспечивает возможность быстрого внесения 
большого количества строк в таблицу из одной или более таблиц. 

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID 
        FROM tblTemp1
        WHERE tblTemp1.fldOrder_ID > 100;

Для команды INSERT ... SELECT необходимо соблюдение следующих условий: 

Целевая таблица команды INSERT не должна появляться в утверждении FROM части SELECT данного запроса, 
поскольку в ANSI SQL запрещено производить выборку из той же таблицы, в которую производится вставка. 
(Проблема заключается в том, что операция SELECT, возможно, найдет записи, 
которые были внесены ранее в течение того же самого прогона команды. При использовании команд, 
внутри которых содержатся многоступенчатые выборки, можно легко попасть в очень запутанную ситуацию!) 

Столбцы AUTO_INCREMENT работают, как обычно. 

Для получения информации о данном запросе можно использовать функцию C API mysql_info(). See Раздел 6.4.3, 
«Синтаксис оператора INSERT». 

Чтобы гарантировать возможность использования журнала обновлений/двоичного журнала для восстановления 
исходного состояния таблиц, в MySQL во время выполнения команды INSERT ... SELECT параллельные вставки не разрешаются. 

Разумеется, для перезаписи старых строк можно вместо INSERT использовать REPLACE. 

  Ответить  
 
 автор: Trianon   (13.08.2009 в 10:46)   письмо автору
 
   для: designshadow   (13.08.2009 в 02:06)
 

if (mysql_num_rows($res) > 0)
{
$myrow = mysql_fetch_array($res);
do
{
$res2 = mysql_query("INSERT INTO goods_archive (id, description,date_end) VALUES('$myrow[id]','$myrow[description]','$myrow[date_end]')");
if ($res2 == 'true')


тут сплошные ошибки. плюнуть некуда.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования