Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] php Комментарии (http://forum.oszone.net/showthread.php?t=111787)

Artem-Samsung 19-07-2008 02:25 855959

php Комментарии
 
Для комментариев создаю формочку и заношу с нее данные в БД.
PHP код:

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

Спасибо

Coutty 19-07-2008 08:47 856037

Цитата:

Цитата Artem-Samsung
1. Как реализовать простешние смайлики. »

Поиск и замена на выдаче. Либо перед внесением в БД.
Первый вариант лучше тем, то смайлики могут переехать в другую папку - не придётся лазить по БД и обновлять.
Второй лучше тем, что меньше нагрузка на процессор - один раз надо только делать замену.
Цитата:

Цитата Artem-Samsung
2. Как сделать так, что бы избежать тегов со стороны пользователя? »

$str = strip_tags($str);

Artem-Samsung 19-07-2008 21:36 856460

Цитата:

Цитата Coutty
Поиск и замена на выдаче. Либо перед внесением в БД. »

А как реализовать фишку, что на смайл нажимаешь, и он автоматом в формочке появляется без перезагрезки. javasrcipt?

Arrest 19-07-2008 21:54 856470

Artem-Samsung,
HTML код:

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

PHP код:

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 856496

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

Artem-Samsung 19-07-2008 22:47 856506

И как то набор смайлов в отдельном окне можно выводить?

Arrest 20-07-2008 00:59 856599

HTML код:

<a href="smilies.html" onClick="window.open('smilies.html', 'smilies_window');return false;">Еще смайлики</a>
smilies.html
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 856606

Извините пожалуйста, но вот в ходе возникло пару мелких вопрос. Гугл четких ответов не дает, а я знаю, что это не сложно и где то в книге встречал (только к книге доступа нету).

Вопрос1: Как сделать что бы когда переход с новой строки в формочке, то он заменялся не на проблем, а на <br />

Вопрос2 (посерьезней): Подтверждение регистрации. Я приблизительно прикинул, как это будет выглядесь и реализироваться. На е-мейл приходит ссылка, нажав которую авторизирует, но как сделать рандомный текст? Цифры знаю, а вот буквы?

Artem-Samsung 20-07-2008 01:37 856618

А так, в общем работает в тестовом режиме ;)
http://deykun.com/index.php?projects=6

Coutty 20-07-2008 08:14 856656

Цитата:

Цитата Artem-Samsung
Вопрос1: Как сделать что бы когда переход с новой строки в формочке, то он заменялся не на проблем, а на <br /> »

В php функция $str = nl2br($str);
Цитата:

Цитата Artem-Samsung
но как сделать рандомный текст? »

Разные есть способы. Например, один из простых - сначала генерируется случайное число, на основе которого md5-хэш, а после уже обрезается кусочек:
$text = substr(md5(rand()), 0, 6);

Другой способ - создаётся массив символов (/просто строка), несколько раз генерируется случайное число от 1 до 26 (для лат.алфавита) и производится выборка.
PHP код:

$alpha 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$captcha "";
for (
$i 0$i 6$i++)
  {
  
$captcha .= substr($alphaintval(rand(0strlen($alpha))), 1);
  }
echo 
$captcha

Уточните написание функций, но вроде бы всё так.

Artem-Samsung 20-07-2008 13:16 856755

Спасибо, еще мелкий вопрос:
Как выборкой сделать только последних 2 строки?
PHP код:

mysql_query ("SELECT `title` FROM `menu` ORDER BY id DESC"); 

Я же делаю приблизительно так:

PHP код:

$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 код:

<?php
do {
   
$my_row['title'];
   
$i++;
} while (
$i<2)
?>

Но оно просто дублирует последнюю строку. Правильно вот так: (по крайней мере только так умею)
PHP код:

<?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))
?>

Но в этом случае считает оно всю абсолютно таблицу перебирает.

Подскажите пожалуйста этот нюанс.

Arrest 20-07-2008 13:48 856780

Надо выбрать последние 2 записи и обратить их порядок.
PHP код:

mysql_query ("SELECT `title` FROM `menu` ORDER BY id ASC LIMIT 0 , 2;");
// а тут меняем местами, или делаем что угодно еще... 


Artem-Samsung 23-07-2008 16:22 859238

Подскажите пожалуйста, что неправильно?
Выборка делается правильно.

PHP код:

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


Coutty 23-07-2008 17:42 859307

Вот это непонятно: if (!isset($_SESSION['login_result']) | $_SESSION['login_result'] !== 'OK') {
Должно быть две вертикальные черты, если условие "или".

Artem-Samsung 23-07-2008 18:02 859325

Да, две черты. Поправил. Но вот все равно. Что то как по мне не работает.
www.deykun.com
Вам видно сейчас форму входа?
Только что вывел на экран значение SESSION['login_result']. Оно равно 'OK'.
Откуда ж оно взялось?
$_SESSION['login'] - пусто

Coutty 23-07-2008 19:10 859379

Нет, форму не видно.

Я вот как понимаю: пользователь вызывает скрипт без параметров. Т.е. $_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:
PHP код:

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 859398

Спасибо, ошибку понял. Сейчас пробую что то исправить.
Значит такая схема как бы категорически неправильная? Т.е. можно пройти под любым логином с пустым паролем? О_о


Вот, так исправил и вроде должно быть хорошо:

PHP код:

<?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'];} ?>

Прокоментируйте пожалуйста, так нормально или есть прокол, и как лучше сделать по другому....

Coutty 23-07-2008 19:55 859405

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 859409

Цитата:

Цитата Coutty
$pas['pas'] = trim($pas['pas']); - точно нужно обрезать? Впрочем, если нужно, значит пусть будет. »

Дело в том, что меня пугал тот факт, что реально с пустым полем ввода пароля, сессии присваивалось значение - "ОК".
Если просто проверять наличие поля пароля, то так не покатит. Так как если пустое поле, то создается $_POST, но с пустым значением. Я же решил делать проверку и на этот момент. А обрезал так - на всякий случай

Сейчас попробую создать ваторизацию для регистрации )


Время: 14:21.

Время: 14:21.
© OSzone.net 2001-