Перейти к следующей строке без цикла

Эта функция обычно вызывается из цикла, но, очевидно, наличие продолжения вызывает проблему, даже если функция фактически не используется. Он отлично работает на моем более щадящем живом сервере, но моя локальная система разработки протестует. Как мне сказать, чтобы перейти к следующей строке, не используя продолжить?

function deleteImage($ImageName, $UpdateID) {
$array = explode('.', $ImageName);
$ext = end($array);

if ($ext == "pdf") :
$fileTemplate = $_SERVER['DOCUMENT_ROOT'].
DIRECTORY_SEPARATOR . "folder1" .
DIRECTORY_SEPARATOR . "folder2" .
DIRECTORY_SEPARATOR . "%s";
else :
$fileTemplate = $_SERVER['DOCUMENT_ROOT'].
DIRECTORY_SEPARATOR . "folder1" .
DIRECTORY_SEPARATOR . "folder3" .
DIRECTORY_SEPARATOR . "%s";
endif;

if (isset($_POST['update'])):
if (!empty($_POST['CheckBox_Delete'][$UpdateID])) :
$sqlDelete = "DELETE FROM images WHERE ID=$UpdateID";
$sqlFolder = "SELECT EntryID FROM images WHERE ID=$UpdateID";

if (is_null($ImageName) || is_null($UpdateID)) continue;
if (empty($ImageName) || empty($UpdateID)) continue;

$fileName = sprintf($fileTemplate, $ImageName);
DBConnect($sqlDelete, "Delete", "db_name");
// Make sure the file is not in use elsewhere before deleting it from the server
$sqlOtherUse = "SELECT COUNT(ID) FROM images WHERE ImageName='$ImageName' AND ID <> $UpdateID";
$OtherUse = DBLookup($sqlOtherUse, "db_name");
if ($OtherUse < 1) :
@unlink($fileName);
AlertMessage("The file has been deleted!");
else:
AlertMessage("Removed from this entry but the file is in use elsewhere so cannot be deleted.");
endif;
endif;
endif;
}

0

Решение

Вы не можете использовать continue в функции, которая вызывается из цикла, она должна быть в самом коде цикла. Что вы можете сделать, это вернуть значение из функции, и вызывающая сторона может проверить это и затем продолжить.

Поэтому измените вызывающую функцию, чтобы сделать это, когда это часть цикла:

if (!deleteImage($imagename, $updateid) {
continue;
}

Изменить все continue; заявления в функции для return false;, и положи return true; в конце функции.

function deleteImage($ImageName, $UpdateID) {
$array = explode('.', $ImageName);
$ext = end($array);

if ($ext == "pdf") :
$fileTemplate = $_SERVER['DOCUMENT_ROOT'].
DIRECTORY_SEPARATOR . "folder1" .
DIRECTORY_SEPARATOR . "folder2" .
DIRECTORY_SEPARATOR . "%s";
else :
$fileTemplate = $_SERVER['DOCUMENT_ROOT'].
DIRECTORY_SEPARATOR . "folder1" .
DIRECTORY_SEPARATOR . "folder3" .
DIRECTORY_SEPARATOR . "%s";
endif;

if (isset($_POST['update'])):
if (!empty($_POST['CheckBox_Delete'][$UpdateID])) :
$sqlDelete = "DELETE FROM images WHERE ID=$UpdateID";
$sqlFolder = "SELECT EntryID FROM images WHERE ID=$UpdateID";

if (is_null($ImageName) || is_null($UpdateID)) return false;
if (empty($ImageName) || empty($UpdateID)) return false;

$fileName = sprintf($fileTemplate, $ImageName);
DBConnect($sqlDelete, "Delete", "db_name");
// Make sure the file is not in use elsewhere before deleting it from the server
$sqlOtherUse = "SELECT COUNT(ID) FROM images WHERE ImageName='$ImageName' AND ID <> $UpdateID";
$OtherUse = DBLookup($sqlOtherUse, "db_name");
if ($OtherUse < 1) :
@unlink($fileName);
AlertMessage("The file has been deleted!");
else:
AlertMessage("Removed from this entry but the file is in use elsewhere so cannot be deleted.");
endif;
endif;
endif;
return true;
}

Кстати, нет необходимости тестировать оба is_null() а также empty(), поскольку нулевое значение пусто.

2

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

Можете ли вы просто отменить некоторые тесты для двух continue линии и превратить его в блок кода?

if (!is_null($ImageName) &&
!is_null($UpdateID) &&
!empty($ImageName) &&
!empty($UpdateID)) {

// code continues here.

}
1