Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Выяснил в чем была проблема. У меня в опенсервере была включена опция "Защитить сервер от внешнего доступа". Отключил и порядок.
Выяснил в чем была проблема. У меня в опенсервере была включена опция "Защитить сервер от внешнего доступа". Отключил и порядок.
Ни с того ни с сего появилось несколько проблем с композером. Одна из них, это при попытке выполнить composer install пояаляется ошибка:
[ErrorException]
file_exists(): open_basedir restriction in effect. File(C:/Users/lubim/AppData/Local/Composer/.htaccess) is not within the allowed path(s): (c:/ospanel/domains;c:/ospanel/userdata/temp;c:/ospanel/modules/system/html/openserver;c:/ospanel/modules/php/PHP-7.0;C:/Users/lubim/AppData/Roaming/Composer/.htaccess)
Может кто-то знает откуда это могло появиться? Раньше все было нормально. Я не припоминаю, чтобы я добавлял вручную файлы по адресу C:/Users/lubim/AppData/Local/Composer/.htaccess . Можно как-то выйти из положения не разрешая доступ к другим директориям? Например, удалить файл C:/Users/lubim/AppData/Local/Composer/.htaccess. Чем это чревато?
В настройках open-сервера использую конфигурацию:
HTTP - Apache-php-7
PHP - php 7.0
Mysql 5.7
Установлен laravel 5.5.*
Попытался запустить composer update и получил вонинг
c:\OSPanel\domains\our_landing_pade_beta>composer require hisorange/browser-detect
Warning: passthru() has been disabled for security reasons in phar://C:/OSPanel/modules/php/PHP-7.0/composer.phar/src/Composer/XdebugHandler.php on line 101
Я понимаю зачем вообще нужен passthru() и могу его просто убрать из дизейблов. Но откуда мог взяться этот вонинг? Раньше его не было. Я не хотел бы удалять его из дизейблов. Насколько я понимаю, я тем самым ослабляю защиту от взлома. Как можно выяснить что именно стало причиной вонинга и устранить первоисточник?
В настройках open-сервера использую конфигурацию:
HTTP - Apache-php-7
PHP - php 7.0
Mysql 5.7
Установлен laravel 5.5.*
Загружаю в БД огромные таблицы из csv. Можно ли средствами mysql/eloquent отсекать повторяющиеся записи, если я для повышения производительности формирую и отправляю по одному запросу на 500 записей? Уникальность записей должна определяться по всем столбцам одновременно в рамках всего csv-документа или всей таблицы бд (каждый документ пишется в новую таблицу). Если в двух строках хоть в одном столбце строки (числа) отличаются, значит считаем, что записи уникальны и не повторяющиеся. Какой самый простой способ это сделать? array_unique($csv) не работает. Я из csv получаю тип данных, который не является массивом.
$csv = Reader::createFromPath("$path)->setHeaderOffset(0); // использую эту библиотеку: thephpleague/csv
foreach ($csv as $record) {
$dataSet[] = [
'table_column_1' => $record['col_1'];
...
...
];
}
DB::table($table)->insert($dataSet);
Я упростил этот фрагмент, чтобы не загромождать его лишним, убрал итерации по 500 записей и т.п.
$where = array_combine($columns1, $filters1);
Фантастика в одну строку!
А как добиться похожего результата и для апдейта?
У меня на вход в метод поступают четыре массива. Два $columns1[] и $columns2[], которые содержат имена столбцов. И два $filters1[] и $filters2[], которые содержат поисковые фильтры. Как можно перебирая в цикле значения этих столбцов, сформировать запрос к бд? Не могу сообразить как это делается через eloquent. То же самое касается и update.
Конечный запрос будет выглядеть примерно так:
$data::where($columns1[0], '=', $filters1[0])
->where($columns1[1], '=', $filters1[1])
...
->where($columns1[n], '=', $filters1[n])
...
->update($columns2[0] => $filters2[0],
$columns2[1] => $filters2[1],
...
$columns2[n] => $filters2[n],
переопредели метод register в RegisterController и поставь в него редирект на главную на всякий случай.
Переопределил два метода. Но не уверен, что этого достаточно, чтобы обеспечить безопасность.
public function register(Request $request)
{
return redirect('/');
}
public function showRegistrationForm()
{
return redirect('/');
}
К определенным страницам нужен доступ только нескольких человек. Я их добавил в таблицу, авторизация к этим страницам работает верно. Теперь мне нужно запретить возможность регистрироваться всем остальным пользователям. Как это сделать? Наверное, более правильный подход, это назначать различные права доступа, но это пока не нужно, и я с этим еще не разбирался.
Нужен именно редирект? Попробуй что-нибудь вроде:return redirect(url()->previous() . '#anchor');
Да, редирект работает. Но как мне теперь над формой показать сообщение о том, что заказ был успешно оформлен и спасибо за внимание? Мне ведь эту логику нужно в шаблоне закладывать. А как это сделать если я не передаю никакие параметры в шаблон, а просто редиректом открываю предыдущую страницу? Как сделать что-то одно: редирект или вывести сообщение, я знаю. А как сделать и то и другое по-отдельности, чето не догоняю.
Не угадал, смена настроек на локалхосте никак не поможет.
Я понял почему возникла эта проблема. В настройках доменов локального сервера (опенсервер) я указывал папку mysite.com/public в качестве доменной директории. Соответственно локалхост знал где искать .htaccess, который лежал внутри /public/. Соответственно, внитри .htaccess нужно было указывать такой путь (т.к. .htaccess лежал вместе с index.php):
DirectoryIndex index.php.
RewriteRule ^ index.php [L]
При переходе же на хостинг у меня нет возможности указать доменную директорию. Поэтому я вынужден вынести .htaccess в корень, чтобы сервер мог его найти. А поскольку я его вынес, то теперь по отношению к нему, индексный файл размещается по другому адресу:
DirectoryIndex public/index.php.
RewriteRule ^ public/index.php [L]
Если я это сделаю, то сайт начинает работать, но я вынужден вручную менять все пути, везде дописывать /public/
Наверное точнее я не смогу сформулировать свою проблему. Подскажите пути решения.. Я застрял на ровном месте (((
Может в данном случае мне нужно .htaccess вынести из public в корень и на локалхосте? И настроить пути так, чтобы все работало на локалхосте. Тогда при переносе на хостинг теоретически с адресами проблем не должно возникнуть? Сейчас попробую это сделать. Если нет, подскажите как это делается или ткните где об этом пишут.
Тебе как раз нужно настроить веб сервер так, чтобы в URI не было public.
public то я убрал из .htaccess, но теперь сервер не видит мою точку входа public_html/public/index.php. Вся проблема в том, что на локалхосте .htaccess лежал в папке public и все было ОК,а теперь его пришлось вынести в корень, иначе сервер не может найти .htaccess (я так думаю).
А какой именно пусть создает asset('css/slider.css')? Должен создавать что-то вроде https://website.com/css/slider.css
да, такой и создает, а мне нужно https://website.com/public/css/slider.css
Что-то мне подсказывает, что я неверно настроил .htaccess
нужно использовать помощники вроде asset() для создания пути к JS, CSS, изображениям и пр. И помощники вроде public_path() для указани путей к файлам.
А, чет не внимательно прочитал, да, public_path() - это немного не то (хотя тоже спасибо, я о нем не знал). А вот asset не помог. У меня что на локалхосте путь к css был css/slider.css, что на хостинге. А должен был стать public/css/slider.css. Может я неправильно сконфигурировал .htaccess? У меня на локалхосте было:
DirectoryIndex index.php
RewriteRule ^ index.php [L]
А я исправил на:
DirectoryIndex public/index.php
RewriteRule ^ public/index.php [L]
и вкинул в корневую public_html хостинга.
Изначально вместо прямых путей нужно использовать помощники вроде asset() для создания пути к JS, CSS, изображениям и пр.
У меня все пути написаны через asset, например:
href="{{asset('css/slider.css')}}"
Но это не помогло (должно было ведь помочь?). А вот насчет public_path() не знал, сейчас посмотрю что к чему.
Измени время в названии файлов миграции так, чтобы сначала создалась таблица locations, потом clients и уже потом comments.
Так и есть:
/migrations/2017_10_27_213205_CreateLocationsTable.php
/migrations/2017_10_27_213314_CreateClientsTable.php
/migrations/2017_10_27_213401_CreateCommentsTable.php
Перед этим у меня действительно был неправильный порядок миграций. Но я тогда просто не смог их запустить по той же причине. После этого я не менял время, а пересоздал их в нужном порядке. В самой БД я удалил таблицу migrations, других таблиц не было. Может что-то закешировалось?
Нужен именно редирект?
Вообще нет. Как правильнее будет сделать? Может это через роуты нужно разруливать как-то?
Попробуй что-нибудь вроде:
А это попробую, спасибо
Есть три таблицы, две из них с внешними ключами:
Таблица comments
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('client_id')->unsigned()->default('0');
$table->foreign('client_id')->references('id')->on('clients')->onUpdate('cascade')->onDelete('cascade');
$table->text('message');
$table->timestamps();
});
Таблица clients
Schema::create('clients', function (Blueprint $table) {
$table->increments('id');
$table->text('email');
$table->text('name');
$table->text('position')->nullable();
$table->integer('location_id')->unsigned();
$table->foreign('location_id')->references('id')->on('locations')->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
Таблица locations
Schema::create('locations', function (Blueprint $table) {
$table->increments('id');
$table->text('ip');
$table->text('country')->nullable();
$table->text('department');
$table->text('timezone');
$table->timestamps();
});
Фрагмент из контроллера
$comment = new Comment();
$comment -> client() -> email = $request -> input('email');
$comment -> client() -> name = $request -> input('name');
$comment -> client() -> position = $request -> input('position');
$comment -> message = $request -> input('message');
$comment -> save();
При попытке добавить запись в эти таблицы получаю ошибку.
Текст ошибки
Illuminate \ Database \QueryException (23000)
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`landing`.`comments`, CONSTRAINT `comments_client_id_foreign` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `comments` (`message`, `updated_at`, `created_at`) values (dfgdgdgdf, 2017-10-28 10:31:06, 2017-10-28 10:31:06))
Читал инфу по коду этой ошибки. Советуют проверить соответствие названий и типов внешних ключей. Ключи перепроверил, не смог найти косяк. Либо чего-то еще не знаю, либо чего-то не заметил. Подскажите если кто заметит косяк.
И еще один вопрос: я правильно понимаю, что при добавлении записи в таблицу clients (см. фрагмент из контроллера), автоматически заполнится соответствующая запись в таблице comments (колонка client_id)? Я полагаю это должен обеспечить метод onUpdate('cascade').
Столкнулся с проблемой, что при переносе сайта на хостинг мне пришлось менять ссылки на все скрипты, изображения, шрифты. Причина возникновения проблемы в том, что весь проект закидывается в директорию public_html. Таким образом стили, например, теперь расположены здесь: public_html/public/css/..., а были расположены здесь: public/css/... Теперь при каждой правке шаблона приходится его заливать и каждый раз менять все эти пути. Как это вообще делается? И еще вопрос из той же серии, я все свои изменения заливаю вручную пофайлово. Как это делают профи? Спасибо.
При отправке запроса с формы мне нужно как-то вернуться на ту же страницу, но уже по анкору к этой форме и показать текстовый блок возле формы, который изначально скрыт. Знаю о редиректах, могу передавать данные с контроллера в вид. Но увязать и то и другое что не получается. Подкиньте идею как это сделать.