Я потратил много часов на отладку и поиск в интернете решений этой необычной проблемы.Вот сделка:
Я работаю над системой подачи и отслеживания заказов на работу.Здесь задействованы две базы данных:
- База данных, в которой публикуются данные отправлений, расположенная на той же физической машине, но на отдельной виртуальной машине в качестве веб-сервера, обслуживающего php.Они находятся в одной подсети класса C.
- База данных нашей системы отслеживания.Находится на другом физическом сервере и на другом IP-адресе, а также на виртуальной машине.
Наша система рабочих заданий допускает несколько «запрошенных услуг», хранящихся в массиве.В нашей базе данных sumbissions она хранится в виде строки, разделенной запятыми, то есть «40,60,70», но в нашей базе данных системы слежения каждая «запрошенная услуга» нуждается в отдельной записи, чтобы позволить различным аспектам проекта бытьотслеживается и выполняется в разное время разными сотрудниками.
ПРОБЛЕМА ЕСТЬ: Когда я помещаю свой второй оператор вставки, тот, который предназначен для базы данных отслеживания, в цикл for, он полностью зависает и занимает, возможно, 5до 15 минут, прежде чем он передаст эту точку в коде и отправит подтверждение по электронной почте.Данные также не вставляются.
Когда я вынимаю их из цикла for и просто делаю одну вставку в базу данных представлений и одну вставку в систему отслеживания, она работает нормально.
Во-первых, я опубликую код, который работает, но отправляет только одну «услугу» в систему отслеживания:
public function insertOrder()
{
$services = implode( ',', $this->model->chk );
$curdate = $this->model->getMySQLDate( $this->model->curdate );
$dueDate = $this->model->getMySQLDate( $this->model->dueDate );
$sql = "INSERT INTO orders VALUES(DEFAULT,
{$this->sanitize($services)},
{$this->sanitize($curdate)},
{$this->sanitize($this->model->submittedBy)},
{$this->sanitize($this->model->shortDesc)},
{$this->sanitize($this->model->projDetails)},
{$this->sanitize($dueDate)},
{$this->sanitize($this->model->dueDateNotes)},
{$this->sanitize( $this->model->approveBy)},
{$this->sanitize( $this->model->cost )} )";
$this->execute( $sql );
$this->convertServicesToTracks();
$notes = $this->model->getTracksNotes();
$dueDate = $dueDate.' 12:00:00';
$shortDescNoQuotes = str_replace("\"","'",$this->model->shortDesc);
$sqlTracks = "INSERT INTO todos VALUES(DEFAULT,
{$this->sanitizeTracks($this->model->chk[0])},
NULL,
{$this->sanitizeTracks($shortDescNoQuotes)},
{$this->sanitizeTracks($notes)},
now(),
{$this->sanitizeTracks($dueDate)},
NULL,
12,
NULL,
'active',
NULL,
now() );";
//echo $sqlTracks;
$this->executeTracks( $sqlTacks );
} private function executeTracks( $sql )
{
$db = $this->getTracksDB( );
$this->check4Error( $db, $sql );
return $result;
}
private function getTracksDB()
{
if (!$this->tracksdb) $this->tracksdb = new mysqli(AbstractSQL::TRACKS_HOST, AbstractSQL::USER, AbstractSQL::PASS, AbstractSQL::TRACKS_SCHEMA);
return $this->tracksdb;
}
private function convertServicesToTracks()
{
//converts submission data to tracking system data
}
private function sanitizeTracks($arg)
{
if (!isset($arg)) return "NULL";
if (is_numeric($arg) && !is_double( $arg) ) return $arg;
return "'{$this->getTracksDB()->escape_string($arg)}'";
}
Когда я добавляю этот простой цикл for во второй оператор INSERT, онзависает, даже если массив содержит только один элемент!
for($i = 0; $i < count($this->model->chk); ++$i)
{
$sqlTracks = "INSERT INTO todos VALUES(DEFAULT,
{$this->sanitizeTracks($this->model->chk[$i])},
NULL,
{$this->sanitizeTracks($shortDescNoQuotes)},
{$this->sanitizeTracks($notes)},
now(),
{$this->sanitizeTracks($dueDate)},
NULL,
12,
NULL,
'active',
NULL,
now() );";
//echo $sqlTracks;
$this->executeTracks( $sqlTacks );
}
Любая помощь будет принята с благодарностью.И я прошу прощения за длинные фрагменты кода!