Правильно ли составлена функция php, mysql?

Добрый день!

Только изучаю программирование, поэтому, лучше уж спрошу, чем буду думать, что все работает, значит, все правильно.

Функция выводит данные из таблицы, при этом можно указать кол-во данных для вывода.

Соответственно в скрипте просто пишу show_banner(5);

Сам код:
function show_banner($kolvo) {
global $link;
if (!$q = mysqli_query($link, "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT $kolvo")) echo 'Ошибка загрузки баннеров';
else 
if (mysqli_num_rows($q) > 0) {
while ($row = mysqli_fetch_assoc($q)) 
echo "
<div class='last_banner'>
<div class='banner_item'>
<img src='".$row['banner_img']."' alt='".$row['banner_title']."'>
<a href='/click/banner_id".$row['banner_id']."' target='_blank'>".$row['banner_title']."</a>
".$row['banner_text']."
</div>
</div>
";
}
 mysqli_free_result($q); 
}


Спасибо.
  • Вопрос задан
  • 2550 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Не совсем понял что вы хотите выяснить, просто запустите код. Так что просто пару советов:

1) global $link; - старайтесь не использовать глобальные состояния. Коль уж пишите процедурный код - пусть он будет по настоящему процедурным:
function show_banner($kolvo, $link) {

2) старайтесь не делать вывод в функции которая у вас берет данные из базы - пусть она возвращает только данные (либо ничего в случае ошибки) а за вывод пусть отвечает другая функция.
$banners = get_banners($count, $link);
show_banners($banners);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
R0s0maxa
@R0s0maxa
junior web-developer
Сразу приучайте себя правильно именовать переменные.
kolvo - показатель плохого тона и "поповщины", используйте number, num , amount, amt, quantity, qt, qty
Ответ написан
Используйте PDO.

Вот Вам на заметку. Думаю разберётесь сами что с этим делать.
//-------------------------- Класс работы с базой ----------------------------//
class DBPDO {
   // Используем статическую переменную для сохранения значений внутри класса
	static private $database = NULL;
	
	// Конструктор выполняет соединение с БД возращает объект БД или false
	private function __construct(){
		try {
   		// Сразу задаём кодировку соединения
			self::$database = new PDO('mysql:host=localhost; dbname=basename', 'user', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
   		// Устанавливаем уровень показа ошибок базы
   		self::$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} catch (PDOException $e){
			$error = $e->getMessage();
     		writelog('sql_error', date("y.m.d H:m:s")."\t".$error);
   		return false;
		}
	}
	
	// Статическая функция синглтон для получения объекта ДБ
	static public function dbconnect() {
		if (self::$database == NULL) { new DBPDO(); }
		return self::$database;
	}
	
	// Функция выполнения запроса 
   static public function sql_query($query) {
   	try {
         $return = self::dbconnect()->query($query)->fetchAll(PDO::FETCH_ASSOC);
         if ($return === false) return false;
         if ((!isset($return[1]))&&(isset($return[0]))) $return = $return[0];
      } 
      catch (PDOException $e) { 
         $error = $e->getMessage();
     		writelog('sql_error', date("y.m.d H:m:s")."\t".$error);
   		return false;
      }

   	return $return;
   }	

   // Запрос без выборки
	static public function exec($query) {
      try { 
         return self::dbconnect()->exec($query);
      } 
      catch (PDOException $e) { 
         $error = $e->getMessage();
     		writelog('sql_error', date("y.m.d H:m:s")."\t".$error);
   		return false;
      }
	}
	
   // Экранирование спецсимволов
	static public function quote($str) {
      return self::dbconnect()->quote($str);
	}

	// Получение id последней изменённой строки
	static public function lastInsertId() {
      return self::dbconnect()->lastInsertId();
	}
}
//----------------------------------------------------------------------------//
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Функция составлена отвратительно.
Две самых главных проблемы - вывод и работа с БД.

1) Нужно всегда разделять логику приложения и логику отображения.
Во-первых, как правильно написал Fesor, никакого вывода в функциях быть не должно.
Во-вторых, и в остальном коде работа с БД и вывод должны быть всегда разделены. Сначала работает код, который получает данные из базы, и только потом начинается вывод, желательно в отдельном файле-шаблоне.

2) Несмотря на модную буковку i названиях функций, сам подход остался прежним, и представляет собой классический говнокод из прошлого века.
Во-первых, любые данные всегда должны подставляться в запрос только через плейсхолдеры. новичкам это традиционно сложно понять, поэтому рекомендуется просто запомнить
Во-вторых, работать с БД надо не напрямую, а через враппер. Самый примитивный враппер - это PDO. Оно совсем не такое страшное, как написал каментатор выше, и код на самом деле получается короче, чем через mysqli
function get_banners($limit) {
  global $link;

  $sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
  $stm = $link->prepare($sql);
  $stm->execute([$limit]);
  return $stm->fetchAll();
}

или (с осмысленным враппером):
function get_banners($limit) {
  $sql = "SELECT banner_id,banner_title,banner_text,banner_img FROM banner LIMIT ?";
  return DB::prepare($sql)->execute([$limit])->fetchAll();
}


Вот пример нормального вывода:
<?
$banners = get_banners(5);
?>

<?php foreach ($banners as $row): ?>
<div class='last_banner'>
  <div class='banner_item'>
    <img src='<?=$row['banner_img']?>' alt='<?=$row['banner_title']?>'>
    <a href='/click/banner_id<?=$row['banner_id'].?>' target='_blank'><?=$row['banner_title']?>"</a> 
    <?$row['banner_text']?>
  </div>
</div>
<?php endforeach ?>


Впоследствии весь блок с HTML можно будет вынести в отдельный файл

А вот mysqli_free_result() как раз делать здесь бессмысленно - эта функция будет вызвана автоматически.
Ответ написан
Ваш ответ на вопрос

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

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