Здравствуйте. При обучении MySQL по курсу [Специалист] MySQL-5.1 2013 Столкнулся с заданием создать триггер на INSERT с условием. При вставке города с несуществующим countrycode, менять новый код на RUS. Триггеру меня создаётся, но при вставке города происходит ошибка ERROR 1442 (HY000): Can't update table 'city' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Не удается обновить таблицу "город" в хранимой функции / триггера, поскольку он уже используется оператором, который вызвал эту сохраненную функцию / триггер. База используется world демонстрационная MySQL. Ниже код запроса на создание триггера. Подскажите пожалуйста если я что-то неправильно понял. За ранее спасибо!
DELIMITER |
-- 3. При вставке города с несуществующим countrycode, менять новый код на RUS
DROP TRIGGER IF EXISTS tg_city_insert |
CREATE TRIGGER tg_city_insert AFTER INSERT ON city
FOR EACH ROW BEGIN
IF NEW.countrycode = '' THEN
-- Изменим код на RUS
UPDATE city
SET
countrycode = 'RUS'
WHERE NEW.countrycode = '';
END IF;
END;
|
DELIMITER ;
Спасибо что никто не ответил! Я сам нашёл ответ, который оказался элементарным. В скрипте вывода нужно инкрементировать ключ вот так и всё заработало.
session_start();
if( is_file($_SESSION['loget']) ){
//echo "Файл существует";
$log = file($_SESSION['loget']);
foreach($log as $key =>$lines){
echo ++$key." . $lines <br />";
}
}
Работа над ошибками. Так будет правильно. А сессия здесь вообще не нужна.
Здесь пишем файл.
$dt = time();// Время записи
$page = $_SERVER['REQUEST_URI']; // Куда переходим
$ref = $_SERVER['HTTP_REFERER']; // Откуда переходим
$path = "$dt|$page|$ref"; // Формируем строку для записи в файл
file_put_contents("log/".PATH_LOG, "$path\n", FILE_APPEND); // Делаем запись в файл
А здесь выводим записи файла.
//Проверяем наличие файла
if(is_file("log/".PATH_LOG) ){
// Зачитываем файл в массив
$file = file("log/".PATH_LOG);
echo "<ol>";
foreach($file as $line){
//Присваиваем запись в переменные по разделителю
list($dt, $page, $ref) = explode("|", $line);
// Трансформируем метку времени
$dt = date("d-m-Y H:i:s", $dt);
// Выводим записи файла
echo <<<OUT
<li>
[$dt]: $ref -> $page
</li>
OUT;
}
echo "</ol>";
}
Спасибо!!!! Вот теперь всё действительно работает. Сам я до этого не скоро бы додумался... Я правильно понял что mysqli_real_escape_string только по одной переменной может экранировать? Борисов ничего об этом не говорит в уроке. Когда буду полностью уверен что все косяки нашёл и убрал залью сюда весь код страницы.
Почему когда я нажимаю вам Спасибо! Мне говорят что у меня не достаточно записей чтоб осуществить эту операцию?
Потому что эта возможность станет доступна после публикации вами 50-и постов ))
Понял. Всё равно Огромное Спасибо за Помощь!!!! Следующая тема не за горами. Я пока не понимаю как в этой гостевой сделать удаление записи.... Буду завтра голову ломать. А если не додумаюсь снова буду Умных Знающих людей спрашивать...
Да не за что На счёт удаления - опишу принцип, а реализацию уже будете допиливать самостоятельно:
1. Выбираете из базы id-данных, которые подлежат удалению
2. Подставляете в цикле эти id'шники в html-тег ссылки, например так:
3. В файле delet.php (или в одном из ваших файлов) проверяете наличие $_GET['delet'] и если она не пуста, то передаёте эти id'шники в sql-запрос на удаление записей
Простите Уважаемый, что снова к вам! Поторопился заявлять что всё работает... Сам нашёл несколько ошибок в работе. Например не заэкранировал строку запроса на дабавление новой записи. С которой возникла проблема. После экранирование строки запись перестала добавляться. Никакой ошибки не выдаёт просто запись не добавляет. Я так понимаю что эта функция с чем-то ссорится а с чем не пойму. Если экранирование убрать то всё вполне работает.
/* Сохранение записи в БД */
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if (isset($_POST['name'], $_POST['email'], $_POST['msg'])) {//Проверяем отправлена ли форма
$name = trim(strip_tags($_POST['name']));// Принимаем и фильтруем данные
$email = trim(strip_tags($_POST['email']));
$msg = trim(strip_tags($_POST['msg']));
$sql = mysqli_real_escape_string($link,"INSERT INTO msgs ( name, email, msg) VALUES ('$name', '$email', '$msg')");//Запрос на добавление новой записи
$res = mysqli_query($link, $sql);// Отправляем запрос на добавление новой записи
if( !$res)//В случае ошибки выводим сообщение о ней в браузер
echo mysqli_error($link);
}
header("Location: index.php?id=gbook");//посылаем заголовок на перезапрос страницы методом GET
exit;
}
/* Сохранение записи в БД */
Почему когда я нажимаю вам Спасибо! Мне говорят что у меня не достаточно записей чтоб осуществить эту операцию?
Потому что эта возможность станет доступна после публикации вами 50-и постов ))
Понял. Всё равно Огромное Спасибо за Помощь!!!! Следующая тема не за горами. Я пока не понимаю как в этой гостевой сделать удаление записи.... Буду завтра голову ломать. А если не додумаюсь снова буду Умных Знающих людей спрашивать...
Да не за что На счёт удаления - опишу принцип, а реализацию уже будете допиливать самостоятельно:
1. Выбираете из базы id-данных, которые подлежат удалению
2. Подставляете в цикле эти id'шники в html-тег ссылки, например так:
3. В файле delet.php (или в одном из ваших файлов) проверяете наличие $_GET['delet'] и если она не пуста, то передаёте эти id'шники в sql-запрос на удаление записей
Огромное Спасибо за подсказки. Я сделал чуть иначе. Так как было по условиям задания лабораторной работы без дополнительных файлов. Борисов сам сформировал ссылку на удаление записи. Ещё раз Спасибо за помощь! Теперь я знаю где и как правильно включить буферизацию.
Почему когда я нажимаю вам Спасибо! Мне говорят что у меня не достаточно записей чтоб осуществить эту операцию?
Потому что эта возможность станет доступна после публикации вами 50-и постов ))
Понял. Всё равно Огромное Спасибо за Помощь!!!! Следующая тема не за горами. Я пока не понимаю как в этой гостевой сделать удаление записи.... Буду завтра голову ломать. А если не додумаюсь снова буду Умных Знающих людей спрашивать...
как сделать чтоб после отправки формы страница оставалась гостевой
Вероятно прописать в строке header("Location: " . $_SERVER["PHP_SELF"]); вместо $_SERVER["PHP_SELF"] имя директории и файла с кодом гостевой. Вроде бы так: inc/routing.inc.php
А всё вместе, если адрес верен, будет иметь такой вид:
Спасибо!!!! Написал вот так header("Location: index.php?id=gbook"); exit; и всё заработало. Теперь последний вопрос немножко не по теме. Почему когда я нажимаю вам Спасибо! Мне говорят что у меня не достаточно записей чтоб осуществить эту операцию??? Очень хочется Правильно поблагодарить за помощь!
Так как у вас там подключается не один файл в индексе, то все я просматривать не имею желания. Поэтому попробуйте использовать этот вариант для индекса
Спасибо!!!! Запись добавляется. Только после отправки снова переход на index.php. А как сделать чтоб после отправки формы страница оставалась гостевой а не index.php?
новый ученик, что-то я не вижу в вашем индексе подключения файла gbook.inc.php
Он вот здесь require_once 'inc/routing.inc.php'; а это его код
<?php
switch($id){
case 'contact': include 'inc/contact.inc.php'; break;
case 'about': include 'inc/about.inc.php'; break;
case 'info': include 'inc/info.inc.php'; break;
case 'log': include 'inc/view-log.inc.php'; break;
case 'gbook': include 'inc/gbook.inc.php'; break;
default: include 'inc/index.inc.php';
}
<div id="header">
<!-- Верхняя часть страницы -->
<img src="logo.gif" width="187" height="29" alt="Наш логотип" class="logo" />
<span class="slogan">обо всём сразу</span>
<!-- Верхняя часть страницы -->
</div>
<div id="content">
<!-- Заголовок -->
<h1><?= $header?></h1>
<blockquote>
<?php
if(1 === $visitCounter){
echo "Спасибо, что зашли на огонек";
}else{echo "Вы зашли к нам $visitCounter-й раз.<br /> Последнее посещение: $lastVisit";}
?>
новый ученик, по тексту ошибки становится понятно, что у вас вывод начат в файле index.php, а файл gbook.inc.php подключен к index.php ниже этого вывода. Верно?
Да. Так и есть. В этом-то и засада что gbook.inc.php подключен к index.php. Если бы это была самостоятельная страница вопроса бы не возникло.
Я немного по другому сделал. Полностью пересоздал эту страницу с прежним кодом. Раскоментировал заголовок. Теперь снова пишет ошибку что заголовки отправлены Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\mysite.local\index.php:12) in C:\OpenServer\domains\mysite.local\inc\gbook.inc.php on line 28.
Вот код страницы.
<?php
/* Основные настройки */
const DB_HOST = 'localhost';
const DB_LOGIN = 'root';
const DB_PASSWORD = '';
const DB_NAME = 'gbook';
$link = mysqli_connect(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_NAME);
/* Основные настройки */
/* Сохранение записи в БД */
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if (isset($_POST['name'], $_POST['email'], $_POST['msg'])) {
$name = trim(strip_tags($_POST['name']));
$email = trim(strip_tags($_POST['email']));
$msg = trim(strip_tags($_POST['msg']));
новый ученик, напишите пожалуйста, ещё раз ваш код, но с учётом текущих изменений.
Вот код всей страницы. Отправка заголовка закоментирована. Но результат при отправке формы тот же. Переход на index.php к которому подключается страница а новая запись не вносится в базу данных.
<?php
/* Основные настройки */
const DB_HOST = 'localhost';
const DB_LOGIN = 'root';
const DB_PASSWORD = '';
const DB_NAME = 'gbook';
$link = mysqli_connect(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_NAME);
/* Основные настройки */
Да видел попробовал. С тем же результатом. После отправки новой записи переход на index.php и новой записи нет. Попробовал совсем удалить отправку заголовка. Результат тоже. После отправки новой записи переход на index.php и новой записи нет. Но ведь отправку заголовка я удалил.... Почему страница на index.php переходит???? Что-то у меня мозг вскипать начинает...