• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Creative
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C

Creative

Прошу помощи.

Нужно организовать на 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
    535 байт · Просмотры: 166
A

Andrew Stephanoff

Не понимаю -- в чем сложность? И кто мешает использовать javascript?
 
C

Creative

<!--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 буду признателен, если напишите код или конструкцию.
 
A

Andrew Stephanoff

Код:
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 );
...
 
C

Creative

В принципе я понял, как делать. Честно говоря, не очень, но сам дойду надеюсь :)

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

p.s. или же если с формы будет передаваться значение на другую страничку. Методом get пользоваться ?
 
G

Gisma

Дайте статью для кто в танке!:)
Причем здесь пхп? он СЕРВЕРНАЯ технология. а тебе нужно изменение данных У КЛИЕНТА
 
C

Creative

<!--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

 
G

Guest_Serg_*

а что есть исходно-то? я так понимаю, есть имя объекта(карандаш)? нужен пхп-скрипт, который бы выводел хтмл в указанном виде? выводил откуда?
вот, например, из субд что-то такое...
Код:
<?
$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->... не смотри - я просто использовал по привычке стандартный класс. для простого скрипта можеш обойтись родным пхп-айпи той субд к которой обращаешся (если, конечно, объект хранится в субд)
 
A

Andrew Stephanoff

Ему нужно без перезагрузки страницы
 
G

Guest_Serg_*

хм... представляю...
"select * ... " грузицца в двумерный массив джаваскрипта и отгружается в браузер...
потом пользователь начинает юзать форму... :)
кстати, как только размер массива перевалит за 1 - 1.5 мега, 4-й пень 2.5Ггц начинает немерянно тормозить
да так, что приходица убивать процесс
 
A

Andrew Stephanoff

Ты неправильно понял задание.
Выборка из БД будет выведена как таблица, а JS лишь обратиться к неободимым id в дереве документа. При чем здесь загрузка всей (!) выборки в массив JS? И при чем здесь форма, если данные в принципе можно не отсылать (надо лишь умножить цену на количество)?

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

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


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

Creative

Спасибо всем, кто отозвался на вопрос! На самом деле, основываясь на Ваших постах и сайте я все таки понял, как мне сделать все это, только вот затясалась проблема... :)

Я пересчитываю валюту, размер которой вводиться в форму. ($_POST[''])
Допустим рубли в доллары. Проблема такова, что у меня не считаются дробные чила ;) . Мне нужно умножить 28,18 на 5 допустим, а все равно выводится 140, вместо 140,9.
Какой оператор это делает? На самом деле я нашел раздел, где пишется про string, char, только вот не могу разобраться. Если у кого есть линк на доступное обьяснение данной темы, киньте пожалуйста сюда или на мыло :D
 
A

Andrew Stephanoff

Попробуй вместо "," в качестве разделителя использовать "."
Во время выполнения арифметических действий php сам должен привести к нужному типу.
 
C

Creative

<!--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 - курс доллара.

Если не трудно, вставь исправления.
 
A

Andrew Stephanoff

и снова не понял :) ты когда вводишь в качестве разделителя дробной и целой части ставишь "," а надо "."
Код:
$price = str_replace(",", ".", $_REQUEST["price"]);
$dol = str_replace(",", ".", $_REQUEST["dol"]);
echo ($price * $dol);
 
G

Guest_Serg_*

У тебя стоит $sql->escape_string(). То есть экранируются кавычки, как я понимаю. а где проверка MAGIC_QUOTES? А вдруг данные уже пришили экранированые?
я ш сказал, что скрипт уязвим. не писать же весь скрипт с нуля... - тут тока схема.
можно получать параметры самопальной функцией param('param_name') - там все чистится (и, если надо, приводится к типу). к тому же escape_string - это веть метод, который тоже пишется ручками.

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

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

а в массиве на 1.5 гига запросто могуть быть аудиторские выкладки - гори они синим пламенем :)
 
A

Andrew Stephanoff

Сергей (?) -- зарегистрируйся на форуме.
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 метра, а только необходимые данные по запросу.
 
S

_serg_

Ты сказал про 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 (конечно же) мега - допустим какой-нить документ (приказ) который толстая тетка сидит и правит
или таблица, которую она ручками сидит общитывает. ну не тянут браузеры такое пока что... вообще невозможно работать..
хотя, можно, конечно, извращнуться и сбацать какую-нить скрытую от пользователя постраничную загрузку... не знаю - не задумывался пока над этим... но идея прикольная, не спорю - судя по гуглю...
 
A

Andrew Stephanoff

Сергей, на 1,5 мегабайта должен быть ОЧЕНЬ БОЛЬШОЙ текст, страниц на 500-600.
 
S

_serg_

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!