Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Форма функции и ее обработчик данных (HTML и PHP на Денвере) (https://javascript.ru/forum/server/80204-forma-funkcii-i-ee-obrabotchik-dannykh-html-i-php-na-denvere.html)

Безнадежный программист 09.05.2020 06:23

Форма функции и ее обработчик данных (HTML и PHP на Денвере)
 
Вложений: 2
Здравствуйте! Я пыталась сделать вычисление функции f(x)=log(3 * arctg(x)) с html и php на Денвере, которое бы по результатам и виду соответствовало прикрепленным скриншотам (простите за качество, если смогу исправить - потом сделаю, надеюсь хоть что-то видно), а также вот таким условиям:
  1. Первая страница (html) - принимает значения в виде имени, начального и конечного значений, их количества в таблице.
  2. Вторая страница (php) - выводит все это, как оформлено. Имя сверху, начальное и конечное значения в таблице, и у них задано количество отсчетов.
  3. У меня не выводится введенное имя. Ни GET, ни POST его не выводят. Скорее всего, я допустила какую-то ошибку синтаксиса, хотя Денвер на этом молчит, а до меня пока что не дошло, как починить это.
  4. Не знаю, как сделать так, чтобы в таблице выводилось именно столько значений, сколько задано в поле количества отсчетов. Может быть, есть какая-то "настройка" для функции?
  5. Последние значения не всегда выводятся. Скажем, единица выводится, а двойка нет, тройка тоже и т.д.
  6. Если возможно, хотелось бы, чтобы в таблицу выбирались более средние значения, а не по рандому, то есть, например, если задается от 1 до 2х и отсчеты равны 5и, то он выводит "1, 1.25 ,1.5, 1.75 , 2" или "1, 1.3 ,1.5, 1.8 , 2", а если так нельзя, то чтобы хотя бы отсчеты заработали по количеству значений нормально.
  7. У меня по-русски нормально в Денвере по какой-то причине не выводит - одни иероглифы.
  8. Хотелось бы весь текст в целом сделать побольше, чем он есть. Скорее всего, это задается классом или функцией, но я не совсем понимаю, как это сделать наравне и на странице html, и на php.
  9. В целом код вышел у меня не совсем толковый и скудноватый, поэтому если у вас будут критика и замечания - я слушаю. Повторяюсь, конечно, но все равно еще раз скажу - я слаба в этих темах и мне толком знакомы в основном html и css. Буду рада слышать профессионалов и знатоков. Заранее спасибо за внимание к моей проблеме :thanks: :victory: .

Вот код. Надеюсь, я смогла сделать его читаемым:

<!DOCTYPE html>
<html>

<head>
  <meta charset="windows-1251">
  <script src="jquery-3.4.1.min.js"></script>
</head>

<body>
  <form action="result.php" method="POST">
    <p action="result.php" method="GET">Введите ваше имя:
      <input type="text" name="name">
    </p>
    <p><b>Вычисление функции f(x)=log(3 * arctg(x)):</b></p>
    <table>
      <tr>
        <td>Начальное значение</td>
        <td>
          <input type="text" name="first">
        </td>
      </tr>
      <tr>
        <td>Конечное значение</td>
        <td>
          <input type="text" name="last">
        </td>
      </tr>
      <tr>
        <td>Количество отсчетов</td>
        <td>
          <input type="text" name="quantity">
        </td>
      </tr>
    </table>
    <h1></h1>
    <input type="submit" value="Вычислить">
  </form>

</body>

</html>


<?php
  header('Content-type: text/html; charset=windows-1251');
?>

<body>
  <p>Задание выполнил(а):<?php
    $_POST['name'];
  ?></p>
  </br>

  <?php
    $xstart = (float)$_POST['first'];
    $xend = (float)$_POST['last'];
    $d = 0.1;
    echo '<table border="1" align="center" valign="center" width="20%">';
    echo "<center><b>Таблица значений функции f(x)=log(3 * arctg(x))<center></p>";
    echo "<tr>";
    echo "<th>x</th>";
    echo "<th><center>f(x) $selectOption<center></th>";
    echo "</tr>";
    for ($x = $xstart; $x<=$xend; $x+=$d){
      $y = log(3 * atan($x));
      echo "<tr><td><center>$x<center></td><td><center>$y<center></td>";
    }
    echo "</table>";
  ?>
</body>

laimas 09.05.2020 06:57

Цитата:

Сообщение от Безнадежный программист
$_POST['name'];

Это не вывод, это вообще никакого действия, вывод это:

<p>Задание выполнил(а):<?php
    echo htmlspecialchars($_POST['name']);
  ?></p>


либо

<p>Задание выполнил(а): <?=htmlspecialchars($_POST['name'])?></p>

Безнадежный программист 09.05.2020 10:33

Цитата:

Сообщение от laimas (Сообщение 523991)
Это не вывод, это вообще никакого действия

Да, здесь я знала, что сильно ошиблась, но исправить хотя бы на GET, чтобы не так странно выглядело, у меня времени уже не оставалось. Спасибо.

laimas 09.05.2020 13:30

Цитата:

Сообщение от Безнадежный программист
исправить хотя бы на GET

Ну изменяйте метод передачи формы на GET и на сервере обрабатывайте массив $_GET, а не $_POST. Одновременно передать данные методом GET и POST форма может только при методе POST.

laimas 12.05.2020 16:12

Цитата:

Сообщение от Безнадежный программист
У меня по-русски нормально в Денвере по какой-то причине не выводит - одни иероглифы.

Не соответствие кодировок - объявленной и файла.

Безнадежный программист 12.05.2020 17:53

Цитата:

Сообщение от laimas (Сообщение 524130)
Не соответствие кодировок - объявленной и файла.

Уже решили конкретно эту проблему, но все равно спасибо.

laimas 12.05.2020 18:52

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

Безнадежный программист 12.05.2020 19:47

Цитата:

Сообщение от laimas (Сообщение 524148)
А в остальном какие проблемы

Я все еще решаю проблемы по пунктам 4, 5 и 6, потому что в интернете пока что подходящего ответа не видела, а мои "игры" с кодом в течении всего этого времени не очень удачно заканчиваются.

Цитата:

Сообщение от laimas (Сообщение 524148)
Нет вывода нужного - выводите в браузер счетчик итерации для понимания проблемы.

Не совсем понимаю здесь совета. Вы мне предлагаете работать с консолью браузера или буквально просто выводить код в браузер? Простите, если я вас совсем не так понимаю.

laimas 12.05.2020 20:36

Цитата:

Сообщение от Безнадежный программист
Вы мне предлагаете работать с консолью браузера

Консоль к РНР отношения не имеет, это серверный язык и выполняется на сервере. А вывод в браузер, это результат работы РНР, и это echo, print, и т.д. его функции, которые вполне могут быть простейшим отладчиком. По крайней мере они позволят вам проверить свои ожидания с происходящим реально в коде.

Безнадежный программист 13.05.2020 04:15

Цитата:

Сообщение от laimas (Сообщение 524154)
вывод в браузер, это результат работы РНР, и это echo, print, и т.д. его функции, которые вполне могут быть простейшим отладчиком. По крайней мере они позволят вам проверить свои ожидания с происходящим реально в коде.

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

laimas 13.05.2020 05:04

Не знаю что вы обнаружили, но если вместо "красоты итоговой" выводить в цикле значение итератора, то ответ на вопрос 4 вы бы наверняка получили.

Malleys 15.05.2020 10:05

Цитата:

Сообщение от Безнадежный программист
Здравствуйте. Извините, что беспокою, но вы не могли бы отправить ответ снова в сообщение, если вам не трудно, пожалуйста? Я просто не успела его тогда прочитать.
Мне жаль, что у вас там произошел конфликт с другим пользователем. Надеюсь, вы в порядке.
И спасибо большое еще раз, что в прошлый раз написали, вы правда спасли меня.
Если я что попутала, то дайте мне знать и прошу прощения.

Здравствуйте! Да, я могу опубликовать тот код на PHP...

<?php
	header('Content-type: text/html; charset=utf-8');
?>
<style>
	body {
		font-size: 150%;
		max-width: 30em;
		margin: auto;
		padding: 1em;
		text-align: center;
	}
	table {
		width: 100%;
		table-layout: fixed;
	}
	table, th, td {
		border: 1px solid gray;
		border-collapse: collapse;
		font-size: 1em;
		text-align: center;
		padding: 0.5em;
	}
</style>
<p>Задание выполнил(а): <?= htmlspecialchars($_GET['name']); ?></p>
<?php
	function toHTMLTableRow($x, $y) {
		return "<tr><td>{$x}</td><td>{$y}</td></tr>";
	}
	$start = (float)$_GET['first'];
	$end = (float)$_GET['last'];
	$steps = (float)$_GET['quantity'];
	$d = ($end - $start) / $steps;
	$rows = join('', array_map(function($x) {
		return toHTMLTableRow($x, log(3 * atan($x)));
	}, range($start, $end, $d)));
	echo <<<EOL
<table>
	<caption>Таблица значений функции f(x) = log(3atan x)</caption>
	<tr>
		<th>x</th>
		<th>f(x)</th>
	</tr>
	{$rows}
</table>
EOL;
?>


Также к коду прилагается иллюстрация, демонстрирующая работу кода в IE6...

laimas 15.05.2020 11:16

Цитата:

Сообщение от Malleys
join('', array_map(

В РНР join, это псевдоним функции implode, у которой по умолчанию первый аргумент равен пустой строке, поэтому его можно опускать:

implode(array_map(...


Часовой пояс GMT +3, время: 05:10.