Предопределенная переменная повреждена во время обработки исключений при переполнении стека

Переменная $ maxTry не назначается при возникновении исключения и

обработка исключений останавливается при nTry = 1.

Как это возможно?

$nTry=0;
$maxTry=100;
function verify() {
try{
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
}
catch(PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if($e->getCode()==='HY000') {
echo 'verify again<br/>';
if($nTry < $maxTry) {
$maxTry=100;
verify();      //recursion
}
else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
verify();

Ожидаемый результат (если достигнуто maxTry):

PDOException
verify again
...
verify again
Reached max try (100 __ 100) PDOException: HY000

Фактический вывод ($ maxTry не установлен):

PDOException
verify again
Reached max try (1 __ ) PDOException: HY000

0

Решение

Поскольку вы используете переменные в функции, но объявляете их снаружи, они недоступны. Вы должны добавить это сразу после открытия функции.

function verify() {
global $maxTry, $nTry; // add this
0

Другие решения

Переменные находятся вне области видимости, вместо этого они передаются как параметры:

function verify($nTry, $maxTry)
{
try {
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
} catch (PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if ($e->getCode() === 'HY000') {
echo 'verify again<br/>';
if ($nTry < $maxTry) {
verify($nTry, $maxTry);      //recursion
} else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
}
varify(0, 100);
0

По вопросам рекламы [email protected]