Php/ mysql. как выполнить домашнее задание player.php?
Создал файл player.php, создал таблицу данных в phpmyadmin. Написал код по выведению данных на странице в браузере. Ничего не показывает... Но когда этот код подставляю в index.php, то всё работает.
<?php
$mysqli = new mysqli('localhost', 'root', '', 'kinomonster');
if (mysqli_connect_errno()) {
prinf("Соединение не установлено", mysql_connect_error());
exit();
}
$mysqli->set_charset('utf8');
$query = $mysqli->query('SELECT * FROM music');
while ($row = mysqli_fetch_assoc($query)) {
echo $row['author'].$row['name']."<br>";
}
$mysqli->query($query);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
28 ответов
Вот так должно быть:
Файл db.php
<?php
$mysqli = new mysqli('127.0.0.1', 'root', '', 'kinomonster');
if (mysqli_connect_errno()) {
print_f("Соединение не установлено", mysql_connect_error());
exit();
}
$mysqli->set_charset('utf8');
?>
Файл player.php
<?php
/**
* Код PHP выносим вверх. Подключение к базе данных выносим в отдельный файл db.php
* и вставляем файл функцией include
*/
include('db.php');
/* Заводим переменные name и author и присваиваем им пустые значения, на тот случай, если захотим их где-то вывести в html коде. */
$name = "";
$author = "";
/* Проверяем, существуют ли переменные $_POST и если существуют, тогда обрабатываем данные POST от пользователя и переопределяем переменные $name и $author, присвоив им отфильтрованные значения от пользователя
*/
if(isset($_POST['name']) && isset($_POST['author'])) {
$nameFilter = htmlspecialchars($_POST ['name'], ENT_QUOTES, 'UTF-8');
$authorFilter = htmlspecialchars($_POST ['author'], ENT_QUOTES, 'UTF-8');
$name = $nameFilter;
$author = $authorFilter;
/**
* Вставку в базу данных
*/
$query = "INSERT INTO music VALUES(null, '$name', '$author')";
$mysqli->query($query);
}
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!--Main Style-->
<link href="css/style.css" rel="stylesheet">
<title>Плеер</title>
</head>
<body>
<div class="col-lg-6 col-lg-push-3 field">
<form action="player.php" method="post" clas="form-group">
<legend>Исполнители / Песни</legend>
<input type="text" name="name" placeholder="<?php echo $name;?>">
<input type="text" name="author" placeholder="<?php echo $author;?>">
<button type="submit" class="btn">Отправить</button>
</form>
<table class="table table-striped ">
<?php $querry = $mysqli->query('SELECT * FROM music'); ?>
<!--
* Чтобы избежать ошибок, когда у нас пустая база данных, нужно поставить дополнительные проверки
* if($querry) - т.е. если запрос выполнился и пришел результат, тогда делаем while.
-->
<?php if($querry): ?>
<?php while ($row = mysqli_fetch_assoc($querry)): ?>
<tr>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['author']; ?></td>
</tr>
<?php endwhile; ?>
<?php endif; ?>
</table>
</div>
<?php
$mysqli->close();
?>
</body>
</html>
SQL-дамп базы (kinomonster.sql)
-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Хост: 127.0.0.1
-- Время создания: Декабрь 28 2017 г., 16:32
-- Версия сервера: 10.1.9-MariaDB
-- Версия PHP: 5.6.15
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `kinomonster`
--
-- --------------------------------------------------------
--
-- Структура таблицы `music`
--
CREATE TABLE `music` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`author` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `music`
--
ALTER TABLE `music`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `music`
--
ALTER TABLE `music`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Там в примере файл player.php и html-форме action player.php, иначе либо в action переименовать нужно страницу обработки формы, либо оставить все как есть.
Здравствуйте, Валерий
Выносить подключение к базе данных в отдельный файл - это хорошая практика, которая позволяет не прописывать каждый раз подключение, когда нужно сделать запросы к таблицам.
Если у вас 1000 страниц и на всех 1000 страницах вы прописали подключение к базе данных и однажды перенесли ваш проект на другой сервер, а там доступы к базе другие и в этом случае вам придется изменить реквизиты подключения на 1000 страницах, что не очень удобно.
Обычно подключение к базам данных реализуется в виде паттерна Singleton, который позволяет иметь всего одно единое подключение. В уроках по PHP-фреймворку станет более понятно какой должна быть архитектура веб-сайта.
Здесь задается в каком файле должен быть обработчик формы:
<form action="player.php" method="post" clas="form-group">
Возьми код и дамп базы из первого ответа, разверни у себя и все будет нормально работать, только что проверил.
Дамп базы данных из ответа развернул или свою базу данных оставил? Нужно из ответа дамп развернуть, в общем весь код возьми, как я выше писал, вместе с дампом и будет работать.
Если у кого-то возникает проблема, что при отправке пустого запроса - пустые данные записываются в базу данных: поставьте вот это условие.
if($_POST['name'] != '' && $_POST['author'] != '') {
$nameFilter = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
$authorFilter = htmlspecialchars($_POST['author'], ENT_QUOTES, 'UTF-8');
$name = $nameFilter;
$author = $authorFilter;
$query = "INSERT INTO music VALUES(null, '$name', '$author')";
$mysqli->query($query);
}
если сам не решил и попросил подсказки значит ли что успеха не видать в дальнейшем?)
Это просто кошмар, последний код успешно забивает в базу данных. А как все таки вывести в этом же?
Спасибо, но таблица не активируется, только в плаёсхолдер мои записи попадают
Тоже ооочень долго думала. Читала документацию. В итоге тоже пришла ко мнению, что нужен разбор урока. Код написала следующий:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'kinomonster');
if(mysqli_connect_errno()) {
prinf("Соединение не установлено", mysqli_connect_error());
exit();
}
$mysqli->set_charset('utf8');
if (isset($_POST['name']) && isset($_POST['autor'])) {
$name = mysqli_escape_string($mysqli, $_POST['name']);
$autor = mysqli_escape_string($mysqli, $_POST['autor']);
$mysqli->query("INSERT INTO music (name, autor) VALUES ('{$name}', '{$autor}')");
}
$query = $mysqli->query('SELECT * FROM music');
while ( $row = mysqli_fetch_assoc($query) ) {
echo $row['name'].$row['autor']."<br>";
}
$mysqli->close();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="/player.php" method="post">
<input type="text" name="name" placeholder="название песни">
<input type="text" name="autor" placeholder="исполнитель">
<input type="submit" value="добавить">
</form>
</body>
</html>
По поводу form action="/player.php" method="post" дейтвительно / нужно указывать страницу на которой должен работать запрос, иначе только на index и работает.
В целом задание конечно дает раскачаться мозгам =)
p.s. да у меня не authot -> autor (ну так получилось)
Подскажите, как реализовать редактирование выведенных данных из базы данных непосредственно из html формы кнопкой?
Антон, подскажи как решил эту задачу? У меня тоже результат отображается только в index.php, как настроить чтоб работало через player.php ?
))) это все нам щас чуть позже объяснят
Добрый день.
Подскажите, пожалуйста, почему при добавлении что через форму, что непосредственно в майадмине, появляется 2 одинаковых строки?
UPD - походу глюк был, вчера задваивалось, а сегодня уже нет.
Да, косяк с этим домашним заданием. Много вопросов возникло.
Не помню, чтобы рассказывали, как прикрутить форму к БД. В массивы мы отправляли данные, но с БД форму не дружили.
Дальше возникла проблема с action, потому что в уроке мы ставили там слеш и слышали "Это мы разберем потом", а когда до этого доходит, то как бы уже должны сами понять. Почитав в интернете, узнал, что за место слеша идет ссылка на обработчик, в моем случае на save.php. В вариантах выше php код для отправки данных в базу стоит в файле player.php.
С выводом данных из БД проблем не возникло, кусок кода уже был в уроках.
Выпустите разбор домашних заданий с рассказом, как надо, как правильно. Чтобы можно было сесть и сравнить, что мы написали и как Вы это предлагаете делать. Подходы у всех разные и чем больше мы знаем вариантов решения тех или иных задач, тем легче нам будет в будущем.
Согласен с Николаем Дмитриевым, может надо сделать доп видео к этому ДЗ, у меня тоже возникли вышеназванные трудности. Тем более что в видео-уроках не говорилось подключение к базе данных создать в виде отдельного файла db.php
<?php
$mysqli = new mysqli ('localhost','root','', 'kinomonster');
if (mysqli_connect_errno()) {
printf("Соединение не установлено", mysqli_connect_errno());
exit();
}
$mysqli->set_charset('utf8');
if (isset($_POST['name']) && isset($_POST['authour'])) {
$mysqli = new mysqli('localhost','root','', 'kinomonster');
if($mysqli->connect_error){
die("Ошибка: " . $mysqli->connect_error);
}
$name = $mysqli->real_escape_string($_POST['name']);
$authour = $mysqli->real_escape_string($_POST['authour']);
$query = "INSERT INTO music VALUES (null,'$name', '$authour')";
if($mysqli->query($query)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $mysqli->error;
}
$mysqli->close();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Player</title>
</head>
<body>
<form action="player.php" method="post">
<p>Имя:
<input type="text" name='name' /></p>
<p>Автор:
<input type="text" name='authour' /></p>
<input type="submit" value="Добавить">
</form>
</body>
</html>
<?php
if (isset($_POST['name'])) {
$nameFilter = htmlspecialchars($_POST["name"], ENT_QUOTES, "UTF-8");
$name=$nameFilter;
}
if (isset($_POST['author'])) {
$nameFilt = htmlspecialchars($_POST["author"], ENT_QUOTES, "UTF-8");
$author=$nameFilt;
$mysqli = new mysqli('127.0.0.1', 'root', '', 'kinomonster');
if (mysqli_connect_errno()) {
printf("соединение не установлено, msqli_connect_error");
exit();
}
$mysqli->set_charset('utf8');
$query = "INSERT INTO Mus VALUES('1', '$name', '$author')";
$mysqli->query($query);
$mysqli->close();
}
?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="player.php" method="post">
<input type="text" name="name" value="">
<input type="text" name="author" value="">
<input type="submit" name="" value="Отправить">
</form>
</body>
</html>
Все работает только в файле index.php, а в файле music.php компьютер как будто ничего не видит... Не знаю, почему.
Спасибо, у меня всё получилось!
И ещё вопрос, почему нужно выносить подключение к базе данных в отдельный файл?
Спасибо !
Все работает только в файле index.php, а в файле music.php компьютер как будто ничего не видит... Не знаю, почему.
Так и не понял ответа на данный вопрос.
Ну так я так и сделал.
<form action="player.php" method="post">
Но результат отображается только в index.php
Для чего тогда было создавать "player.php"?
Ну или следовало объяснить как настроить отображение на player.php , смотрю я тут не один втыкаю по данному заданию.
Уже понял, но тяжко мне это далось)
Создал таблицу "music", следом создал поля: id, name, author. Ввел через phpMyAdmin первого исполнителя с названием трека. Далее создал файл: db.php c подключением к базе данных. В отдельном файле player.php записал вроде бы правильный код, но В БАЗУ НИЧЕГО НЕ ДОБАВЛЯЕТСЯ, а на страницу выводится только созданный изначально исполнитель-название. Подскажите пожалуйста что может быть не так?
<?php
include('db.php');
$name = "";
$author = "";
if(isset($_POST['name']) && isset($_POST['author'])) {
$nameFilter = htmlspecialchars($_POST ['name'], ENT_QUOTES, 'UTF-8');
$authorFilter = htmlspecialchars($_POST ['author'], ENT_QUOTES, 'UTF-8');
$name = $nameFilter;
$author = $authorFilter;
$query = "INSERT INTO music VALUES(null, '$name', '$author')";
$mysqli->query($query);
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<form action="player.php" method="POST">
<input type="text" name="name" placeholder="<?php echo $name;?>">
<input type="text" name="author placeholder="<?php echo $author?>">
<input type="submit" volue="отправить">
</form>
<table>
<?php $querry = $mysqli->query('SELECT * FROM music'); ?>
<?php if($querry): ?>
<?php while ($row = mysqli_fetch_assoc($querry)): ?>
<tr>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['author']; ?></td>
</tr>
<?php endwhile; ?>
<?php endif; ?>
</table>
</div>
<?php
$mysqli->close();
?>
</body>
</html>
Ещё к решению student_Cx8W3815 можно добавить проверку на пустые значения в форме:
if(isset($_POST['name']) && isset($_POST['author'])) {
$nameFilter = htmlspecialchars($_POST ['name'], ENT_QUOTES, 'UTF-8');
$authorFilter = htmlspecialchars($_POST ['author'], ENT_QUOTES, 'UTF-8');
if (empty($nameFilter) && empty($authorFilter)) {
echo 'Все поля должны быть заполнены!';
} else {
$name = $nameFilter;
$author = $authorFilter;
/**
* Вставку в базу данных
*/
$query = "INSERT INTO music VALUES(null, '$name', '$author')";
$mysqli->query($query);
}
}
Создал файл player.php -> написал код -> обновляю страницу в браузере -> выводятся данные с файла index.php и тут я завис.... т.к в уроке то не было пояснений как быть в таком случае... Но нашёл выход раз гора не идёт к Магомеду то Магомед пойдёт к горе)) и тут мне нужен совет, корректно ли так делать:
я просто в файл index.php добавил запись
<?php
include('player.php');
?>
И так по аналогии если будут создаваться другие файлы то в index.php будут соответствующие подключения:
<?php
include('player.php');
include('xmltest.php');
?>
Будут ли в дальнейшем проблемы, с такой организацией, если да то какие?