PHP MYSQL Вставить оператор в цикл FOR - PullRequest
0 голосов
/ 15 декабря 2011

Я потратил много часов на отладку и поиск в интернете решений этой необычной проблемы.Вот сделка:

Я работаю над системой подачи и отслеживания заказов на работу.Здесь задействованы две базы данных:

  1. База данных, в которой публикуются данные отправлений, расположенная на той же физической машине, но на отдельной виртуальной машине в качестве веб-сервера, обслуживающего php.Они находятся в одной подсети класса C.
  2. База данных нашей системы отслеживания.Находится на другом физическом сервере и на другом 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 );
    }

Любая помощь будет принята с благодарностью.И я прошу прощения за длинные фрагменты кода!

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Ну, это может и не быть проблемой, но разве вы не должны использовать цикл foreach, чтобы избежать попадания в части массива, которые могут не существовать?Подробнее об этом здесь .Если вы перебираете пустой индекс, это нарушит ваш оператор SQL.Как это:

foreach($this->model->chk as $val)
0 голосов
/ 15 декабря 2011

Итерация цикла for?Я вижу, у вас есть эхо, это что-нибудь записало?Сколько предметов нужно пройти через?5 минут кажутся долгим временем, но если есть много вещей, из-за которых может потребоваться столько времени.Видите ли вы какие-либо ошибки в своих журналах?

Что-то, что вы можете попробовать, это удерживать счетчик в переменной, чтобы не приходилось вычислять его каждый раз.Это может ускорить ваш цикл for, но я не уверен, что он вставит данные.

for($i = 0, $count = count($this->model->chk); $i < $count; ++$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 );
    }

Я нашел это в PHP для ссылки на цикл: http://php.net/manual/en/control-structures.for.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...