Показать полную графическую версию : [решено] php Комментарии
Artem-Samsung
19-07-2008, 02:25
Для комментариев создаю формочку и заношу с нее данные в БД.
mysql_query("INSERT INTO `".$pref."comments` (`message`, `date`, `category`, `chapter`, `member`) VALUES ('$_POST[input]', '$date', '".$_POST['keys']."', '".$_POST['values']."', '$_COOKIE[login]')");
Вообщем самый примитив. Начинаю только открывать для себя такой раздел и мне очень было бы полезно получить как можно больше информации в качестве советов и ссылок.
Подскажите пожалуйста на первые же возникшие вопросы:
1. Как реализовать простешние смайлики.
2. Как сделать так, что бы избежать тегов со стороны пользователя?
Да и что еще нужно знать для безопасности или функциональности.
Простейшая версия моих комментаривев к примеру здесь - http://deykun.com/?projects=4
Спасибо
1. Как реализовать простешние смайлики. »
Поиск и замена на выдаче. Либо перед внесением в БД.
Первый вариант лучше тем, то смайлики могут переехать в другую папку - не придётся лазить по БД и обновлять.
Второй лучше тем, что меньше нагрузка на процессор - один раз надо только делать замену.
2. Как сделать так, что бы избежать тегов со стороны пользователя? »
$str = strip_tags($str);
Artem-Samsung
19-07-2008, 21:36
Поиск и замена на выдаче. Либо перед внесением в БД. »
А как реализовать фишку, что на смайл нажимаешь, и он автоматом в формочке появляется без перезагрезки. javasrcipt?
Artem-Samsung,
<script language="JavaScript">
function pasteSmile(code){
textarea = document.getElementById("form_textarea");
textarea.value = textarea.value + code;
return false;
}
</script>
...
<img src="smile1.gif" onClick="pasteSmile(':smile1:')" />
<img src="smile2.gif" onClick="pasteSmile(':smile2:')" />
...
<textarea name="form_textarea"></textarea>
str_replace(":smile1:", '<img src="smile1.gif" />', $_GET['form_textarea']);
str_replace(":smile2:", '<img src="smile2.gif" />', $_GET['form_textarea']);
Artem-Samsung
19-07-2008, 22:27
Ухты... Это оно, спасибо за исчерпывающий ответ
А где можно еще такие фокусы почитать? Ну как там формочку с выделением текста и подчеркивания сделать?
Artem-Samsung
19-07-2008, 22:47
И как то набор смайлов в отдельном окне можно выводить?
<a href="smilies.html" onClick="window.open('smilies.html', 'smilies_window');return false;">Еще смайлики</a>
smilies.html
<script language="JavaScript">
function pasteSmile(code){
textarea = opener.document.getElementById("form_textarea");
textarea.value = textarea.value + code;
return false;
}
</script>
<img src="smile1.gif" onClick="pasteSmile(':smile1:')" />
<img src="smile2.gif" onClick="pasteSmile(':smile2:')" />
Artem-Samsung
20-07-2008, 01:17
Извините пожалуйста, но вот в ходе возникло пару мелких вопрос. Гугл четких ответов не дает, а я знаю, что это не сложно и где то в книге встречал (только к книге доступа нету).
Вопрос1: Как сделать что бы когда переход с новой строки в формочке, то он заменялся не на проблем, а на <br />
Вопрос2 (посерьезней): Подтверждение регистрации. Я приблизительно прикинул, как это будет выглядесь и реализироваться. На е-мейл приходит ссылка, нажав которую авторизирует, но как сделать рандомный текст? Цифры знаю, а вот буквы?
Artem-Samsung
20-07-2008, 01:37
А так, в общем работает в тестовом режиме ;)
http://deykun.com/index.php?projects=6
Вопрос1: Как сделать что бы когда переход с новой строки в формочке, то он заменялся не на проблем, а на <br /> »
В php функция $str = nl2br($str);
но как сделать рандомный текст? »
Разные есть способы. Например, один из простых - сначала генерируется случайное число, на основе которого md5-хэш, а после уже обрезается кусочек:
$text = substr(md5(rand()), 0, 6);
Другой способ - создаётся массив символов (/просто строка), несколько раз генерируется случайное число от 1 до 26 (для лат.алфавита) и производится выборка.
$alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$captcha = "";
for ($i = 0; $i < 6; $i++)
{
$captcha .= substr($alpha, intval(rand(0, strlen($alpha))), 1);
}
echo $captcha;
Уточните написание функций, но вроде бы всё так.
Artem-Samsung
20-07-2008, 13:16
Спасибо, еще мелкий вопрос:
Как выборкой сделать только последних 2 строки?
mysql_query ("SELECT `title` FROM `menu` ORDER BY id DESC");
Я же делаю приблизительно так:
$sql_rowcount = mysql_query ("SELECT `title` FROM `menu` ORDER BY id DESC");;
$rowcount = mysql_num_rows($sql_rowcount);
$rowcount2 = $rowcount - 3;
mysql_query ("SELECT `title` FROM `menu` WHERE sort <= '$rowcount' AND sort >= '$rowcount2' ORDER BY id DESC")
Но здесь много кода получается, не считая еще дополнительного поля в таблице.
Да и я думал, что так будет получаться:
<?php
do {
$my_row['title'];
$i++;
} while ($i<2)
?>
Но оно просто дублирует последнюю строку. Правильно вот так: (по крайней мере только так умею)
<?php
$result = mysql_query ("SELECT `title` FROM `menu` ORDER BY id DESC");
$my_row = mysql_fetch_array($result);
do {
$my_row['title'];
$i++;
} while ($my_row = mysql_fetch_array($result))
?>
Но в этом случае считает оно всю абсолютно таблицу перебирает.
Подскажите пожалуйста этот нюанс.
Надо выбрать последние 2 записи и обратить их порядок.
mysql_query ("SELECT `title` FROM `menu` ORDER BY id ASC LIMIT 0 , 2;");
// а тут меняем местами, или делаем что угодно еще...
Artem-Samsung
23-07-2008, 16:22
Подскажите пожалуйста, что неправильно?
Выборка делается правильно.
<?php
$result = mysql_query("SELECT `pas` FROM `".$pref."reg` WHERE login = '$_POST[login]'");
$pas = mysql_fetch_array($result);
if($_POST['password'] == $pas['pas'])
{
$_SESSION['login_result'] = 'OK';
$_SESSION['login'] = $_POST['login'];
}
if (!isset($_SESSION['login_result']) | $_SESSION['login_result'] !== 'OK') {
?>
<div id="reg">
<form id="form1" method="post" action="">
<p>Логін:</p>
<p><input type="text" name="login" id="login" /></p>
<p>Пароль:</p>
<p><input type="password" name="pas" id="pas" /></p>
<p><input type="submit" name="button" id="button" value="Увійти" /></p>
<p><a href="?simple=registration">Зареєструватися</a></p>
</form>
</div>
<?php } ?>
Вот это непонятно: if (!isset($_SESSION['login_result']) | $_SESSION['login_result'] !== 'OK') {
Должно быть две вертикальные черты, если условие "или".
Artem-Samsung
23-07-2008, 18:02
Да, две черты. Поправил. Но вот все равно. Что то как по мне не работает.
www.deykun.com
Вам видно сейчас форму входа?
Только что вывел на экран значение SESSION['login_result']. Оно равно 'OK'.
Откуда ж оно взялось?
$_SESSION['login'] - пусто
Нет, форму не видно.
Я вот как понимаю: пользователь вызывает скрипт без параметров. Т.е. $_POST пустая. Правильно? Далее, скрипт делает запрос к БД ("SELECT `pas` FROM `".$pref."reg` WHERE login = '$_POST[login]'"). После чего результат парсится в переменную $pas. Но т.к. $_POST[login] пустая, значит и СУБД возвращает пустую строку. В $pas попадает ничего.
Дальше по скрипту: сравнивается значение $pas['pas'], которая пустая и $_POST['password'], которая тоже не установлена. И они равны, разумеется - обе пустые.
Тогда выполняется присваивание $_SESSION['login_result'] = 'OK' (ведь правильно присвоилось?) и $_SESSION['login'] = $_POST['login']. Но $_POST['login'] не существует, поэтому эта переменная в сессии будет пустой.
Предлагаю вначале добавить проверку на наличие $_POST:
if ($_POST['login'] && $_POST['password'])
{
$result = mysql_query("SELECT `pas` FROM `".$pref."reg` WHERE login = '$_POST[login]'");
$pas = mysql_fetch_array($result);
if($_POST['password'] == $pas['pas'])
{
$_SESSION['login_result'] = 'OK';
$_SESSION['login'] = $_POST['login'];
}
}
Тогда он не будет делать запрос к БД, если его делать не надо.
Artem-Samsung
23-07-2008, 19:42
Спасибо, ошибку понял. Сейчас пробую что то исправить.
Значит такая схема как бы категорически неправильная? Т.е. можно пройти под любым логином с пустым паролем? О_о
Вот, так исправил и вроде должно быть хорошо:
<?php
if (isset($_POST['login']) && isset($_POST['pas']))
{
$result = mysql_query("SELECT `pas` FROM `".$pref."reg` WHERE login = '$_POST[login]'");
$pas = mysql_fetch_array($result);
$pas['pas'] = trim($pas['pas']);
if($_POST['pas'] == $pas['pas'] && $pas['pas'] != "")
{
$_SESSION['login_result'] = 'OK';
$_SESSION['login'] = $_POST['login'];
}
}
if (!isset($_SESSION['login_result']) || $_SESSION['login_result'] !== 'OK') {
?>
<div id="reg">
<form id="form1" method="post" action="">
<p>Логін:</p>
<p><input type="text" name="login" id="login" /></p>
<p>Пароль:</p>
<p><input type="password" name="pas" id="pas" /></p>
<p><input type="submit" name="button" id="button" value="Увійти" /></p>
<p><a href="?simple=registration">Зареєструватися</a></p>
</form>
</div>
<?php } else {echo "Вітаю, Ви зайшли під логіном:".$_SESSION['login'];} ?>
Прокоментируйте пожалуйста, так нормально или есть прокол, и как лучше сделать по другому....
if (isset($_POST['login']) && isset($_POST['pas'])) - не обязательно писать isset. Хотя и не помешает.
$pas = mysql_fetch_array($result); - тут я не помню, разве не mysql_fetch_assoc создаёт ассоциативный массив? ..._array возвращает массив, наверное, просто нумерованный.
$pas['pas'] = trim($pas['pas']); - точно нужно обрезать? Впрочем, если нужно, значит пусть будет.
Так вроде всё нормально. Хотя с сессиями я ни разу не работал, т.ч. толком не знаю, откуда они берутся и как всё это происходить должно.
Artem-Samsung
23-07-2008, 20:05
$pas['pas'] = trim($pas['pas']); - точно нужно обрезать? Впрочем, если нужно, значит пусть будет. »
Дело в том, что меня пугал тот факт, что реально с пустым полем ввода пароля, сессии присваивалось значение - "ОК".
Если просто проверять наличие поля пароля, то так не покатит. Так как если пустое поле, то создается $_POST, но с пустым значением. Я же решил делать проверку и на этот момент. А обрезал так - на всякий случай
Сейчас попробую создать ваторизацию для регистрации )
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.