К сожалению, я думаю, что проблема может быть со структурой вашего кода.
В вашем цикле операторов INSERT все операторы идентичны, и нет необходимости каждый раз вызывать $ db-> prepare. Идея подготовленных операторов заключается в том, что вы вызываете $ db-> prepare () один раз, а execute () может вызываться несколько раз для одного и того же объекта оператора. Вы каждый раз вызываете $ db-> prepare (), что приводит к дополнительным расходам при разборе оператора SQL и создании нового объекта.
Подумайте о переписывании вашей функции DB () следующим образом:
function do_query($db, $pdo_statement, $query, $args)
{
if ($pdo_statement->execute($args) === true)
{
if (stripos($query, 'INSERT') === 0)
{
return $db->lastInsertId();
}
if (stripos($query, 'SELECT') === 0)
{
return $result->fetchAll(PDO::FETCH_ASSOC);
}
return $result->rowCount();
}
}
function DB($query)
{
static $db = null;
if (is_file($query) === true)
{
$db = new PDO('sqlite:' . $query, null, null, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
}
else if (is_a($db, 'PDO') === true)
{
$result = $db->prepare($query);
if (is_a($result, 'PDOStatement') === true)
{
$args = func_get_args();
if (is_array($args[1])) {
$ret = array();
foreach ($args[1] as $args) {
$ret[] = do_query($db, $query, $result, $args);
}
return $ret;
}
return do_query($db, $query, $result, array_slice(func_get_args(), 1));
}
return false;
}
return true;
}
Таким образом, если вы хотите выполнить один и тот же запрос с большим количеством значений, вы создаете двумерный массив значений, которые хотите вставить, и вызываете DB('INSERT INTO....', $values)
. Функция DB () проверяет, является ли второй параметр функции (после $ query) массивом, и если это так, он выполняет цикл $ query для значений в массиве. Таким образом, цикл не предполагает повторной подготовки оператора SQL каждый раз, просто выполняет его заново с другими значениями. Возвращаемое значение функции будет массивом результатов каждого запроса.