ОБСУЖДЕНИЕ

Форма в Php. Аналогия Excel

21 ответов 10,4 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Прошу помощи.

Нужно организовать на php таблицу, которая имела бы схожесть с Excel-кой.
То-есть нужно сделать так, чтобы в первой ячейке вводились цифры(допустим колличество) а в остальных выводилась сумма по заранее забитой формуле. Сама проблема в выводе, не могу никак понять как автоматически вывести результат сразу в следующей ячейке.

Я плохо обьясняю такие вещи так что лучше выложу небольшой код с пояснениями:

Код:
<html>
<head>
<title>форма</title>
</head>

<center>
<form action="index.php" method="">
<input type="text" nаmе="z1" size="10" maxlength="6" value="карандаш">
<input type="text" nаmе="z2" size="10" maxlength="6" value="серийный номер">
<input type="text" nаmе="z3" size="10" maxlength="6" value="цена в рублях">
<input type="text" nаmе="z4" size="10" maxlength="6" value="колличество">
<input type="text" nаmе="z5" size="10" maxlength="6" value="цена в долларах">
</form>
</center>

</body>
</html>

Автоматически нужно выводить только цены.

з.ы. понимаю, что скрипт элементарный(может я и не прав, но мне кажется, что это просто сделать), но все же :D

Заранее спасибо! :)
 

Вложения

  • index.php
    index.php
    535 байт · Просмотры: 389
Не понимаю -- в чем сложность? И кто мешает использовать javascript?
 
<!--QuoteBegin-Andrew Stephanoff+24:02:2006, 11:34 -->
<span class="vbquote">(Andrew Stephanoff @ 24:02:2006, 11:34 )</span><!--QuoteEBegin-->Не понимаю -- в чем сложность? И кто мешает использовать javascript?
[snapback]31016" rel="nofollow" target="_blank[/snapback]​
[/quote]


Просто в php я немного разбираюсь, а вот c JavaScript не лады, да и не брался я за него. Если есть решения на Java буду признателен, если напишите код или конструкцию.
 
Код:
HTML
-------
...
<input type="text" id="byr" nаmе="z3" size="10" maxlength="6" value="цена в рублях">
<input type="text" id="usd" nаmе="z5" size="10" maxlength="6" value="цена в долларах">
<input type="text" nаmе="z4" id="count" size="10" maxlength="6" value="количество">
....

javascript
--------------

...
var count = document.getElementById("count").value;
var priceUSD = document.getElementById("usd").value * count;
var priceBYR = document.getElementById("byr").value * count;

alert("price in dollars: " + priceUSD + "\nцена в рублях: " +priceBYR );
...
 
В принципе я понял, как делать. Честно говоря, не очень, но сам дойду надеюсь :)

А на php все-таки это вообще реально ?

p.s. или же если с формы будет передаваться значение на другую страничку. Методом get пользоваться ?
 
Дайте статью для кто в танке!:)
Причем здесь пхп? он СЕРВЕРНАЯ технология. а тебе нужно изменение данных У КЛИЕНТА
 
<!--QuoteBegin-Gisma+24:02:2006, 16:04 -->
<span class="vbquote">(Gisma @ 24:02:2006, 16:04 )</span><!--QuoteEBegin-->Дайте статью для кто в танке!:D
Причем здесь пхп? он СЕРВЕРНАЯ технология. а тебе нужно изменение данных У КЛИЕНТА
[snapback]31027" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не понял, мне нужно это не для клиента, а для личного использования. Просто я каждый день пишу отчет, который хочу оптимизировать :)

Честно говоря мне все равно, как это будет использовано, просто хотел заодно немного о формах(php) узнать, что касается именно ввода и вывода на одной и той же странице.
Почти так же как, допустим, сделано на сайте Метробанка.
Вводите сумму, количество месяцев, и он считает сколько это будет в рублях, посредством нажатия на кнопку Submit. Только вот мне нужно, чтобы все автоматически считалось, без какой-либо активации. Вообщем, как в Excel'e

МЕТРОБАНК
 
а что есть исходно-то? я так понимаю, есть имя объекта(карандаш)? нужен пхп-скрипт, который бы выводел хтмл в указанном виде? выводил откуда?
вот, например, из субд что-то такое...
Код:
<?
$z1 = $_REQUEST['z1']; # получаем айдишник карандаша
$info = array();
$sql = new SQL('dsn', 'login', 'pass');
# коннектимся к субд
$query = "SELECT name, serial_num, rub, quantity, baks from Table where name = '" . $sql->escape_string($z1) . "'";
# или так:
# $query = "SELECT name, serial_num, rub, quantity, baks from Table where name LIKE \"%" . $sql->escape_string($z1) . "%\"";
if ( $sql->query('result_name', $query) ) {
 if($sql->selected_rows('result_name') === 1) {
   if( !( $info = $sql->fetch_assoc('result_name') ) ) {
     # fetching failed
   }
 }
 else {
   # ничего не найдено
 }

 $sql->free_result('result_name');
}
else {
 # query failed
}
# субд дисконнект
?>
<html>
<head>
<title>форма</title>
</head>
<?
if(count($info)) {
 ?>
 <center>
 <form action="index.php" method="">
 <input type="text" nаmе="z1" size="10" maxlength="6" value="<?= $info['name'] ?>">
 <input type="text" nаmе="z2" size="10" maxlength="6" value="<?= $info['serial_num'] ?>">
 <input type="text" nаmе="z3" size="10" maxlength="6" value="<?= $info['rub'] ?>">
 <input type="text" nаmе="z4" size="10" maxlength="6" value="<?= $info['quantity'] ?>">
 <input type="text" nаmе="z5" size="10" maxlength="6" value="<?= $info['baks'] ?>">
 </form>
 </center>
 <?
}
else {
 ?>ничего не найдено<?
}
?>
</body>
</html>
что-то так..
только в таком виде скрипт нельзя на общее пользование допускать - тут sql-инъекция возможна. если только исключительно для своих...
на $sql->... не смотри - я просто использовал по привычке стандартный класс. для простого скрипта можеш обойтись родным пхп-айпи той субд к которой обращаешся (если, конечно, объект хранится в субд)
 
Ему нужно без перезагрузки страницы
 
хм... представляю...
"select * ... " грузицца в двумерный массив джаваскрипта и отгружается в браузер...
потом пользователь начинает юзать форму... :)
кстати, как только размер массива перевалит за 1 - 1.5 мега, 4-й пень 2.5Ггц начинает немерянно тормозить
да так, что приходица убивать процесс
 
Ты неправильно понял задание.
Выборка из БД будет выведена как таблица, а JS лишь обратиться к неободимым id в дереве документа. При чем здесь загрузка всей (!) выборки в массив JS? И при чем здесь форма, если данные в принципе можно не отсылать (надо лишь умножить цену на количество)?

Далее по тексту.

хм... представляю...
"select * ... " грузицца в двумерный массив джаваскрипта и отгружается в браузер...
Есть такая технология -- AJAX.
кстати, как только размер массива перевалит за 1 - 1.5 мега,
Не представляю, что может быть в таком массиве. Опять же, незачем грузить все сразу.


Посмотрел твой код.
1. У тебя стоит $sql->escape_string(). То есть экранируются кавычки, как я понимаю. а где проверка MAGIC_QUOTES? А вдруг данные уже пришили экранированые?
2. Не понимаю, зачем такой класс? Ты используешь те же функции MySQL, только как методы класса. Суть класса для баз данных в том, что если проект переходит на новую базу, то не код менять, а подключить новый класс. Посмотри как сделан PEAR DB, либо DbSimple Котерова. Если хочется делать свое, то хотя бы расширь возможности стандартных функций (например, число строк запроса можно возвращать и в sql::query()).
 
Спасибо всем, кто отозвался на вопрос! На самом деле, основываясь на Ваших постах и сайте php5 я все таки понял, как мне сделать все это, только вот затясалась проблема... :)

Я пересчитываю валюту, размер которой вводиться в форму. ($_POST[''])
Допустим рубли в доллары. Проблема такова, что у меня не считаются дробные чила ;) . Мне нужно умножить 28,18 на 5 допустим, а все равно выводится 140, вместо 140,9.
Какой оператор это делает? На самом деле я нашел раздел, где пишется про string, char, только вот не могу разобраться. Если у кого есть линк на доступное обьяснение данной темы, киньте пожалуйста сюда или на мыло :D
 
Попробуй вместо "," в качестве разделителя использовать "."
Во время выполнения арифметических действий php сам должен привести к нужному типу.
 
<!--QuoteBegin-Andrew Stephanoff+25:02:2006, 19:50 -->
<span class="vbquote">(Andrew Stephanoff @ 25:02:2006, 19:50 )</span><!--QuoteEBegin-->Попробуй вместо "," в качестве разделителя использовать "."
Во время выполнения арифметических действий php сам должен привести к нужному типу.
[snapback]31065" rel="nofollow" target="_blank[/snapback]​
[/quote]

Прости, но я не понял... Лучше приведу код:
Код:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo ($_POST['price'] * $_POST['dol']);
 }
?>

, где price - цена, doll - курс доллара.

Если не трудно, вставь исправления.
 
и снова не понял :) ты когда вводишь в качестве разделителя дробной и целой части ставишь "," а надо "."
Код:
$price = str_replace(",", ".", $_REQUEST["price"]);
$dol = str_replace(",", ".", $_REQUEST["dol"]);
echo ($price * $dol);
 
У тебя стоит $sql->escape_string(). То есть экранируются кавычки, как я понимаю. а где проверка MAGIC_QUOTES? А вдруг данные уже пришили экранированые?
я ш сказал, что скрипт уязвим. не писать же весь скрипт с нуля... - тут тока схема.
можно получать параметры самопальной функцией param('param_name') - там все чистится (и, если надо, приводится к типу). к тому же escape_string - это веть метод, который тоже пишется ручками.

Не понимаю, зачем такой класс? Ты используешь те же функции MySQL, только как методы класса. Суть класса для баз данных в том, что если проект переходит на новую базу, то не код менять, а подключить новый класс. Посмотри как сделан PEAR DB, либо DbSimple Котерова. Если хочется делать свое, то хотя бы расширь возможности стандартных функций (например, число строк запроса можно возвращать и в sql::query()).
один чел, работавший с мускулем, переносил сайт на иб-феникс. нужно было для него сделать привычный интерфейс... далее, как показала практика, для начинающих это понятно и удобно (99% людей начинают с мускуля). если они начнут читать про транзакции, роллбеки и прочее, у них быстро заканчиваица энтузиазм. согласись, что здесь все понятно для новичка где и что делает делает каждый метод

Есть такая технология -- AJAX
када сервер свой, то такая технология есть. када чел не является хозяином сервера, то такой технологии нет.

а в массиве на 1.5 гига запросто могуть быть аудиторские выкладки - гори они синим пламенем :)
 
Сергей (?) -- зарегистрируйся на форуме.
1. Ты сказал про SQL-инъекцию, и тут же в коде экранируешь строку. Но ведь экранирование строки и есть защита от SQL-инъекции! Другое дело -- ты не проверяешь MAGIC_QUOTES. И для чистоты класса лучше в этом методе реализовать только экранирование, а проверку оставить на совести специальной функции. Я для своего движка написал метод для получения значений переменных с принудительным убиранием слешей (если есть) и присваиванием значения по умолчанию, если переменной в запросе нет.

2. Оно-то понятно, но просто ты заменяешь контрукцию mysql_query() конструкцией sql::query(). Как говорится, найдите 10 отличий :). И интерфейс для базы данных разрабатывается не ради самой возможности работать с базой данных через класс, а ради возможности работы с различными базами данных через один (!) класс. Например, в PEAR DB или DbSimple достаточно просто указать в DSN-строке SQL-сервер и все, интерфейс работы не изменится (но появятся масса дополнительных возможностей). В любом случае изучение чужого опыта -- вещь полезная. А ориентироваться ты должен не на новичков, а на себя и клиента.

3. При чем тут мой/не мой сервер? AJAX -- это remote scripting. Если сервер поддерживает любой серверный язык, а клиент -- javascript|vbscript, то AJAX будет работать. И если у тебя информация занимает 1,5 (все-таки наверно) мбайта, то при генерации странички наверно тоже возникнет ощутимая пауза? Другое дело, что AJAX позволит тебе не забирать сразу эти 1,5 метра, а только необходимые данные по запросу.
 
Ты сказал про SQL-инъекцию, и тут же в коде экранируешь строку. Но ведь экранирование строки и есть защита от SQL-инъекции! Другое дело -- ты не проверяешь MAGIC_QUOTES. И для чистоты класса лучше в этом методе реализовать только экранирование, а проверку оставить на совести специальной функции. Я для своего движка написал метод для получения значений переменных с принудительным убиранием слешей (если есть) и присваиванием значения по умолчанию, если переменной в запросе нет.
escape_string() кстати, у меня (в варианте для мускуля) mysql_real_escape_string() + еще несколько проверок
насчет слешей:
ну, теоретически, можно при получение параметра, после чистки и проверки валидности сделать что-то подобное
$param = (! get_magic_quotes_gpc ()) ? addslashes ($param_name) : $param_name;
НО (мое личное мнение):
от мейджик_квотес нужно отказаться - отключить нафих все 3 управляющих флага. нет доступа к пхп.ини - сделать это либо через ини_сет, либо через специально предназначенные для этого функции, либо поменяв ручками значения соответствующих констант
причины:
1. они портят пользовательский ввод еще на этапе приема параметров и очень неудобно обрабатывать в одном и том же скрипте ветвления заливки в базу и чего-то еще (например, проверки, вставки, рассылки...)
2. явные проблемы с юникодом (на сегодняшний день)
3. путаница с взаимозависимостями/взаимоотключениями между функциями установок этих мейджик_квотс (их 3 штуки)
4. мейджик квотес не спасают от инъекции как таковой. это спасает только от падения запроса при вводе произвольного текста (да и то не во всех случаях). для предотвращения иънъекции, достаточно экранировать лиш ; и -- в любом виде (в том числе и в форме кода)
а вообще (и, думаю, меня поддержит большинство), надо использовать плейсхолдеры. и не надо париться
и там еще например в мускуле прежде чем заливать данные в like надо станцевать пляску с бубном перед обратными слешами. ну не проверять же каждый раз экранировалось что-то или нет... - это ш скока лишних действий
и раз уш зашла речь о безопасности, мало безошибочно залить данные в бд. нужно их оттуда грамотно вылить.
если они будут выливаться в хтмл, то нужно обеспечить защиту от хсс-аттак, принудительно применяя хтмлспешлчарс для данных, выливаемых в хтмл. это самое поганое для безопасности место. смена программера может привести к тому, что новичок не особо разобравшись, выплюнет содержимое текстового поля в хтмл (например, админскую страничку) и злому редиске уйдет сид админа. а сессии редко пока что по айпи привязываются. главным образом из-за того, что программерам лень обрабатывать тучу проксевых хттп-заголовков...

2. да. это, конечно, так

3. ну, чесно скажу, что про аджакс я тока прочитал что это такое и как работает. .. но вот есть, допустим, текст на 1.5 (конечно же) мега - допустим какой-нить документ (приказ) который толстая тетка сидит и правит
или таблица, которую она ручками сидит общитывает. ну не тянут браузеры такое пока что... вообще невозможно работать..
хотя, можно, конечно, извращнуться и сбацать какую-нить скрытую от пользователя постраничную загрузку... не знаю - не задумывался пока над этим... но идея прикольная, не спорю - судя по гуглю...
 
Сергей, на 1,5 мегабайта должен быть ОЧЕНЬ БОЛЬШОЙ текст, страниц на 500-600.
 
Сергей, на 1,5 мегабайта должен быть ОЧЕНЬ БОЛЬШОЙ текст, страниц на 500-600
примерно 1.5к печатных страниц - допустим, детализированная финансовая отчетность аудита крупной компании или какой-нить анализ с табличными выкладками.... или, например, бюджет РФ со всеми приложениями...
уверяю, 1.5мега далеко не предел
 
Статус
Закрыто для дальнейших ответов.