PHP strtotime() использует много памяти? "Допустимый объем памяти 134217728 байт исчерпан"
Я создал скрипт php для вставки строк данных в базу данных sql. Сценарий прекрасно работал, используя жестко закодированные строковые переменные для данных ячейки, но как только я передал эти данные на страницу из формы, у меня начались проблемы.
<?php
/******************************************************************************/
/**************************** DATABASE CONNECT ********************************/
/******************************************************************************/
$hostname = 'xxx.xx.x.x';
$database = 'xxxxxxxxxx';
$username = 'xxxxxxxxxx';
$password = 'xxxxxxxxxx';
try {$DBH = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);}
catch(PDOException $e) { echo $e->getMessage();}
/******************************************************************************/
/***************************** MAIN FUNCTIONS *********************************/
/******************************************************************************/
function createCourses($dateArray, $title, $outline, $startTime, $endTime, $cost, $category) {
global $DBH;
$STH = $DBH -> prepare("INSERT INTO courses (title, outline, date, endDate, time, endTime, cost, category) VALUES (:title, :outline, :startDate, :endDate, :startTime, :endTime, :cost, :category)");
$numDates = sizeof($dateArray['start']) - 1;
$i = 0;
while ($i <= $numDates) {
$STH -> bindValue(':startDate', $dateArray['start'][$i], PDO::PARAM_STR);
$STH -> bindValue(':endDate', $dateArray['end'][$i], PDO::PARAM_STR);
$STH -> bindValue(':startTime', $startTime, PDO::PARAM_STR);
$STH -> bindValue(':category', $category, PDO::PARAM_STR);
$STH -> bindValue(':endTime', $endTime, PDO::PARAM_STR);
$STH -> bindValue(':outline', $outline, PDO::PARAM_STR);
$STH -> bindValue(':title', $title, PDO::PARAM_STR);
$STH -> bindValue(':cost', $cost, PDO::PARAM_STR);
$success = $STH->execute();
$i++;
}
if($success){
//true
echo "The courses were added successfully.";
} else {
//false
echo "There was an error.";
}
}
function createDates($startDate, $endDate, $repeatType, $repeatDay, $repeatWeek, $repeatTill) {
$dateArray = array();
switch ($repeatType) {
case 'none':
//Add the initial start and end dates
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
return $dateArray;
break;
case 'weekly':
//Add the initial start and end dates
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
//Find dates between startDate and repeatTill
while($startDate <= $repeatTill) {
$startDate = date('Y-m-d', strtotime($startDate . "+1 week"));
$endDate = date('Y-m-d', strtotime($endDate . "+1 week"));
if($startDate <= $repeatTill) {
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
}
}
return $dateArray;
break;
case 'monthly_date':
//Add the initial start and end dates
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
//Find dates between startDate and repeatTill
while($startDate <= $repeatTill) {
$startDate = date('Y-m-d', strtotime($startDate . "+1 month"));
$endDate = date('Y-m-d', strtotime($endDate . "+1 month"));
if($startDate <= $repeatTill) {
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
}
}
return $dateArray;
break;
case 'monthly_day':
//Add the initial start and end dates
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
// Find dates between startDate and repeatTill
while($startDate <= $repeatTill) {
$currentMonth = date('F', strtotime($startDate));
$nextMonth = date('F', strtotime($currentMonth." +1 Month"));
$startDate = date('Y-m-d', strtotime($repeatWeek." ".$repeatDay." of ".$nextMonth));
$endDate = date('Y-m-d', strtotime($startDate." +1 Day"));
if($startDate <= $repeatTill) {
$dateArray['start'][] = $startDate;
$dateArray['end'][] = $endDate;
}
}
return $dateArray;
break;
default:
# code...
break;
}
}
$title = @$_GET['Title'];
$outline = @$_GET['Outline'];
$startDate = @$_GET['StartDate'];
$endDate = @$_GET['EndDate'];
$startTime = @$_GET['StartTime'];
$endTime = @$_GET['EndTime'];
$cost = @$_GET['Cost'];
$category = @$_GET['Category'];
$repeatType = @$_GET['Repeat'];
$repeatTill = @$_GET['RepeatTill'];
$repeatDay = @$_GET['Day'];
$repeatWeek = @$_GET['Week'];
$startDate = date("Y-m-d", strtotime($startDate) );
$endDate = date("Y-m-d", strtotime($endDate) );
$startTime = date("H:i:s", strtotime($startTime) );
$endTime = date("H:i:s", strtotime($endTime) );
$dateArray = createDates($startDate, $endDate, $repeatType, $repeatDay, $repeatWeek, $repeatTill);
createCourses($dateArray, $title, $outline, $startTime, $endTime, $cost, $category);
?>
Я обнаружил, что удалено, следующий код удаляет ошибку (хотя данные не созданы и вставлены правильно).
$startDate = date("Y-m-d", strtotime($startDate) );
$endDate = date("Y-m-d", strtotime($endDate) );
$startTime = date("H:i:s", strtotime($startTime) );
$endTime = date("H:i:s", strtotime($endTime) );
Использует strtotime()
функция съедая память? Я думаю, что это просто ошибка в моем коде, скорее всего, один из циклов, но я не могу найти его.
ПРИМЕЧАНИЕ: я прочитал, вы можете удалить ошибку, добавив ini_set('memory_limit', '-1');
в php.ini
удалить ошибку, но позволяет сценарию использовать неограниченную память, что, на мой взгляд, не является хорошим решением.