Перейти к содержимому


курс по youtube "Создание фреймворка с нуля PHP"


Сообщений в теме: 53

#21 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 12 Октябрь 2019 - 21:04

Вы случайно отдельные уроки не даёте!?)
Я новичок а это очень интересно для меня и практики не хватает)
Я бы с радостью взял бы у вас несколько уроков)

#22 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 13 Октябрь 2019 - 05:50

Когда-то было дело, но давно это было) сейчас времени на это уже не хватает.

#23 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 13 Октябрь 2019 - 08:41

Жаль конечно
Вы очень крутой преподаватель как по мне

#24 Rohviktor

    Администратор

  • Администраторы
  • 857 сообщений
  • ГородМосква
Репутация: 64

Отправлено 13 Октябрь 2019 - 09:19

Просмотр сообщенияGenesis (13 Октябрь 2019 - 08:41) писал:

Жаль конечно
Вы очень крутой преподаватель как по мне

Спасибо за теплые слова!

#25 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 13 Октябрь 2019 - 16:12

Андрей вы уж извините что я достаю вас вопросами но лучше вас никто данный курс не знает
Подскажите пожалуйста
Возвращаюсь к вопросу о продолжении вашего курса и создания в админ панели полноценную синхронизацию с почтой магазина
В моем случае это тестовая почта на gmail
Я нашел 2 библиотеки которые могут это все реализовать, ну по крайней мере я так думаю
Вот первая
https://packagist.or...p-imap/php-imap
Вот вторая
https://packagist.or...es/tedivm/fetch
Вы с ними когда нибудь сталкивались?

#26 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 13 Октябрь 2019 - 17:28

Просмотр сообщенияGenesis (13 Октябрь 2019 - 16:12) писал:

Возвращаюсь к вопросу о продолжении вашего курса и создания в админ панели полноценную синхронизацию с почтой магазина
Я нашел 2 библиотеки которые могут это все реализовать, ну по крайней мере я так думаю
Вы с ними когда нибудь сталкивались?
Нет, я ведь выше об этом писал, что такой задачи мне решать не приходилось :)

Просмотр сообщенияmatroskin8 (11 Октябрь 2019 - 07:28) писал:

Если же нужно именно получать письма с почтового ящика на сайте, то здесь не подскажу. С такой задачей никогда не сталкивался


#27 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 15 Октябрь 2019 - 20:35

И снова вам доброго времени суток Андрей
Понимаю что вам доставляют некоторые неудобства мои вопросы, но я на максимум хочу реализовать ваш курс и полученные от Вас знания
Пытаюсь реализовать следующее
Хочу сделать вывод боксов с возможностью редактирования и добавления нового фото, но что то не получается где то ошибка не могли бы Вы мне помочь разобраться в этом вопросе?
Суть в чем в папке app/controllers/admin был создан соответствующий контроллер с именем BoxController.php
Так же была создана модель в папке app/models/admin с именем Box.php
Ниже привожу скриншоты кода
Вот еще ошибка в js файле
VM739:1 Uncaught SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at my.js:223
Заранее благодарю за помощь

Прикрепленные файлы


Сообщение отредактировал Genesis: 15 Октябрь 2019 - 20:41


#28 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 16 Октябрь 2019 - 16:19

Вы переоцениваете мои возможности :) Я не умею выполнять код с картинки в голове. Для этого есть процесс отладки кода, который позволяет найти и исправить ошибку... к слову, Вы так и не показали ошибку. Возможно, если покажете текст ошибки и выложите кусочек кода (только не скриншотом, на котором сложно что-то разглядеть из-за мелкого шрифта), на который указывает эта ошибка, тогда смогу что-то подсказать... но по хорошему, как я сказал, для поиска ошибок есть процесс дебага, который применяют даже самые продвинутые программисты и без которого даже самые продвинутые программисты не найдут ошибки в больших объемах кода.

#29 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 17 Октябрь 2019 - 09:30

Нет это объективная оценка)
Я сейчас постараюсь максимально подробно описать весь процесс
Значит цель какова добавить в админ панель управление (редактирование и добавление боксами, созданная вами в курсе таблица brand)
Первое что я сделал создал соответствующий контроллер ниже привожу его код
<?php
namespace app\controllers\admin;
use app\models\AppModel;
use app\models\admin\Brand;
use ishop\App;
class BrandController extends AppController{
	public function indexAction(){
		$brands = \R::getAll('SELECT * FROM brand');
		$countBrands = \R::count('brand');
		$this->set(compact('brands', 'countBrands'));
		$this->setMeta('Боксы на главной странице');
	}
	public function addImageAction(){
		if (!empty($_GET['upload'])){
			if ($_POST['name'] == 'box-single'){
				$wmax = App::$app->getProperty('img_width');
				$hmax = App::$app->getProperty('img_height');
			}
			$name = $_POST['name'];
			$box = new Brand();
			$box->uploadImg($hmax, $wmax, $name);
		}
	}
	public function editAction(){
		if (!empty($_POST)){
			$id = $this->getRequestID(false);
			$brand = new Brand();
			$data = $_POST;
			$brand->load($data);
			$brand->attributes['title'] = $brand->attributes['title'];
			$brand->attributes['description'] = $brand->attributes['description'];
			$brand->getImg();
			if (!$brand->validate($data)){
				$brand->getErrors();
				redirect();
			}
			if ($brand->update('brand', $id)){
				$brand->saveGallery($id);
				$alias = AppModel::createAlias('brand', 'alias', $data['title'], $id);
				$brand = \R::load('brand', $id);
				\R::store($brand);
				$_SESSION['success'] = 'Изменения сохранены';
				redirect();
			}
		}
		$id = $this->getRequestID();
		$brand = \R::load('brand', $id);
		$this->setMeta("Редактирование Бокса {$brand->title}");
		$this->set(compact('brand', ));
	}
	public function deleteAction(){
		$box_id = $this->getRequestID();
		$boxes = \R::load('brand', $box_id);
		\R::trash($boxes);
		$_SESSION['success'] = 'Бокс успешно удален';
		redirect(ADMIN . '/box');
	}
}

После этого я создал соответствующие виды index и edit
вот код индексного файла
<section class="content-header">
	<h1>Боксы Главной Страницы </h1>
	<h3>Колличество: <span class="btn btn-xs btn-info"><?=$countBoxes ?></span></h3>
	<ol class="breadcrumb">
		<li><a href="<?=ADMIN?>"><i class="fa fa-dashboard"></i> Главная</a></li>
		<li class="active">Список Боксов </li>
	</ol>
</section>
<section class="content">
	<div class="container">
		<div class="row">
			<div class="col-md-12">
				<div class="box">
					<div class="box-body">
						<div class="table-responsive">
							<table class="table table-bordered table-hover" id="order-table" data-sortable>
								<thead>
								<tr>
									<th>№ П/п</th>
									<th>Название</th>
									<th style="width: 50%;">Описание</th>
									<th>Изображение</th>
									<th>Действия</th>
								</tr>
								</thead>
								<tbody>
								<?php foreach($brands as $brand): ?>
									<tr>
										<td></td>
										<td><?=$brand['title'] ?></td>
										<td><?=$brand['description'] ?></td>
										<td><img style="height: 60px;" src="/images/<?=$brand['img'] ?>" alt=""></td>
										<td>
											<div class="btn-group" style="display:flex; justify-content: space-around;">
												<a class="btn btn-xs btn-primary" href="<?=ADMIN?>/brand/edit?id=<?=$brand['id']?>"><i class="fa fa-plus"></i></a>
												<a class="btn btn-danger btn-xs delete" href="<?=ADMIN?>/brand/delete?id=<?=$brand['id']?>"><i class="fa fa-trash"></i></a>
											</div>
										</td>
									</tr>
								<?php endforeach; ?>
								</tbody>
							</table>
						</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</section>


вот код файла edit

<section class="content-header">
	<h1>Редактирование Бокса</h1>
	<ol class="breadcrumb">
		<li><a href="<?=ADMIN?>"><i class="fa fa-dashboard"></i> Главная</a></li>
		<li><a href="<?=ADMIN?>/box"><i class="fa fa-dashboard"></i> Список Боксов</a></li>
		<li class="active">Редактор</li>
	</ol>
</section>
<section class="content">
	<div class="row">
		<div class="col-md-12">
			<div class="box">
				<form action="<?=ADMIN?>/brand/edit" method="post" data-toggle="validator">
					<div class="box-body">
						<div class="form-group has-feedback">
							<label for="title"></label>
							<input type="text" name="title" id="title" class="form-control" value="<?=$brand->title?>" required>
							<span style="right: 0; top: 19px;" class="glyphicon form-control-feedback" aria-hidden="true"></span>
						</div>
						<div class="form-group has-feedback">
							<label for="description"></label>
							<input type="text" class="form-control" name="description" id="description" value="<?=$brand->description?>" required>
							<span style="right: 0; top: 19px;" class="glyphicon form-control-feedback" aria-hidden="true"></span>
						</div>
						<div class="form-group">
							<div class="col-md-4">
								<div class="box box-primary box-solid file-upload">
									<div class="box-header text-center">
										<h3 class="box-title">Главное изображение товара</h3>
									</div>
									<div class="box-body text-center">
										<div id="box-single" class="btn btn-primary" data-url="brand/add-image" data-name="box-single">Выбрать файл</div>
										<p><small>Рекомендуемые размеры: 250х350</small></p>
										<div class="box-single">
											<img src="/images/<?=$brand->img?>" alt="" data-id="<?=$brand->id?>" data-src="<?=$brand->img ?>" style="max-height: 150px">
										</div>
									</div>
									<div class="overlay">
										<i class="fa fa-refresh fa-spin"></i>
									</div>
								</div>
							</div>
						</div>
						<div class="form-group">
							<input type="hidden" name="id" value="<?=$brand->id ?>">
							<input type="submit" class="form-control btn btn-success" value="Сохранить" required>
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>
</section>
<?php debug($_GET); ?>

Далее создал модель чтобы принимать и обрабатывать картинки

<?php
namespace app\models\admin;
use app\models\AppModel;
class Brand extends AppModel {
	public $attributes = [
		'title' => '',
		'description' => '',
		'alias' => '',
	];
	public $rules = [
		'required' => [
			['title'],
			['description'],
		],
	];
	public function getImg(){
		if(!empty($_SESSION['box-single'])){
			$this->attributes['img'] = $_SESSION['box-single'];
			unset($_SESSION['box-single']);
		}
	}
	public function saveGallery($id){
		if(!empty($_SESSION['box-single'])){
			$sql_part = '';
			foreach($_SESSION['box-single'] as $v){
				$sql_part .= "('$v', $id),";
			}
			$sql_part = rtrim($sql_part, ',');
			\R::exec("INSERT INTO brand (img) VALUES $sql_part");
			unset($_SESSION['box-single']);
		}
	}
	public function uploadImg($name, $wmax, $hmax){
		$uploaddir = WWW . '/images/';
		$ext = strtolower(preg_replace("#.+\.([a-z]+)$#i", "$1", $_FILES[$name]['name'])); // расширение картинки
		$types = array("image/gif", "image/png", "image/jpeg", "image/pjpeg", "image/x-png"); // массив допустимых расширений
		if($_FILES[$name]['size'] > 1048576){
			$res = array("error" => "Ошибка! Максимальный вес файла - 1 Мб!");
			exit(json_encode($res));
		}
		if($_FILES[$name]['error']){
			$res = array("error" => "Ошибка! Возможно, файл слишком большой.");
			exit(json_encode($res));
		}
		if(!in_array($_FILES[$name]['type'], $types)){
			$res = array("error" => "Допустимые расширения - .gif, .jpg, .png");
			exit(json_encode($res));
		}
		$new_name = md5(time()).".$ext";
		$uploadfile = $uploaddir.$new_name;
		if(@move_uploaded_file($_FILES[$name]['tmp_name'], $uploadfile)){
			if($name === 'box-single'){
				$_SESSION['box-single'] = $new_name;
			}else{
				$_SESSION['multi'][] = $new_name;
			}
			self::resize($uploadfile, $uploadfile, $wmax, $hmax, $ext);
			$res = array('file' => $new_name);
			exit(json_encode($res));
		}
	}
	/**
	 * @param string $target путь к оригинальному файлу
	 * @param string $dest путь сохранения обработанного файла
	 * @param string $wmax максимальная ширина
	 * @param string $hmax максимальная высота
	 * @param string $ext расширение файла
	 */
	public static function resize($target, $dest, $wmax, $hmax, $ext){
		list($w_orig, $h_orig) = getimagesize($target);
		$ratio = $w_orig / $h_orig; // =1 - квадрат, <1 - альбомная, >1 - книжная
		if(($wmax / $hmax) > $ratio){
			$wmax = $hmax * $ratio;
		}else{
			$hmax = $wmax / $ratio;
		}
		$img = "";
		// imagecreatefromjpeg | imagecreatefromgif | imagecreatefrompng
		switch($ext){
			case("gif"):
				$img = imagecreatefromgif($target);
				break;
			case("png"):
				$img = imagecreatefrompng($target);
				break;
			default:
				$img = imagecreatefromjpeg($target);
		}
		$newImg = imagecreatetruecolor($wmax, $hmax); // создаем оболочку для новой картинки
		if($ext == "png"){
			imagesavealpha($newImg, true); // сохранение альфа канала
			$transPng = imagecolorallocatealpha($newImg,0,0,0,127); // добавляем прозрачность
			imagefill($newImg, 0, 0, $transPng); // заливка
		}
		imagecopyresampled($newImg, $img, 0, 0, 0, 0, $wmax, $hmax, $w_orig, $h_orig); // копируем и ресайзим изображение
		switch($ext){
			case("gif"):
				imagegif($newImg, $dest);
				break;
			case("png"):
				imagepng($newImg, $dest);
				break;
			default:
				imagejpeg($newImg, $dest);
		}
		imagedestroy($newImg);
	}
}

И наконец в файл my.js для ajax загрузки фото
if ($('div').is('#single')){
   var buttonSingle = $("#single"),
	   buttonMulti = $("#multi"),
	   buttonBrand = $("#box-single"),
	   file;
}
if (buttonBrand){
	new AjaxUpload(buttonBrand, {
		action: adminpath + buttonBrand.data('url') + "?upload=1",
		data: {name: buttonBrand.data('name')},
		name: buttonBrand.data('name'),
		onSubmit: function(file, ext){
			if (! (ext && /^(jpg|png|jpeg|gif)$/i.test(ext))){
				alert('Ошибка! Разрешены только картинки');
				return false;
			}
			buttonBrand.closest('.file-upload').find('.overlay').css({'display':'block'});
		},
		onComplete: function(file, response){
			setTimeout(function(){
				buttonBrand.closest('.file-upload').find('.overlay').css({'display':'none'});
				response = JSON.parse(response);
				$('.' + buttonBrand.data('name')).html('<img src="/images/' + response.file + '" style="max-height: 150px;">');
			}, 1000);
		}
	});
}

сначала была ошибка о которой я писал выше
вот эта
VM739:1 Uncaught SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at my.js:223
но после найденой мной ошибки появилась вот такая на скрине видно
То есть сейчас оно по какой то причине не может понять или распознать картинку или то что я пытаюсь ее загрузить

Прикрепленные файлы



#30 Я.Сергей

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 1 796 сообщений
Репутация: 314

Отправлено 17 Октябрь 2019 - 12:38

Добрый день,

А вас не смущает текст ошибки?

Цитата

Контроллер - ImagesController не найден
судя по всему он у вас где-то в коде вызывается
предположу, что не указано пространство имён в том файле, где вызывается этот контроллер
что и вызывает ошибку

#31 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 17 Октябрь 2019 - 13:21

Собственно, Сергей Вам указал на ошибку: где-то происходит http-запрос, который перенаправляется на несуществующий контроллер... к сожалению, большего здесь сложно подсказать, нужно только производить дебаг кода.

#32 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 17 Октябрь 2019 - 13:51

Это и смущает потому что я реально делаю все по вашим урокам а запрос отправляется почему то на несуществующий контроллер
это меня и ставит в тупик

#33 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 17 Октябрь 2019 - 18:34

А эта ошибка возникает в ответ на запрос? Или она изначально видна в консоли, после загрузки страницы? Мне кажется, что в src изображения записывается что-то не то, можете показать скриншот исходного кода блока с изображением?
Если не получится разобраться самостоятельно, тогда можете выложить архив с приложением (+ дамп БД) на Google Диск, я попробую посмотреть, если будет время.

#34 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 17 Октябрь 2019 - 20:42

Андрей спасибо еще Вам огромное за помощь
Но я разобрался сам
Причина весьма банальна
Изначально когда я задумал реализовать данную задачу в силу своей неопытности я баннеры и боксы поместил в один контроллер ImageController.php
Когда я выполнил определенный процедурный процесс, в частности достал из базы баннера и боксы и вынес их в админ панель я понял что это не правильно и просто решил переименовать контроллер
Что и привело к такой ошибке
Что я сделал - я буквально удалил все действия которые были связанны с этим выводом контроллеры, модели, виды и создал все новое но уже не под одним контроллером а разделил их - бренды к брендам и баннера к баннерам с соответствующими контроллерами, моделями и видами
И вуаля все заработало
Может вариант с одним ImageController.php тоже правильный был я не знаю, опять таки повторюсь в силу своего незнания и не опытности
Но теперь все работает
Если вам интересно я могу весь исходный код выложить на гугл диск это не проблема тем более авторское право принадлежит Вам)

#35 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 18 Октябрь 2019 - 05:57

Просмотр сообщенияGenesis (17 Октябрь 2019 - 20:42) писал:

Андрей спасибо еще Вам огромное за помощь
Но я разобрался сам
Вот это отлично! :)
И мне меньше работы и Вам больше опыта, поскольку лучший опыт - это опыт, полученный самостоятельно, приобретенный при поиске и исправлении собственных ошибок ;)

#36 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 30 Октябрь 2019 - 12:56

День вам добрый Андрей
Опять вынужден обратиться к Вам за помощью)
Нашел случайно Ваш старый ролик по API приватбанка и захотелось это все интегрировать в админ панель из вашего курса
Но как то не вяжется где то ошибка
Может вы подскажете что да как буду очень вам признателен

вот код из админского CurrencyController.php

<?php
namespace app\controllers\admin;
use app\models\admin\Currency;
class CurrencyController extends AppController {
	public function getUsd(){
		$courses = json_decode(file_get_contents(API_PB), true);
		if (!$courses) return false;
		$cours_curr_usd = false;
		foreach ($courses as $cours){
			if ($cours['ccy'] == 'USD'){
				$cours_curr_usd = $cours['buy'];
				break;
			}
		}
		return $cours_curr_usd;
	}
	public function getEur(){
		$courses = json_decode(file_get_contents(API_PB), true);
		if (!$courses) return false;
		$cours_curr_eur = false;
		foreach ($courses as $cours){
			if ($cours['ccy'] == 'EUR'){
				$cours_curr_eur = $cours['buy'];
				break;
			}
		}
		return $cours_curr_eur;
	}
	public function indexAction(){
		$cours_curr_usd = $this->getUsd();
		$cours_curr_eur = $this->getEur();
		$usd = \R::getRow('select * from currency where code like ?', ['%USD%']);
		$eur = \R::getRow('select * from currency where code like ?', ['%EUR%']);
		if ($usd['value'] != $cours_curr_usd){
			\R::exec("INSERT INTO `currency` ( `value`) VALUE ('$cours_curr_usd')");
		}
		debug($cours_curr_usd);
		debug($cours_curr_eur);
		$currencies = \R::findAll('currency');
		$this->setMeta('Список активных валют');
		$this->set(compact('currencies', 'courses'));
		debug($usd);
		debug($eur);
	}
	public function deleteAction(){
		$id = $this->getRequestID();
		$currency = \R::load('currency', $id);
		\R::trash($currency);
		$_SESSION['success'] = 'Выбранная валюта успешно удалена';
		redirect();
	}
	public function editAction(){
		if (!empty($_POST)){
			$id = $this->getRequestID(false);
			$currency = new Currency();
			$data = $_POST;
			$currency->load($data);
			$currency->attributes['base'] = $currency->attributes['base'] ? '1' : '0';
			if (!$currency->validate($data)){
				$currency->getErrors();
				redirect();
			}
			if ($currency->update('currency', $id)){
				$_SESSION['success'] = 'Изменения успешно сохранены';
				redirect();
			}
		}
		$id = $this->getRequestID();
		$currency = \R::load('currency', $id);
		$this->setMeta('Редактирование Валюты');
		$this->set(compact('currency'));
	}
	public function addAction(){
		if (!empty($_POST)){
			$currency = new Currency();
			$data = $_POST;
			$currency->load($data);
			$currency->attributes['base'] = $currency->attributes['base'] ? '1' : '0';
			if (!$currency->validate($data)){
				$currency->getErrors();
				redirect();
			}
			if ($currency->save('currency')){
				$_SESSION['success'] = 'Новая валюта успешно добавлена';
				redirect();
			}
		}
		$this->setMeta('Добавление новой валюты');
		$this->set(compact(''));
	}
}


#37 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 30 Октябрь 2019 - 17:03

Здравствуйте :)

Просмотр сообщенияGenesis (30 Октябрь 2019 - 12:56) писал:

Но как то не вяжется где то ошибка
А что за ошибка? Как я говорил, код в уме я выполнять не могу, поэтому не зная ошибки - сложно что-то подсказать.

#38 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 01 Ноябрь 2019 - 14:15

Просмотр сообщенияmatroskin8 (30 Октябрь 2019 - 17:03) писал:

Здравствуйте :)

А что за ошибка? Как я говорил, код в уме я выполнять не могу, поэтому не зная ошибки - сложно что-то подсказать.

Произошла Ошибка

Код Ошибки: Исключение

Текст ошибки: SQLSTATE[HY000]: General error: 1364 Field 'title' doesn't have a default value

Файл, в котором произошла ошибка:/Applications/MAMP/htdocs/ishop2.loc/vendor/gabordemooij/redbean/RedBeanPHP/Driver/RPDO.php

Строка, в которой произошла ошибка:194


#39 matroskin8

    Администратор

  • Администраторы
  • 12 645 сообщений
Репутация: 2 153

Отправлено 01 Ноябрь 2019 - 15:42

В ошибке сообщается о том, что в таблице БД для поля title не установлено значение по умолчанию, т.е. подразумевается, что это поле обязательно для заполнения и оно должно участвовать в sql-запросах. Вы не написали, при работе какого именно экшена возникает данная ошибка, но еще раз просмотрев код, подозреваю, что это может быть indexAction, в котором меня смущает следующий запрос:
\R::exec("INSERT INTO `currency` ( `value`) VALUE ('$cours_curr_usd')");
Здесь заполняется только поле value, насколько я вижу... проверьте этот момент. Мне кажется, что там, во-первых, должен быть не INSERT, а UPDATE, а, во-вторых, запрос должен быть с условием, примерно такой:
\R::exec("UPDATE `currency` SET `value` = ? WHERE code = 'USD'", [$cours_curr_usd]);
Запрос набросал сходу, проверить негде, поэтому мог ошибиться в запросе, проверьте его корректность, если что.

Еще один момент хотел бы отметить. Вы написали два отдельных метода для получения курсов: getUsd и getEur. При этом оба метода фактически дублируют друг друга. Их вполне можно заменить одним, который будет возвращать массив нужных курсов, что-то типа такого:
/*
$data - need array
$data = ['USD', 'EUR'];
return [
    'USD' => 25.00000,
    'EUR' => 27.00000,
]
*/
protected function getCourses($data)
{
    $courses = json_decode(file_get_contents(API_PB), true);
    if (!$courses) return false;

    $courses_curr = [];
    foreach ($courses as $cours){
	    // если валюта есть в переданном массиве - возьмем ее
	    if(in_array($cours['ccy'], $data)){
		    $courses_curr['ccy'] = $cours['buy'];
	    }
    }
    return $courses_curr;
}
Метод, опять-таки, писал на коленке, проверить не могу, так что если захотите оптимизировать - возможные ошибки отловите и поправите.
При вызове метода просто передадите массив необходимых валют и получите за один раз массив с их курсами. В итоге не нужно будет вызывать два однотипных метода и дважды дергать API, все будет получено за один раз.

#40 Genesis

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
Репутация: 0

Отправлено 01 Ноябрь 2019 - 23:58

Спасибо огромное за помощь сейчас буду пробовать)
Вы конечно столько всего написали хочу заметить, что вы профи а я дилетант :)
Немного уловил мысль сейчас попробую разобраться
Мне как новичку удобней было написать 2 метода чтобы отдельно с каждым разбираться





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных