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 удалить ошибку, но позволяет сценарию использовать неограниченную память, что, на мой взгляд, не является хорошим решением.

0 ответов

Другие вопросы по тегам