CodeInside
@CodeInside

Как перепрыгнуть часть кода (goto)?

if(!empty($first_name)) {
if(strlen($first_name)>2) {$ed = true;
$query .= "`first_name` LIKE '%".$first_name."%'";
}
else {
$error = true;
$text = "Размер поля 'Имя' меньше 3-х символов.";
goto end;
}
}

if(!empty($second_name)) {
  if(strlen($second_name)>2){
    if($ed == true) {
      $query .= " AND `second_name` LIKE %".$second_name."%";
    }
      else {
        $ed = true;
        $query .= "`second_name` LIKE %".$second_name."%";
        goto end;
      }
  }
  else {
  $error = true;
  $text = "Размер поля 'Фамилия' меньше 3-х символов.";
  goto end;
  }
}

if(!empty($home_country)) {
  if($home_country<12 && $home_country>1){
    if($ed == true) {
      $query .= " AND `home_country` LIKE %".$home_country."%";
    }
      else {
        $ed = true;
        $query .= "`home_country` LIKE %".$home_country."%";
        goto end;
      }
  }
  else {
  $error = true;
  $text = "Неправильно задано поле 'Родная страна'.";
  goto end;
  }
}
//и так дальше уйма проверок
end:
include '../views/search.html';

Как видите в коде идёт процесс проверки переменной на валидность. Переменных много, поэтому и проверок куча. Вот хочу, чтобы когда переменная оказалась невалидной - сразу происходил переход на страницу вывода ошибки (иб оследующие проверки бессмыслены и только нагружают сервер).
Дело в том, что на сервере стоит php 5.4, но после работы скрипта выбивает ошибку "syntax error, unexpected 'end'".
Кто что посоветует?
  • Вопрос задан
  • 513 просмотров
Решения вопроса 1
SowingSadness
@SowingSadness
web-разработчик
Лучше научиться писать грамотный код, а не портянку которую вы тут воротите.
В вашем случае нужно узнать что такое MVC. Написать хоть какое то подобие валидаторов, которые возвращают или true или текст ошибки.

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

/**
  *@param Request $request
  */
  function my_action($request) 
  {
		$validator = ValidatorLength(3);
		$error = $validator->test($request->get('first_name'));
		if ($error !== true) {
			return new Response($error, 400);
		}

		$sql = 'SELECT * FROM "my_table" WHERE %condition %limit';
		$sql_condition = 'TRUE';
		$sql_limit = '';

		$and_conditions = [];
		if ($request->get('first_name')) {
			$and_conditions[] = sprintf('first_name LIKE \%%s', $request->get('first_name')); 
		}

		if ($request->get('limit')) {
			$sql_limit = sprintf('LIMIT %d', $request->get('limit'));			
		}

	  $sql_condition = implode(" AND ", $and_conditions);

		$sql = str_replace('%condition', $sql_condition, $sql);
		$sql = str_replace('%limit', $sql_limit, $sql);

		// ...

		return new Response("Hello world");
	}

Request, Response, ValidatorLength - это всё вымышленные классы.

То что вы пишите НИ В КОЕМ СЛУЧАЕ даже для теста делать нельзя. Такой код нужно выбрасывать.

Ну и да, лучше вместо замены в запросах, лучше использовать подготовленные запросы:
https://php.net/manual/ru/pdo.prepared-statements.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function showError($text) { ... }
...
showError("Неправильно задано поле 'Родная страна'.");
exit;

Но лучше всего проверять всё до конца и выдавать полный список ошибок, чтобы пользователю не приходилось отправлять форму много раз, каждый раз получая следующую ошибку.
Ответ написан
Комментировать
kiparis_sp
@kiparis_sp
Я думал, что goto только в C использовали. А оно вон как... и до PHP добрались. Дочитайте Ваш учебник до функций, и все встанет на свои места.
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Используйте механизм блоков try-catch. Или еще лучше в данном случае оберните функционал в функцию и используйте return.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы