|
|
|
| существует одна форма на два скрипта, первый добавляем запись в БД, второй для редактирования.
использую одну и ту же форму, включил уровень ошибок E_ALL & ~E_NOTICE.
когда пытаюсь добавить запись в БД, выводятся notice такого типа Notice: Undefined variable: description in <b>C:\Site...6 откуда берутся эти замечания я понимаю, вопрос в другом.
как неопределённые переменные могут повлиять на безопасность скрипта, нужно ли объявлять эти переменные и присваивать им пустую строку/нулевое значение или лучше использовать ещё одну форму?
и ещё один маленький вопрос. с переменными более менее понятно, а вот как понять вот такой notice Notice: Undefined index: login in C:\Sites и как его исправить? это появляется в текстовом поле формы для ввода логина/пароля для входа на сайт. | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 00:56)
| | Notice: Undefined index: login in C:\Sites
неопределён такой ключ массива.
а лучше покажите код полностью, не особо понятно. | |
|
|
|
|
|
|
|
для: sl1p
(14.03.2009 в 01:04)
| |
<?php
/* инициируем сессию */
session_start();
/* устанавливаем соединение с БД */
require_once("connect.php");
///////////////////////////////////////////////////////////ОБРАБОТЧИК ФОРМЫ /////////////////////////////////////////////////////////
/* если поля ввода не пустые */
if (!empty($_POST['login']) && !empty($_POST['password'])){
/* делаем запрос к БД, который возвращает кол-во записей, удовлетворяющех паролью и логину */
$query = ("SELECT COUNT(*) FROM `user` WHERE `login` = '".$_POST['login']."' AND `password` = '".md5($_POST['password'])."'");
$us_out = mysql_query($query);
if(!$us_out) exit("<p class='info'>Ошибка авторизации</p>");
/* получаем кол-во записей */
if(mysql_result($us_out,0) > 0) define("USER_OUT",1);
}
/* если кол-во записей больше 0, заносим данные о пользователе в сессию */
if (defined("USER_OUT")){
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = $_POST['password'];
/* и переходим на главную страницу */
header("location:admin.php");
exit();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="stylesheet" type="text/css" href="../style/stylecss.css" />
<title>Вход в админку</title>
<style>
body{
text-align:center;
padding:5px;
}
table{
border-collapse:collapse;
}
td{
border:1px solid #000000;
padding:3px;
}
</style>
</head>
<body>
<div>
<form method="post">
<p>Имя / логин :*<br />
<input type="text" name="login" value="<?php echo $_SESSION['login'] ?>" /></p>
<p>Пароль :*<br />
<input type="password" name="password" value="<?php echo $_SESSION['password'] ?>" /></p>
<p><input type="submit" name="sub_log" value="Отправить" /></p>
</form>
</div>
</body>
</html>
|
p.s. блин, посмотрел на скрипт и по моему понял в чём проблема, не надо в форме указывать SESSION['login'] и SESSIOn['password'], сессии нет, занчит будет выдавать notice.
а вот что можете сказать по первой части вопроса? | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 01:12)
| | и всё таки интересно узнать, как лучше сделать, использовать одну форуму для двух скриптов и не обращать внимания на notice или сделать для каждого из скриптов свою форму? | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 10:11)
| | Что значит одну для двух? Если эти формы как близнецы, то зачем два скрипта? Если это разные данные от клиента, то это две формы. А предупреждения возникают потому, что не определены переменные, к котрым вы обращаетесь, в вашем случае, это не пришла еще форма, не опрделена переменная в сессии.... Пишите грамотно, обращайтесь корректно, поймете соль - подавите вывод предупреждений. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2009 в 10:51)
| | >Пишите грамотно, обращайтесь корректно, поймете соль - подавите вывод предупреждений.
вот это и пытаюсь сделать.
в сессии не определена переменная, потому что ещё не выполнен вход на сайт, это я понял. так можно писать если вход есть и надо вывести приветствие по имени пользователя. или не так понял?
а скрипты разные, один добавляет запись, второй редактирует ту же запись.
форма одна, вот скрипты разные действия выполняют.
получается что надо писать врорую форму... или можно как то ещё решить эту проблему, что бы не писать вторую форму?
и ещё вопрос, если notice выдаёт, что переменна не определена, то достаточно присвоить пустую строку или надо обязательно присваивать значение? | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 17:13)
| | А вы приучите себя (особенно пока учитесь) иницилизировать переменные, те, с которыми будете работать. Это поможет вам избежать куда более серьезных ошибок. Это можно делать просто:
<?
//инициализация, если форма принята,
//переменная принимает значение поля формы,
//иначе она пуста (или может принимать некое значение по умолчанию)
$_SESSION['login'] = isset($_POST['login']) ? $_POST['login'] : "";
|
Если у вас одна форма для двух скриптов, которые разняться только действием, то объедените эти два скрипта в один, и выполняйте необходимые действия исходя из условий. А условие может быть задано соответствующей кнопкой формы, передачей в форме дополниельного GET-параметра (в action) и т.п..
Ведь вы фактически в обеих скриптах своих будете повторять одни и те же операции - проверка, извлечение данных, их вывод в форму, второй срипт отличается только записью или обновлением. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2009 в 17:56)
| | значит, если я правильно понял, мне надо инициализировать переменные и через Get передать соответствующую команду скрипту(скрипт объеденить)?
при выводе формы, если предпологается запись в БД, переменной привсаивается пустая строка(notice не будут выводиться), при выводе формы для редактирования, поля формы(переменные) примут значение из БД.
я правильно понял?
меня интересовало, насколько правильно будет присвоить пустую строку переменной. | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 19:40)
| | Я не знаю, что вы хотите выводить и редактировать. Ну допустим, возьмеме этот форум. Вы открываете некую тему, просто щелчком по ссылке, вам выводятся все ее посты. Вы решаете добавить свой пост, и делаете это щелчком по соответствующей ссылке. Вам будет выведена форма, заполняете отправляете, читаете, что добавили. А если есть необходимость ее отредактировать, нажимаете соответсвующую ссылку - вам выводится та же форма, данные то ведь одни. Можно это разнести и на два скрипта, а можно при выводе формы атрибуту action формы добавлять параметр, значение которого и будет определять, что в данный момент делает пользователь - добавляет новые данные или редактирует введенные.
Можете просто подключать одну и ту же форму к двум разным скриптам меняя только action формы. Можно поступить иначе, способов может быть много, все зависит от логики вашей задачи.
Если вы будете инициализировать переменные (почему они у вас в сессию, вопрос отдельный...), то, например, при ошибках ввода, и возврате формы пользователю уже введенные им данные не будут утеряны. Вся суть проста:
<?
//это инициализация, если форма принята - получаем значение поля,
//иначе она будет пустой
$var = isset($_POST['var']) ? $_POST['var'] : "";
//далее идет проверка ввода, и мы проверяем эту переменную:
if ($var .... условие) {
//действия: успешно - запись, нет - устанавливаем ошибку, и возвращаем форму пользователю
}
|
А форму выводим по умочанию и ошибках ввода, используя в качестве значений для атрибутов value проинициализированную переменнную.
<input type="text" value="<? echo $var; ?>" />
|
Объяснить, что будет содержать поле формы в обеих случаях, или сами подумаете....? | |
|
|
|
|
|
|
|
для: sim5
(14.03.2009 в 20:32)
| | есть фотогалерея, надо вводить и редактировать изображение.
что бы не писать кучу форм, повторяющих друг друга, подумал, что можно использовать одну и ту же. как Вы выше сказали, данные то одни и те же.
при редактировании изображения я заполнил value формы данными из БД, вот так
<input type="text" name="name" value="<?php echo $test['name'] ?>">
|
но при выводе формы для добавления в БД записей о новом изображении вылазят notice.
форму я подключаю через include. поэтому я хотел узнать, будет ли уместно в файле с формой проверить существование переменной и если она не инициилизирована присвоить ей значение пустой строки. если присваивание пустой строки в последствии вызвало бы какие то проблемы, значит, я бы делал отдельную форму, вот и всё.
ну а если Вы пишите, что это можно делать, то тогда получается, что в форме я проверяю все переменные и если они не существуют - присваиваю им пустую строку и notice больше не беспокоят
объединять скрипты я пока отказался, они уже готовые и рабочие, не хочется их перекраивать.
поле формы из Вашего примера, как я понял,будет содержать значение переменной если она существует или пустое поле. | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.03.2009 в 21:43)
| | Если вы поняли, что предупреждения не возникает более не потому, что вы присвоили "пустое значение" переменной, а потому, что вы ее "объявили" перед тем как обратиться к ней, значит хорошо, если нет, то подумайте еще....
РНР для начинающих, видимо, через чур "демократичен", позволяя им допускать "небрежности", непонимание которых в дальнейшем могут привести к более серьезным ошибкам. Вы попробуйте в других языках допустить такую вольность - не получится. Там вы обязаны не только объявлять переменные перед использованием, но указывать и их типы, а если требуется, то еще и размер (а если не обязательно требуется, то часто желательно - экономия памяти).
Вы правильно поняли, что в обоих случаях будет иметь поле в качестве значения. Но то, что я написал выше, это не есть "обязательное правило", можно поступить иначе - проверять пришла ли форма, и если да, то в теле условия объявлять переменные, присваивать им значения и работать с ними. Если построить логику кода верно, то и в этом случае никаких предупреждений не будет. Просто инициализация переменных, затем проверка и обработка их при получении формы, а далее сам вывод формы, это, на мой взгляд, самый удобный в плане "читабельности" и в использовании код при работе с формой. | |
|
|
|
|
|
|
|
для: sim5
(15.03.2009 в 05:43)
| | >проверять пришла ли форма
единственное, что пришло на ум так это проверить наличие "submit" и если есть, тогда объявлять переменные.
<?php
if (isset($_POST['submit'])){
// объявляем переменные
}
?>
|
или можно ещё как то проверить пришла форма или нет? | |
|
|
|
|
|
|
|
для: Slo_Nik
(15.03.2009 в 10:10)
| | Если кнопка SUBMIT имеет имя 'submit', проверяйте. Можно проверять по любому известному имени поля формы. | |
|
|
|
|
|
|
|
для: sim5
(15.03.2009 в 10:35)
| | спасибо за советы, учту. | |
|
|
|
|