|
|
|
| Создал скрипт для крона чтобы переносить записи в архив(по конечной дате) и комментарии к ним, но сталкиваюсь с такой проблемой.
Не все записи переносятся, как-то так получается что он переносит запись и не удаляет её, и видать после этой записи скрипт не выполняется дальше...
Запускаю сам скрипт повторно, одна запись остаётся(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 ();
}
?> | |
|
|
|
|
|
|
|
для: 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.
|
| |
|
|
|
|
|
|
|
для: 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')
тут сплошные ошибки. плюнуть некуда. | |
|
|
|